Расширение chrome: chrome.tabs.sendmessage отправляет сообщение на все вкладки, даже если указан tabId

Есть ли ошибка в том, как я это реализую? Я открываю новую вкладку и затем отправляю сообщение на эту вкладку, но затем все остальные вкладки, на которых есть прослушиватель, также получают сообщение.

В background.js:

chrome.tabs.create({url:chrome.extension.getURL("placement.html")},function(tab){
    chrome.tabs.sendMessage(tab.id, {
        "name":"name",
        "payload":payload
    });
});

В Place.js (запускается, когда загружается Place.html):

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    if (request.name == "name") {
        payload = request.payload;
    }
});

Я вижу, что всякий раз, когда создается новая вкладка, полезная нагрузка отправляется на все вкладки, которые имеют этот прослушиватель onMessage. Этот код относительно старый, поэтому я не уверен, что, может быть, что-то недавно изменилось, что влияет на то, как chrome.tabs.sendMessage интерпретирует "tab.id". Любая помощь приветствуется!

1 ответ

Я согласен с @wOxxOm, это ошибка в новой версии Chrome... и кажется chrome.tabs.connect не уважает параметр идентификатора вкладки.

Я решил это, отправив URL-адрес нужной вкладки в скрипт содержимого и убедившись, что URL-адреса совпадают.

Из всплывающего окна:

chrome.tabs.query({currentWindow: true,active: true}, function(tabs){ 
        port = chrome.tabs.connect(tabs[0].id,{name: "channelName"});
        port.postMessage({url:tabs[0].url});
});

Из содержимого скрипта:

chrome.runtime.onConnect.addListener(function(port) {
        if(port.name == "channelName"){
        port.onMessage.addListener(function(response) {
            if(response.url == window.location.href){

            }
        }); 
    }
});

Я открыл вопрос здесь после того, как связался с разработчиком из Google.

Другие вопросы по тегам