Я пытаюсь установить текст значка для каждой вкладки в Chrome.
Я выполнил этот ответ https://stackoverflow.com/a/32168534/8126260, чтобы сделать это, хотя обработчик событий chrome.runtime.onMessage
никогда не запускается.
// tab specific badges https://stackoverflow.com/questions/32168449/how-can-i-get-different-badge-value-for-every-tab-on-chrome
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
console.info('runtime message');
if (message.badgeText) {
console.info('runtime message with badge text');
chrome.tabs.get(sender.tab.id, function(tab) {
if (chrome.runtime.lastError) {
return; // the prerendered tab has been nuked, happens in omnibox search
}
if (tab.index >= 0) { // tab is visible
chrome.browserAction.setBadgeText({tabId:tab.id, text:message.badgeText});
console.info('set message');
} else { // prerendered tab, invisible yet, happens quite rarely
var tabId = sender.tab.id, text = message.badgeText;
chrome.webNavigation.onCommitted.addListener(function update(details) {
if (details.tabId == tabId) {
chrome.browserAction.setBadgeText({tabId: tabId, text: text});
chrome.webNavigation.onCommitted.removeListener(update);
}
});
}
});
}
});
// block outgoing requests for help widgets
chrome.webRequest.onBeforeRequest.addListener(
function(details) {
//send message
console.info('send message');
chrome.runtime.sendMessage({badgeText: "HELP"});
if (isDisabled) {
return { cancel: false } // this should return from the function (details) level
} else {
return { cancel: true }
}
},
{urls: [
"a bunch of urls irrelevant to this question"
]},
["blocking"]);
(весь исходный код находится на https://github.com/bcye/Привет-до свидания)
Глядя в консоль моего фонового скрипта, появляется сообщение об отправке, означающее, что chrome.runtime.sendMessage({badgeText: "HELP"});
должен был быть выполнен.
Однако ни один из операторов console.info в прослушивателе onMessage не выполняется.
@wOxxOm да, я отправляю их из файла background.js. Хотя как я мог получить идентификатор вкладки, поскольку при прямом вызове функции я не получил бы объект-отправитель.
Решил, как @wOxxOm сказал, что это невозможно.
Хотя webRequest передает tabId в словаре деталей. Это можно использовать, чтобы воспроизвести это.
Вы отправляете сообщение слушателю в фоновом сценарии? Это не сработает, целью должна быть другая страница. На той же странице вы можете использовать стандартные методы js, такие как прямой вызов функции или настраиваемый подписчик/эмиттер событий.