У меня есть следующий метод, который вызывается из фонового скрипта моего расширения Chrome. Цель состоит в том, чтобы отправить сообщение на определенную вкладку, а затем вызвать предоставленный метод обратного вызова с результатом. Важно то, что callbackDone должен всегда вызываться в какой-то момент времени. Итак, это происходит так:
function sendToTab(nTabID, callbackDone)
{
(function()
{
chrome.tabs.sendMessage(nTabID, {
action: "update01"
},
function(response)
{
if(chrome.runtime.lastError)
{
//Failed to send message to the page
if(callbackDone)
callbackDone(nTabID, null); //Page never received the message
}
else
{
//Sent message OK
if(response.result === true)
{
if(callbackDone)
callbackDone(nTabID, true); //Success!
}
else
{
if(callbackDone)
callbackDone(nTabID, false); //Page returns failure
}
}
});
}());
}
Затем изнутри страницы, которая обрабатывает сообщение (может быть внедренным content script), я обрабатываю его как таковое:
chrome.runtime.onMessage.addListener(onMessageProc);
function onMessageProc(request, sender, sendResponse)
{
if(request.action == "update01")
{
//Do processing .... that sets `bResult`
sendResponse({result: bResult});
}
}
Приведенный выше подход работает достаточно хорошо, за исключением... Скажем, есть страница, например Сценарий страницы параметров, которая не обрабатывает мое update01 сообщение, а вместо этого обрабатывает свое собственное сообщение как таковое:
chrome.runtime.onMessage.addListener(onMessageProc);
function onMessageProc(request, sender, sendResponse)
{
if(request.action == "update02") //Note different action ID
{
//Does some other actions...
}
}
В этом случае, когда мой первый метод sendToTab вызывается для этой вкладки, мой callbackDone никогда не вызывается, т. е. chrome.tabs.sendMessage вызывается и немедленно возвращается, но его функция обратного вызова никогда не вызывается.
Итак, что мне здесь не хватает?