1

私は最近、Google Chrome拡張機能と組み合わせて(FireBreathを使用して)NPAPIプラグインを開発しました。background.htmlページを使用してプラグインを埋め込み、 複数の拡張ページからプラグインにアクセスしています。したがって、プラグインはバックグラウンドページにロードされたままになります(拡張機能がアンロードされるか、ブラウザが閉じられるまで)。

私は今、この拡張機能をFirefoxに移植する最も簡単な方法を探しています。アドオンSDKとそのAPIを使用して、アドオンコードとHTMLユーザーインターフェイス間の通信を再現できます。

Chrome拡張機能のようなグローバルバックグラウンドDOMはないので、アプリUIのすべてのページに挿入せずに、NPAPIプラグインを1回だけロードするにはどうすればよいですか?

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が提案したようにページ ワーカーを使用して、問題に対する最小限の実用的なソリューションを提供します。

注:このソリューションでは、アドオン sdkunsafeWindowがプラグイン メンバー メソッドにアクセスする必要があります。それに依存しないより良い解決策がある場合は、お気軽にメモ/コメントを送ってください。

data/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 モジュール = 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 に答える