0

現在のタブのWebページからデータを取得するFirefox拡張機能を開発しています。ユーザーがオーバーレイツールバーボタンをクリックすると、スクリプトがWebページに読み込まれます。このボタンは、処理を実行し、Webページから情報を取得します。その情報をポップアップウィンドウに表示したい。

次のAPIを使用してスクリプトをロードしています。

var loader = Components.classes[ "@mozilla.org/moz/jssubscript-loader;1" ].getService( Components.interfaces.mozIJSSubScriptLoader );
loader.loadSubScript("chrome://dynamonote/content/contentscript.js");

contentscript.jsで作成したオブジェクトを送信し、ユーザーがツールバーアイコンをクリックしたときに表示されるpopup.htmlに表示する必要があります。

コードを実行すると、gBrowser isnotdefinedエラーが発生します。私が使用しているコードの詳細を以下に示します。

オーバーレイのonCommandで、次の関数を呼び出しています。

var Popup = {
    showPopup: function() {
        window.open("chrome://dynamonote/content/popup.html", "dynamonote", "chrome");
    }
};

ポップアップウィンドウが表示されます。ページの読み込み時に呼び出されるpopup.htmlのinit関数で、次のコードを実行しています。

        function loadContentScript() {
            Components.utils.reportError("loadContentScript() called");
            gBrowser.selectedBrowser.messageManager.loadFrameScript("chrome://dynamonote/content/contentscript.js", true);
            gBrowser.selectedBrowser.messageManager.addMessageListener("foomessage", onMessage);
            Components.utils.reportError("loadContentScript() executed");
        }

次のコードがcontentscript.jsファイルで実行されます。

(function() {
    Components.utils.reportError("-- content script -- ");
    var doc = content.document;

    //Do something here

    var data = {
        "time": new Date().toLocaleString()
    };
    Components.utils.reportError("-- content script -- found something");
        sendSyncMessage("foomessage", onMessage(data));
})();

これを手伝ってください。

4

1 に答える 1

1

従来のFirefox拡張機能でコンテンツスクリプトが必要な場合mozIJSSubScriptLoaderは、間違ったツールです。「コンテンツスクリプト」は高度な権限を保持し、セキュリティの問題を引き起こす可能性があります。代わりにメッセージマネージャを使用することもできます(プロセス分離についての話は無視してください。デスクトップFirefoxには関係ありません)。したがって、現在選択されているタブにスクリプトをロードするには、次のコードを使用します。

gBrowser.selectedBrowser.messageManager
        .loadFrameScript("chrome://dynamonote/content/contentscript.js", true);
gBrowser.selectedBrowser.messageManager.addMessageListener("foomessage", onMessage);

function onMessage(obj)
{
  alert("Received object from content script: " + obj.toSource());
}

メッセージリスナーが不要になったら、そのメッセージリスナーを削除する必要があることに注意してください。また、メッセージを送り返すには、コンテンツスクリプトは次のようなコードを使用します。

sendAsyncMessage("foomessage", obj);
于 2012-04-19T19:56:32.797 に答える