sendMessage не возвращает результат при переходе с манифеста V2 на V3
Мое расширение основано на манифесте V2 и совместимо с разными браузерами на основе браузерного полифила. Мне нужно перейти на манифест V3. Существует множество коммуникаций между контекстом и фоном с использованием sendMessage в расширении. Как написано во многих местах, включая официальную документацию Chrome, в V3 sendMessage изначально возвращает обещания, поэтому я удалил полифил и попытался загрузить расширение, но оно не сработало.
Похоже, что sendMessage do возвращает обещание, но при входе в консоль сообщение от .then появляется перед сообщением от прослушивателя сообщений в сервисном работнике (бывший фон), поэтому результат всегда не определен . Что я делаю не так?
контекст.js:
if (typeof globalThis.browser === "undefined")
environment = chrome.runtime
else
environment = browser.runtime
onCompletePageLoad()
function onCompletePageLoad() {
let nmarr = [{request: "AA"}];
let snd = environment.sendMessage(nmarr);
console.log("SENDER = ", snd);
snd.then(
result => {console.log("AFTER MESSAGE RETURN = ", result) },
error => {}
);
}
фон.js:
let environment
if (typeof globalThis.browser === "undefined")
environment = chrome.runtime
else
environment = browser.runtime
environment.onMessage.addListener(onContentMessage);
function onContentMessage(msg, sender, handleResponse)
{
console.log("MESSAGE RECEIVED");
return new Promise(resolve => {
setTimeout(() => {
console.log("TIMES OUT");
resolve("async response from background script");
}, 2000);
});
}
Результат:
ОТПРАВИТЕЛЬ = Обещание {<ожидание>}
ПОСЛЕ ВОЗВРАТА СООБЩЕНИЯ = не определено
(В исходных журналах расширений из background.js появляется на той же консоли, что и из context.js, но после того, как я извлек этот фрагмент для проверки расширения, фоновые сообщения появляются только на консоли сервис-воркера, поэтому я не могу продемонстрировать порядок консоли Сообщения)
манифест.json:
{
"manifest_version": 3,
"name": "messagetest manifest 3",
"version": "1.0",
"description": "Testing content to background message sending",
"background": {
"service_worker": "background.js"
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"]
}
]
}