gpt4 book ai didi

javascript - 不使用附加 SDK 的 Firefox 扩展中的 ContentScript

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:33:44 27 4
gpt4 key购买 nike

有没有一种简单的方法可以在不使用附加 SDK 和 PageMod 的情况下为简单的内容脚本创建 Firefox 扩展?经历安装 Python 和 SDK 的麻烦,学习如何使用 SDK 和 API,并添加不必要的膨胀和抽象层,只是为了执行一个简单的内容脚本,这似乎真的有点过分了。

我已经尝试过使用 XUL 浏览器覆盖并在那里注入(inject)脚本,但是将所有内容注入(inject)到 browser.xul 上下文而不是 document.body 中也会添加一个很多复杂...

那么在 html 文档而不是 XUL 文档中注入(inject)一些脚本和 css 文件的最简单、轻量级的方法是什么?

最佳答案

您的提问范围太广,所以我不会详细讨论所有内容,而是给出一个总体概述。

简单可能有点言过其实,但 SDK 内容脚本(实际上还有模块)、Greasemonkey/Scriptish 和其他任何类似于内容脚本的东西都使用 Sandbox在内部。甚至无需重新启动的附加组件中的 bootstrap.js 也是在沙箱中执行的。

基本思路如下:

  1. 获取对您要附加的内容窗口的引用。
  2. 选择脚本应在其下运行的“主体”。主体本质上是也定义相同来源的安全上下文/策略。非特权内容脚本通常会使用内容窗口本身(这也是主体),而特权脚本(chrome 访问 Components)脚本会使用系统主体。
  3. 如果您需要 XRay 包装器,请选择。文档会告诉您更多相关信息。
  4. 选择 Sandbox 原型(prototype)(“全局”或顶​​级原型(prototype))。通常对于内容脚本内容,您会选择内容窗口。
  5. 创建沙盒
  6. 将您的内容脚本可能需要的任何东西添加到沙盒中。
  7. 通过 evalInSandboxsubscript loader 执行脚本.

这是一个有限的示例,将非特权内容脚本添加到窗口:

// 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:该示例将在 Scratchpad with Environment/Browser 中逐字运行.

关于样式:

做 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);

关于javascript - 不使用附加 SDK 的 Firefox 扩展中的 ContentScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24202175/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com