我正在写一些我想作为 chrome 扩展和 firefox 附加组件发布的东西。
chrome 扩展已经在 github 上可用。我使用类似于 requirejs 使用的模块加载格式将我的代码分解为几个模块;我这样做是为了将特定于 chrome 的部分与我希望在 Firefox 附加组件中重复使用的部分分开。
具体来说,我不仅拆分了后端工作,还拆分了内容脚本。
在 chrome 中,当我的内容脚本需要加载另一个模块时,它会向后台页面发送一条消息,说“请加载这个模块”;然后后台页面上的脚本执行以下操作:
function onLoadLibrary(request, sender, sendResponse) {
var allFrames = request.allFrames || false;
chrome.tabs.executeScript(
sender.tab.id, {file: request.library.toLowerCase() + '.js',
allFrames: allFrames},
function () {
sendResponse({});
});
return true;
}
也就是说,我能够将额外的 javascript 加载到与请求该代码的内容脚本相同的沙箱中。这是使模块依赖项工作所必需的。
在Firefox中,我无法弄清楚如何做到这一点。我将通过s 并通过pageMod
调用. 这看起来很简单,但是如果该内容脚本需要加载更多代码,我将不知道该怎么做。tab.attach
tabs
似乎没有办法从main.js
文件访问我的内容脚本正在运行的沙箱,以便我可以向其中注入更多代码。即使我以某种方式保留了对相关tab
实例的引用(无论如何只能让我注入顶部框架),似乎每个新调用都tab.attach
将注入的代码放入一个新的沙箱中。传递给我的就绪事件句柄的对象tab
不是我可以传递给的真正的 XUL 选项卡require("tabs/util").getBrowserForTab
;如果是这样,那么我认为我可以通过足够多的 sdk 代码来创建自己的沙箱,尽管我担心会留下意外的内存泄漏。
我考虑通过“eval-this-code”消息将代码传递回内容脚本,但出于安全考虑,我真的不想eval
在我的扩展中使用;我还担心使用eval
会使我的 Firefox 附加组件难以获得AMO的批准。(另外,当我的附加组件在具有内容安全策略的站点上运行时,它会如何交互?)
定义附加 API的用法traits
似乎关闭了对对象的访问,因此我无法进入 aWorker
以获取对我的内容脚本正在其中执行的沙箱的引用。此时,我似乎会需要在我的附加组件中包含几乎完整的 sdk 副本,以便在WorkerSandbox
.
注意:我使用的是 Add-On sdk(该项目以前称为 JetPack)。Components.utils.import
如果有人能告诉我如何从附加组件 SDK 管理的内容脚本中使用它,我愿意使用。