Встраивание плагина NPAPI в фоновый режим с использованием только Firefox Addon SDK
Недавно я разработал плагин NPAPI (с использованием FireBreath) в сочетании с расширением Google Chrome. Я встраиваю плагин с помощью страницы background.html и получаю к нему доступ с нескольких страниц расширения. Таким образом, плагин остается загруженным на фоновой странице (до тех пор, пока расширение не будет выгружено или браузер не будет закрыт).
Сейчас я ищу самый простой способ перенести это расширение в Firefox. Используя Addon SDK и его API, я могу воспроизвести связь между кодом дополнения и пользовательским интерфейсом HTML.
Поскольку такого глобального фонового DOM, как в расширении Chrome, не существует, как мне загрузить плагин NPAPI только один раз, не вставляя его на каждую страницу пользовательского интерфейса приложения?
Я видел, что использование наложения XUL позволило бы - есть ли способ использовать только аддон SDK?
Редактировать: я создал ответ на этот вопрос с минимальным решением этой проблемы с использованием Page-работников.
2 ответа
Вы захотите взглянуть на модуль работника страницы:
https://addons.mozilla.org/en-US/developers/docs/sdk/1.8/packages/addon-kit/page-worker.html
Предостережение, которое я хотел бы дать, заключается в том, что плагин NPAPI мог делать предположения о видимости или других деталях среды, в которой он работает, которые просто не применимы в среде работника страницы. Если вы столкнетесь с ошибками, мне было бы интересно их услышать!
Следующий код обеспечивает минимальное рабочее решение проблемы с использованием рабочих страниц, как и предложил canuckistani.
Примечание: это решение требует аддон-SDK unsafeWindow
чтобы получить доступ к методам члена плагина. Если есть лучшее решение, которое не зависит от этого, не стесняйтесь отправить мне заметку / комментарий.
Данные / background.html
<html>
<head>
<script type="text/javascript" charset="utf-8">
function pluginLoaded() {
// Create an event once plugin is loaded
// This allows the contentscript to detect plugin state
var evt = document.createEvent("CustomEvent");
evt.initCustomEvent("pluginLoaded", true, false, null);
window.dispatchEvent(evt);
}
</script>
</head>
<body>
<object id="myplugin" type="application/x-myplugin" width="0" height="0">
<param name="onload" value="pluginLoaded" />
</object>
</body>
</html>
data / background.js var module = null;
window.addEventListener("pluginLoaded", function( event ) {
// set the module through unsafeWindow
module = unsafeWindow.document.getElementById("myplugin");
module = XPCNativeWrapper.unwrap(module);
self.port.emit("pluginLoaded");
});
// Handle incoming requests to the plugin
self.port.on("pluginCall", function(msg) {
var response;
if (module) {
// Call NPAPI-plugin member method
response = module[msg.method].apply(this, msg.args);
} else {
response = {error: true, error_msg: "Module not loaded!"};
}
self.port.emit("pluginResponse", {data: response});
});
main.js
// Create background page that loads NPAPI plugin
var plugin = require("page-worker").Page({
contentURL: data.url("background.html"),
contentScriptFile: data.url("background.js"),
contentScriptWhen: "ready"
});
// Send request to plugin
plugin.port.emit("pluginCall", message);