diff --git a/platform/mv3/safari/ext-compat.js b/platform/mv3/safari/ext-compat.js index 772f17c81..3618ecd49 100644 --- a/platform/mv3/safari/ext-compat.js +++ b/platform/mv3/safari/ext-compat.js @@ -181,3 +181,43 @@ export const dnr = { return nativeDNR.setExtensionActionOptions(...args); }, }; + +/******************************************************************************/ + +// Workaround for: +// https://github.com/uBlockOrigin/uBOL-home/issues/515 +// https://bugs.webkit.org/show_bug.cgi?id=300236 +// +// For each realm, we will force-reload registered rulesets once. + +const { windows } = webext; +const NORMAL_REALM = 0b01; +const PRIVATE_REALM = 0b10; +const ALL_REALMS = NORMAL_REALM | PRIVATE_REALM; +let seenRealms = 0b00; + +async function forceEnableRulesets(windowId) { + if ( seenRealms === ALL_REALMS ) { return; } + if ( windowId === windows.WINDOW_ID_NONE ) { return; } + const details = await windows.get(windowId, { windowTypes: [ 'normal' ] }); + const incognito = details?.incognito; + if ( typeof incognito !== 'boolean' ) { return; } + const currentRealm = incognito ? PRIVATE_REALM : NORMAL_REALM; + if ( (seenRealms & currentRealm) !== 0 ) { return; } + seenRealms |= currentRealm; + webext.storage.session.set({ __seenRealms: seenRealms }); + const ids = await nativeDNR.getEnabledRulesets(); + if ( ids.length === 0 ) { return; } + nativeDNR.updateEnabledRulesets({ + disableRulesetIds: ids.slice(), + enableRulesetIds: ids.slice(), + }); +} + +windows.onFocusChanged.addListener(forceEnableRulesets); + +webext.storage.session.get('__seenRealms').then(bin => { + seenRealms |= bin?.__seenRealms ?? 0; +}).catch(( ) => { +}); +