web-dev-qa-db-ja.com

chrome.runtime.sendMessageが期待どおりに機能しない

コンテンツスクリプトとバックグラウンドスクリプトを使用してChromeプラグインを作成しており、2つを通信させようとしています。

私のコンテンツスクリプトでは、

chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
      console.log(response.farewell);
});

そして私のバックグラウンドスクリプトでは、私はやっています

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
        console.log(sender.tab ?
          "from a content script:" + sender.tab.url :
          "from the extension");
        if (request.greeting == "hello")
            sendResponse({farewell: "goodbye"});
    }
);

私のマニフェストは次のようになります。

{
    "manifest_version": 2,
    "name": "Tesing Phase",
    "version": "1.0",
    "background": {
        "persistent": false,
        "scripts": ["bgscript.js"]
    },
    "content_scripts": [{
        "js": ["contentscript.js"],
        "all_frames": true,
        "run_at" : "document_start",
        "matches": ["*://*/*"]
    }],
    "web_accessible_resources": ["script.js"]
}

プラグインを実行すると、次のエラーが発生します。

Uncaught TypeError: Object #<Object> has no method 'sendMessage' 

ロギングしてみましたchrome.runtime、メソッドsendMessageはありませんでした。 Ubuntuでバージョン25.0のChromiumを使用しています。 sendRequestも使用してみましたが、減価償却済みであるため、sendMessageを使用する必要があります。

私がここで欠けているものを誰かが私に指摘できますか?これが機能するために必要な権限はありますか?

13
Jiby Jose

chrome.runtime.sendMessage / onMessage (および connect などの他の関連イベント/メソッド) Chrome 26で導入されました。

Chrome 20-25と互換性のある拡張機能を作成する場合は、chrome.extension.sendMessageを使用してください。

最適な互換性を実現する方法は、chrome.runtimeメソッドを自分で定義することです。たとえば、残りのコード(バックグラウンド/コンテンツスクリプト)の前に次のコードを実行します。

if (!chrome.runtime) {
    // Chrome 20-21
    chrome.runtime = chrome.extension;
} else if(!chrome.runtime.onMessage) {
    // Chrome 22-25
    chrome.runtime.onMessage = chrome.extension.onMessage;
    chrome.runtime.sendMessage = chrome.extension.sendMessage;
    chrome.runtime.onConnect = chrome.extension.onConnect;
    chrome.runtime.connect = chrome.extension.connect;
}

次に、最新のAPI形式を使用できます。

// Bind event:
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
    // Do something
});

// Send message:
chrome.runtime.sendMessage({greeting: 'hello'});

chrome.runtimeオブジェクトのメソッドを変更することに不快感を感じる場合は、代わりに次のアプローチを使用できます

var runtimeOrExtension = chrome.runtime && chrome.runtime.sendMessage ?
                         'runtime' : 'extension';

// Bind event:
chrome[runtimeOrExtension].onMessage.addListener(
  function(message, sender, sendResponse) {
    // Do something
});

// Send message:
chrome[runtimeOrExtension].sendMessage({greeting: 'hello'});
34
Rob W