0

バックグラウンド プロセスとコンテンツ スクリプトの間のメッセージ処理の一部を拡張しようとしています。通常、バックグラウンド プロセスは postMessage() を介してメッセージを送信し、コンテンツ スクリプトは別のチャネルを介して応答を返します。ただし、コンテンツ スクリプトがページ上で有効なものを見つけられない場合は、バックグラウンド プロセスを拡張して別のものにフォールバックしたいと考えています。これを見て、空白ページまたはシステム ページにメッセージを送信するときに問題があることを発見しました。タブにはコンテンツ スクリプトが読み込まれていないため、投稿されたメッセージを受け取るものは何もありません。これにより、コンソール ログに警告が生成されますが、それ以外の影響はありません。でも:

// Called when the user clicks on the browser action.
//
// When clicked we send a message to the current active tab's
// content script. It will then use heuristics to decide which text
// area to spawn an edit request for.
chrome.browserAction.onClicked.addListener(function(tab) {

    var find_msg = {
        msg: "find_edit"
};
    try {
        // sometimes there is no tab to talk to
    var tab_port = chrome.tabs.connect(tab.id);
    tab_port.postMessage(find_msg);
    updateUserFeedback("sent request to content script", "green");
    } catch (err) {
        if (settings.get("enable_foreground")) {
            handleForegroundMessage(msg);
        } else {
            updateUserFeedback("no text area listener on this page", "red");
        }
    }
});

うまくいきません。接続または postMessage がトラップできるエラーをスローすると予想しますが、コンソール ログには次のようなエラー メッセージが表示されます。

Port: Could not establish connection. Receiving end does not exist.

しかし、私はcatchステートメントに行き着きません。

4

1 に答える 1

0

結局、私は接続でそれを行うことができませんでした.応答が入ったときにコールバック関数を持つワンショット sendMessage() を使用する必要がありました.成功と lastError の状態を調べることができます. コードは次のようになります。

// Called when the user clicks on the browser action.
//
// When clicked we send a message to the current active tab's
// content script. It will then use heuristics to decide which text
// area to spawn an edit request for.
chrome.browserAction.onClicked.addListener(function(tab) {
    var find_msg = {
        msg: "find_edit"
    };
    // sometimes there is no content script to talk to which we need to detect
    console.log("sending find_edit message");
    chrome.tabs.sendMessage(tab.id, find_msg, function(response) {
        console.log("sendMessage: "+response);
        if (chrome.runtime.lastError && settings.get("enable_foreground")) {
            handleForegroundMessage();
        } else {
            updateUserFeedback("sent request to content script", "green");
        }
    });
});
于 2013-08-08T17:51:17.897 に答える