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