Skip to content

Commit 83c51b1

Browse files
committed
[mv3] Fix various concurrency issues with "Restore" operation
1 parent d8558aa commit 83c51b1

2 files changed

Lines changed: 17 additions & 25 deletions

File tree

platform/mv3/extension/js/filter-manager.js

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -47,33 +47,27 @@ const isCSS = a => isProcedural(a) === false && isScriptlet(a) === false;
4747

4848
/******************************************************************************/
4949

50-
async function flushWrites() {
51-
while ( pendingWrites.length !== 0 ) {
52-
const promises = pendingWrites;
53-
pendingWrites.length = 0;
54-
await Promise.all(promises);
55-
}
56-
}
57-
5850
async function keysFromStorage() {
59-
await flushWrites();
60-
return localKeys();
51+
pendingStorageOp = pendingStorageOp.then(( ) => localKeys());
52+
return pendingStorageOp;
6153
}
6254

6355
async function readFromStorage(key) {
64-
await flushWrites();
65-
return localRead(key);
56+
pendingStorageOp = pendingStorageOp.then(( ) => localRead(key));
57+
return pendingStorageOp;
6658
}
6759

6860
async function writeToStorage(key, value) {
69-
pendingWrites.push(localWrite(key, value));
61+
pendingStorageOp = pendingStorageOp.then(( ) => localWrite(key, value));
62+
return pendingStorageOp;
7063
}
7164

7265
async function removeFromStorage(key) {
73-
pendingWrites.push(localRemove(key));
66+
pendingStorageOp = pendingStorageOp.then(( ) => localRemove(key));
67+
return pendingStorageOp;
7468
}
7569

76-
const pendingWrites = [];
70+
let pendingStorageOp = Promise.resolve();
7771

7872
/******************************************************************************/
7973

@@ -117,7 +111,7 @@ async function getAllCustomFilterKeys() {
117111
export async function getAllCustomFilters() {
118112
const collect = async key => {
119113
const selectors = await readFromStorage(key);
120-
return [ key.slice(5), selectors ];
114+
return [ key.slice(5), selectors ?? [] ];
121115
};
122116
const keys = await getAllCustomFilterKeys();
123117
const promises = keys.map(k => collect(k));

platform/mv3/extension/js/scripting-manager.js

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -371,13 +371,13 @@ function registerScriptlet(context, scriptletDetails) {
371371

372372
export async function registerInjectables() {
373373
if ( browser.scripting === undefined ) { return false; }
374+
registerInjectables.pendingOp =
375+
registerInjectables.pendingOp.then(( ) => registerInjectables.register());
376+
return registerInjectables.pendingOp;
377+
}
378+
registerInjectables.pendingOp = Promise.resolve();
374379

375-
if ( registerInjectables.pendingRegisterOp ) {
376-
await registerInjectables.pendingRegisterOp;
377-
}
378-
const { resolve: resolveRegisterOp, promise } = Promise.withResolvers();
379-
registerInjectables.pendingRegisterOp = promise;
380-
380+
registerInjectables.register = async function register() {
381381
const [
382382
filteringModeDetails,
383383
rulesetsDetails,
@@ -426,10 +426,8 @@ export async function registerInjectables() {
426426

427427
await resetCSSCache();
428428

429-
resolveRegisterOp();
430-
431429
return true;
432-
}
430+
};
433431

434432
/******************************************************************************/
435433

0 commit comments

Comments
 (0)