Skip to content

Commit 9211ea2

Browse files
committed
fix: avoid infinite hangs on async messages (revise)
cherry-pick from commit 999a690
1 parent c4d196d commit 9211ea2

1 file changed

Lines changed: 34 additions & 28 deletions

File tree

src/ext/background/main.js

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -302,11 +302,9 @@ async function nativeChecks() {
302302
* Make sure not to return `undefined` or `rejection`, otherwise the reply may never be delivered
303303
* @see {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage#listener}
304304
* @type {Parameters<typeof browser.runtime.onMessage.addListener>[0]}
305-
* @returns {Promise<{status: "pending"|"fulfilled"|"rejected", result: any}>}
305+
* @returns {Promise<{status: "pending"|"fulfilled"|"rejected", result?: any}>}
306306
*/
307307
async function handleMessage(message, sender) {
308-
/** @type {Promise} */
309-
let promise;
310308
switch (message.name) {
311309
case "REQ_USERSCRIPTS": {
312310
// get the page url from the content script that sent request
@@ -331,27 +329,42 @@ async function handleMessage(message, sender) {
331329
} catch (error) {
332330
console.error(error);
333331
// @ts-ignore -- ignore for now and will reconstruct this in the future.
334-
return { error };
332+
return { error: String(error) };
335333
}
336334
}
337335
case "API_CLOSE_TAB": {
338-
promise = browser.tabs.remove(message.tabId || sender.tab.id);
339-
break;
336+
try {
337+
await browser.tabs.remove(message.tabId || sender.tab.id);
338+
return { status: "fulfilled" };
339+
} catch (error) {
340+
console.error(message, sender, error);
341+
return { status: "rejected", result: String(error) };
342+
}
340343
}
341344
case "API_OPEN_TAB": {
342-
promise = browser.tabs.create({
343-
active: message.active,
344-
index: sender.tab.index + 1,
345-
url: message.url,
346-
});
347-
break;
345+
try {
346+
const tab = await browser.tabs.create({
347+
active: message.active,
348+
index: sender.tab.index + 1,
349+
url: message.url,
350+
});
351+
return { status: "fulfilled", result: tab };
352+
} catch (error) {
353+
console.error(message, sender, error);
354+
return { status: "rejected", result: String(error) };
355+
}
348356
}
349357
case "API_ADD_STYLE": {
350-
promise = browser.tabs.insertCSS(sender.tab.id, {
351-
code: message.css,
352-
cssOrigin: "user",
353-
});
354-
break;
358+
try {
359+
await browser.tabs.insertCSS(sender.tab.id, {
360+
code: message.css,
361+
cssOrigin: "user",
362+
});
363+
return { status: "fulfilled" };
364+
} catch (error) {
365+
console.error(message, sender, error);
366+
return { status: "rejected", result: String(error) };
367+
}
355368
}
356369
case "API_GET_TAB": {
357370
if (typeof sender.tab === "undefined") {
@@ -365,17 +378,17 @@ async function handleMessage(message, sender) {
365378
return { status: "fulfilled", result: tabObj };
366379
} catch (error) {
367380
console.error("failed to parse tab data for getTab", error);
368-
return { status: "rejected", result: error };
381+
return { status: "rejected", result: String(error) };
369382
}
370383
}
371384
case "API_SAVE_TAB": {
372385
if (sender.tab != null && sender.tab.id) {
373386
const key = `tab-${sender.tab.id}`;
374387
sessionStorage.setItem(key, JSON.stringify(message.tabObj));
375-
return { status: "fulfilled", result: undefined };
388+
return { status: "fulfilled" };
376389
} else {
377390
const error = "unable to save tab, empty tab id";
378-
return { status: "rejected", result: error };
391+
return { status: "rejected", result: String(error) };
379392
}
380393
}
381394
case "API_SET_CLIPBOARD": {
@@ -481,7 +494,7 @@ async function handleMessage(message, sender) {
481494
port.postMessage({ name: "onloadend", event });
482495
};
483496
}
484-
break;
497+
return { status: "fulfilled" };
485498
}
486499
case "REFRESH_SESSION_RULES": {
487500
setSessionRules();
@@ -492,13 +505,6 @@ async function handleMessage(message, sender) {
492505
break;
493506
}
494507
}
495-
try {
496-
const result = await promise;
497-
return { status: "fulfilled", result };
498-
} catch (error) {
499-
console.error(message, sender, error);
500-
return { status: "rejected", result: error };
501-
}
502508
}
503509
browser.runtime.onInstalled.addListener(async () => {
504510
nativeChecks();

0 commit comments

Comments
 (0)