1

我最近结合 Google Chrome 扩展开发了一个 NPAPI 插件(使用 FireBreath)。我正在使用 background.html页面嵌入插件并从多个扩展页面访问它。因此,插件保持加载在后台页面中(直到卸载扩展或关闭浏览器)。

我现在正在寻找将此扩展移植到 Firefox 的最简单方法。使用插件 SDK 和它的 API,我可以重现插件代码和 HTML 用户界面之间的通信。

由于没有像 Chrome 扩展中那样的全局背景 DOM,我如何只加载一次 NPAPI 插件,而不将它插入到应用程序 UI 的每个页面中?

我已经看到使用XUL 覆盖可以做到这一点 - 有没有办法只使用插件 sdk?


编辑:我已经使用页面工作者为这个问题提供了一个最小的解决方案。

4

2 回答 2

3

您需要查看 page-worker 模块:

https://addons.mozilla.org/en-US/developers/docs/sdk/1.8/packages/addon-kit/page-worker.html

我要警告的是,NPAPI 插件可能已经对它运行的环境的可见性或其他细节做出了假设,这些细节根本不适用于页面工作环境。如果您遇到错误,我很想听听!

于 2012-07-20T23:05:32.813 回答
0

以下代码提供了使用页面工作者的问题的最小工作解决方案,如canuckistani建议的那样。

注意:此解决方案需要 addon-sdkunsafeWindow才能访问插件成员方法。如果有更好的解决方案不依赖于此,请随时给我发送注释/评论。

数据/背景.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>

数据/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);
于 2012-08-10T08:13:21.473 回答