Javascript Firefox扩展中的ContentScript,不使用附加SDK
有没有一种简单的方法可以在不使用附加SDK和PageMod的情况下为简单的内容脚本创建Firefox扩展?安装Python和SDK,学习如何使用SDK和API,添加不必要的膨胀层和抽象层,只是为了执行一个简单的内容脚本,这看起来真是太麻烦了 我已经尝试使用XUL浏览器覆盖并在那里注入脚本,但是将所有内容都注入到Javascript Firefox扩展中的ContentScript,不使用附加SDK,javascript,firefox,firefox-addon,content-script,Javascript,Firefox,Firefox Addon,Content Script,有没有一种简单的方法可以在不使用附加SDK和PageMod的情况下为简单的内容脚本创建Firefox扩展?安装Python和SDK,学习如何使用SDK和API,添加不必要的膨胀层和抽象层,只是为了执行一个简单的内容脚本,这看起来真是太麻烦了 我已经尝试使用XUL浏览器覆盖并在那里注入脚本,但是将所有内容都注入到浏览器中。XUL上下文而不是文档。body也增加了很多复杂性 那么,在html文档而不是XUL文档中插入一些脚本和css文件的最简单、轻量级的方法是什么呢?您的问题的边界线太宽,因此我不会
浏览器中。XUL
上下文而不是文档。body
也增加了很多复杂性
那么,在html文档而不是XUL文档中插入一些脚本和css文件的最简单、轻量级的方法是什么呢?您的问题的边界线太宽,因此我不会详细讨论所有问题,而是给出一个总体概述 Easy可能言过其实,但SDK内容脚本(实际上也是模块)、Greasemonkey/Scriptish以及其他类似于内容脚本的内容在内部使用。即使是无重启加载项中的
bootstrap.js
,也会在沙箱中执行
基本思路如下:
组件
)脚本则使用系统主体沙盒
evalInSandbox
或执行脚本// 1. get the content window, e.g. the currently selected tab window
var contentWindow = gBrowser.contentWindow;
// 2. Choose the principal, e.g. just use the content window again
var principal = contentWindow;
// 3. We want XRay wrappers, to keep our content script and the actual
// page scripts in their own corners.
var wantXrays = true;
// 4. Our prototype will be the window
var sbProto = contentWindow;
// 5. Putting it all together to create a sandbox
var sandbox = Cu.Sandbox(principal, {
sandboxPrototype: sbProto,
wantXrays: wantXrays
});
// 6. Adding a random helper function (e.g.)
sandbox.getRandomInt = function (min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
};
// 7. Execute some content script, aka. the stupid example.
try {
var execute = function() {
var demo1 = document.querySelector('title').textContent;
var demo2 = getRandomInt(1, 1000);
alert(demo1 + " " + demo2);
}
Cu.evalInSandbox(
"(" + execute.toSource() + ")()",
sandbox
);
} catch(ex) {
console.error(ex);
}
PS:这个示例将在一个文件中逐字运行
关于风格:
做SDK做的事情,我想,这是简化的:
var wu = contentWindow.QueryInterface(Ci.nsIInterfaceRequestor).
getInterface(Ci.nsIDOMWindowUtils);
var uri = Services.io.newURI(
"chrome://myaddon/style/content-style.css",
null,
null);
wu.loadSheet(uri, wu.USER_SHEET);
谢谢,这帮了大忙。你能提供更多关于装载单方法的信息吗?在文档中找到一些东西是如此痛苦。。。我找不到任何东西,在第一次加载文档后,loadSheet给了我垃圾:组件返回失败代码:0x80070057(NS\u错误\u非法\u值)[nsIDOMWindowUtils.loadSheet]。没关系,我在错误的窗口加载了工作表。。。啊!如果我能找到文档,那就太好了:)用你的沙盒示例,我只需要在XUL中加载脚本,对吗?SDK通过
contentScriptFile
加载它们,但XUL只会使用常规的script
标记。