Передача сообщения из background.js в popup.js

Я пытаюсь реализовать собственное расширение chrome, на котором в определенном событии создается уведомление обозревателя и заполняет всплывающее окно данными, вычисленными в background.js

Вот файл mymanifest:

{
    "name": "Dummy name",
    "description": "Description",
    "manifest_version": 2,
    "version": "1.1.3",
    "icons": {
        "16": "icon_16.png",
        "48": "icon_48.png",
        "128": "icon_128.png",
        "256": "icon_256.png"
    },
    "browser_action": {
        "default_icon": "icon_48.png",
        "default_title": "Test",
        "default_popup": "popup.html"
    },
    "permissions": ["background","webRequest","webRequestBlocking","webNavigation","tabs","notifications"],
    "background": {
        "scripts":["jquery-1.8.1.min.js","classy.js","background.js"]
    }
}

Мой вызов sendMessage в background.js

show : function(result) {
    var that = this;
    chrome.extension.sendMessage({greeting: "hello"}, function(response) {
        console.log(response);
    });

    if(window.webkitNotifications) {
        var notification = webkitNotifications.createHTMLNotification('notification.html');
        notification.show();
        setTimeout(function(){
            notification.cancel();
            }, '7000');
        }
    }

Мой прослушиватель сообщений в popup.js(из образцов расширения chrome)

chrome.extension.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"});
  });

Единственная ошибка, которую я получаю, это

Ошибка порта: не удалось установить соединение. Получающий конец не существуют.

Благодарим за помощь!

Ответ 1

Всплывающее окно не имеет идентификатора табуляции, поэтому вы получите сообщение об ошибке.

В этом случае вы можете использовать chrome.runtime.sendMessage и chrome.runtime.onMessage.addListener.

Итак, в background.js

chrome.runtime.sendMessage({
    msg: "something_completed", 
    data: {
        subject: "Loading",
        content: "Just completed!"
    }
});

И в popup.js

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
        if (request.msg === "something_completed") {
            //  To do something
            console.log(request.data.subject)
            console.log(request.data.content)
        }
    }
);

Я надеюсь, что это будет полезно для вас.

Спасибо, Alex

Ответ 2

Чтобы решить эту проблему, вам нужно сначала отправить сообщение подтверждения на background.js, а затем отправить фактические данные из background.js в popup.js Например: В моем случае я сделал

popup.js

chrome.runtime.sendMessage({data:"Handshake"},function(response){
	
			});
chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
	str = JSON.stringify(message.data);

Ответ 3

Используйте runtime.sendMessage для отправки сообщений на фоне script и tabs.sendMessage из фона в контент script.

Обратите внимание, что вам нужно указать идентификатор табуляции:

chrome.tabs.query({ active: true }, (tabs) => {
    chrome.tabs.sendMessage(tabs[0].id, { greeting: 'hello' }, (response) => {
        console.log(response);
    });
});

Здесь вы можете найти полный пример и документацию: https://developer.chrome.com/extensions/messaging#simple