コンテンツスクリプトとバックグラウンドスクリプトを使用して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
を使用する必要があります。
私がここで欠けているものを誰かが私に指摘できますか?これが機能するために必要な権限はありますか?
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'});