Chrome Extensions(拡張機能)では、Content Script・Background間で通信するときに「
sendMessage」と「
onMessage」をつかう。
Content ScriptからBackgroundへの通信は、特別なことをしなくてもできる。
しかし、
BackgroundからContent Scriptへの通信は、ブラウザのどのタブに送信するかを示すタブIDが必要になる。
通常であれば、次のような実装ができる。
// background.js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
// いろんな処理
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {
// いろんな処理
}, callback);
}
);
しかし、ミドルクリック(ホイールクリック)などで、リンクをバックグラウンドで開いた場合、先にあげた実装方法では対処できない。
バックグラウンドで開いているため、タブがアクティブにならず
chrome.tabs.queryではタブ情報が取得できないからだ。そのため、
tabs[0].idの部分で次のようなエラーが発生してしまう。
Error in response to tabs.query: TypeError: Cannot read property 'id' of undefined
※ 「バックグラウンドで開く」とは、リンクを新しいタブで開くがアクティブにならないことを指す。もう少し補足すると、リンクを開いたときに表示されるタブが現在閲覧しているタブのままで、開かれたタブに移動しないということ。