Встраивание плагина 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);
Другие вопросы по тегам