2

私のChrome拡張機能は、「コンテンツスクリプト」と「ポップアップ」ページの間でメッセージを渡すために、長期間有効な「ポート」オブジェクトを使用します。「ポップアップ」は、「コンテンツスクリプト」イベントリスナーにメッセージを送信できます。ただし、「コンテンツスクリプト」の「ポート」オブジェクトは「ポップアップ」ページにメッセージを送信できません。

var port = chrome.extension.connect({"name":"swap"});

// listener for incoming connections
chrome.extension.onConnect.addListener(function( incomingPort ){

    // listener on incoming messages
    incomingPort.onMessage.addListener(function( msg ){

        if( msg.command === 'get_scripts' ){
            //do work

        }

        var scrs = { 'scripts' : 'name' };
        var result = port.postMessage( scrs );

    });
});

'port.postMessage(Object obj)'を実行すると、プラグインは次のエラーをスローします。

Error in event handler for 'undefined': Attempting to use a disconnected port object   Error: Attempting to use a disconnected port object
at PortImpl.postMessage (miscellaneous_bindings:54:5)
at chrome-extension://loiamkgdhfjdlkcpehnebipeinpcicfj/swap.js:27:31
at [object Object].dispatch (event_bindings:203:41)
at Object.<anonymous> (miscellaneous_bindings:250:22) event_bindings:207

'Port'オブジェクトと'incomingPort'オブジェクトを使用してみましたが、どちらも同じ'Error'をスローします。事前に作成された「Port」オブジェクトのスコープに関係しているように感じます。

プラグインコードは、このgitリポジトリhttps://github.com/snambi/chrome_plugin/tree/master/src/chromeで入手できます。

このプラグインの何が問題になっていますか?

4

1 に答える 1

8

私はあなたのコードを調べましたが、それは私には意味がありません:

  • ポートの両側にonMessageandメソッドがあることをご存知ですか?postMessage双方向で通信するには、1つのポートで十分です。
  • あなたのやり方でポップアップとコンテンツスクリプトの間で通信することはひどく難しいでしょう。コンテンツスクリプトとポップアップを同時に起動するのは困難です。

拡張機能にはバックグラウンドページがなく、比較的役に立たないコンテンツスクリプトがあるため、拡張機能のコアはブラウザアクションのポップアップウィンドウであると思います。デフォルトでコンテンツスクリプトを挿入する代わりに、次のフローを使用することもできます。

  1. ユーザーがブラウザのアクションをクリックする
  2. popup.htmlpopup.js実行されます。

port == nullまた、ポートが有効かどうかを確認するために使用していることも確認しました。その場合は、ポートが切断されたときに変数を無効にして、比較が適切であることを確認してください。

var port;
chrome.runtime.onConnect.addListener(function(_port) {
    // ...optional validation of port.name...

    port = _port;
    port.onMessage.addListener(function(message) { /* .. logic .. */});
    port.onDisconnect.addListener(function() {
        port = null;
    });
});
于 2012-08-02T20:55:34.723 に答える