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
※ 「バックグラウンドで開く」とは、リンクを新しいタブで開くがアクティブにならないことを指す。もう少し補足すると、リンクを開いたときに表示されるタブが現在閲覧しているタブのままで、開かれたタブに移動しないということ。
バックグラウンドで開いたタブ情報の取得方法
対処方法は、onMessageでメッセージを受信したときの引数:senderを使用する。
// background.js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
// いろんな処理
chrome.tabs.sendMessage(sender.tab.id, {
// いろんな処理
}, callback);
}
);
第2引数のsenderには、Content Script側がsendMessageで送信したときの情報(開いているURLやタブ情報)が含まれている。
そのため、sender.tab.idでタブIDが取得でき、どのタブが送信してきたメッセージなのか判断できる。
ちなみに「sendMessage」と「onMessage」の使い方は、以下の記事にまとめている。
以上
written by @bc_rikko
0 件のコメント :
コメントを投稿