Передача сообщения из 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