仅使用 Firefox Addon SDK 在后台嵌入 NPAPI 插件

Posted

技术标签:

【中文标题】仅使用 Firefox Addon SDK 在后台嵌入 NPAPI 插件【英文标题】:Embedding NPAPI plugin in background using just Firefox Addon SDK 【发布时间】:2012-07-20 06:17:02 【问题描述】:

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

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

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

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


编辑:我已经创建了这个问题的答案,并使用 page-workers 解决了这个问题。

【问题讨论】:

【参考方案1】:

你会想看看 page-worker 模块:

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

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

【讨论】:

page-worker 模块允许我打开后台页面并使用 port.emit、port.on,可以在插件和后台页面之间传递消息。然而,这需要记住请求以便在 port.on() 时提供正确的响应 嗯,这就是 SDK 中的消息传递系统的工作原理。 事实证明,使用插件(即访问成员方法),我需要使用unsafeWindow,否则代理会拒绝访问插件。我会相应地更新我的解决方案【参考方案2】:

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

注意:此解决方案需要 addon-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"  >
            <param name="onload" value="pluginLoaded" />
        </object>
    </body>
</html>

数据/background.js var 模块 = 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);

【讨论】:

以上是关于仅使用 Firefox Addon SDK 在后台嵌入 NPAPI 插件的主要内容,如果未能解决你的问题,请参考以下文章

已经在firefox上装了Adblock Plus还要装Adblock Plus Pop-up Addon 、

如何修复服务器状态代码:SQL Inject Me Firefox Addon 发现的 302

The best manual of how to use "The easiest Xdebug" addon for Firefox

“未安装以下 SDK 组件:sys-img-x86-addon-google_apis-google-22 和 addon-google_apis-google-22”

火狐浏览器扩展

firefox工具