【发布时间】:2012-02-09 18:55:07
【问题描述】:
当我使用 Add-on SDK 编写 Firefox 插件时,我注意到插件代码和内容脚本代码会阻止彼此的执行。此外,附加代码似乎甚至阻止了与其他 Firefox 窗口(不仅仅是选项卡)的交互。
Firefox 插件的并发/进程模型是什么?
是否可以同时运行附加代码和内容脚本代码而无需协作多线程(例如计时器)?
插件代码加载了多少次?每个窗口一次?每个标签一次?一次?
documentation 声明:
Mozilla 平台正在朝着它使用的模型迈进 用于显示 UI、处理 Web 内容和执行的单独进程 附加组件。主插件代码将在插件进程中运行,并将 无法直接访问任何网页内容。
所以我希望将来它们确实是独立的进程,不会相互干扰,但现在似乎并非如此。
更新:
我已经尝试使用附加代码中的页面工作者,但不幸的是,它仍然会阻止内容脚本(以及所有其他 javascript)。我也尝试在 page-worker 中使用 web worker,但是在调用 web worker 的 postMessage 函数时出现以下错误。
TypeError: worker.postMessage 不是函数
我还尝试在 page-worker 中创建一个 iframe,然后在 iframe 中创建一个 web worker,但不幸的是我无法使用 page-worker 中的 window.addEventListener。我收到以下错误:
TypeError: window.addEventMessage 不是函数
最后,我尝试将脚本(通过 script 元素)注入到 page-worker 页面中,以创建一个似乎可以工作的 web worker。不幸的是,我无法与这个网络工作者交流,因为我只能通过 document.defaultView.postMessage 向它发送消息。
哦,我正在编织的纠结的网......
content-script -> add-on -> page-worker -> iframe -> web worker -> 我的代码
我举了一个简单的例子:
package.json
{
"name": "test",
"author": "me",
"version": "0.1",
"fullName": "My Test Extension",
"homepage": "http://example.com",
"id": "jid1-FmgBxScAABzB2g",
"description": "My test extension"
}
lib/main.js
var data = require("self").data;
var pageMod = require("page-mod");
pageMod.PageMod({
include: ["http://*", "https://*"],
contentScriptWhen: "start",
contentScriptFile: [data.url("content.js")],
onAttach: function (worker) {
worker.port.on("message", function (data) {
// simulate an expensive operation with a busy loop
var start = new Date();
while (new Date() - start < data.time);
worker.port.emit("message", { text: 'done!' });
});
}
});
data/content.js
self.port.on("message", function (response) {
alert(response.text);
});
// call a very expensive operation in the add-on code
self.port.emit("message", { time: 10000 });
【问题讨论】:
标签: firefox-addon firefox-addon-sdk