Когда я писал надстройку Firefox, используя Add-on SDK , я заметил, что код надстройки и код сценария содержимого блокируют выполнение друг друга.Более того, код надстройки, кажется, даже блокирует взаимодействие с другими окнами Firefox (не только с вкладками).
Что такое модель параллелизма / процесса надстроек Firefox?
Можно ли запускать код дополнения и код сценария контента одновременно без совместной многопоточности (по таймеру)?
Сколько раз это дополнениекод загружен?Один раз за окно?Один раз за вкладку?Однажды?
Документация гласит:
Платформа Mozilla движется к модели, в которой используются отдельные процессы для отображения пользовательского интерфейса.веб-контент и выполнять дополнения.Основной код надстройки будет выполняться в процессе надстройки и не будет иметь прямого доступа к любому веб-контенту.
Поэтому я надеюсь, что в будущем это действительно отдельные процессы, которые не будутмешать друг другу, но сейчас это, похоже, не так.
Обновление:
Я пытался использовать страницу работника издополнительный код, но, к сожалению, он по-прежнему блокирует скрипт контента (как и все другие JavaScript).Я также пытался использовать веб-работника в Page-работнике, но я получаю следующую ошибку при вызове функции postMessage веб-работника.
TypeError: worker.postMessage не является функцией
Я также пытался создать iframe на странице-работнике, а затем создать веб-работника в iframe, но, к сожалению, я не могу использовать window.addEventListener из page-worker.Я получаю следующую ошибку:
TypeError: window.addEventMessage не является функцией
Наконец, я попытался внедрить скрипт (через элемент script) в рабочий листстраница для создания веб-работника, который, кажется, работает.К сожалению, я не могу общаться с этим веб-работником, потому что я могу только отправлять ему сообщения через document.defaultView.postMessage.
О переплетенных сетях, которые я ткаю ...
content-script -> дополнение -> 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 });