diff --git a/platform/mv3/extension/js/background.js b/platform/mv3/extension/js/background.js index 66d17a788..e250d1025 100644 --- a/platform/mv3/extension/js/background.js +++ b/platform/mv3/extension/js/background.js @@ -50,6 +50,7 @@ import { excludeFromStrictBlock, getEnabledRulesetsDetails, getRulesetDetails, + patchDefaultRulesets, setStrictBlockMode, updateDynamicRules, } from './ruleset-manager.js'; @@ -377,22 +378,24 @@ function onMessage(request, sender, callback) { async function start() { await loadRulesetConfig(); - // Potentially enable new default rulesets + const currentVersion = getCurrentVersion(); + const isNewVersion = currentVersion !== rulesetConfig.version; + + // The default rulesets may have changed, find out new ruleset to enable, + // obsolete ruleset to remove. + if ( isNewVersion ) { + ubolLog(`Version change: ${rulesetConfig.version} => ${currentVersion}`); + rulesetConfig.version = currentVersion; + await patchDefaultRulesets(); + saveRulesetConfig(); + } const rulesetsUpdated = process.wakeupRun === false && await enableRulesets(rulesetConfig.enabledRulesets); // We need to update the regex rules only when ruleset version changes. - if ( process.wakeupRun === false ) { - const currentVersion = getCurrentVersion(); - if ( currentVersion !== rulesetConfig.version ) { - ubolLog(`Version change: ${rulesetConfig.version} => ${currentVersion}`); - rulesetConfig.version = currentVersion; - saveRulesetConfig(); - if ( rulesetsUpdated === false ) { - updateDynamicRules(); - } - } + if ( isNewVersion && rulesetsUpdated === false ) { + updateDynamicRules(); } // Permissions may have been removed while the extension was disabled diff --git a/platform/mv3/extension/js/config.js b/platform/mv3/extension/js/config.js index e3859e63f..0c79dd62b 100644 --- a/platform/mv3/extension/js/config.js +++ b/platform/mv3/extension/js/config.js @@ -24,13 +24,11 @@ import { sessionRead, sessionWrite, } from './ext.js'; -import { defaultRulesetsFromLanguage } from './ruleset-manager.js'; - /******************************************************************************/ export const rulesetConfig = { version: '', - enabledRulesets: [ 'default' ], + enabledRulesets: [], autoReload: true, showBlockedCount: true, strictBlockMode: true, @@ -67,7 +65,6 @@ export async function loadRulesetConfig() { sessionWrite('rulesetConfig', rulesetConfig); return; } - rulesetConfig.enabledRulesets = await defaultRulesetsFromLanguage(); sessionWrite('rulesetConfig', rulesetConfig); localWrite('rulesetConfig', rulesetConfig); process.firstRun = true; diff --git a/platform/mv3/extension/js/ruleset-manager.js b/platform/mv3/extension/js/ruleset-manager.js index c18a575d9..44443bfd5 100644 --- a/platform/mv3/extension/js/ruleset-manager.js +++ b/platform/mv3/extension/js/ruleset-manager.js @@ -593,6 +593,40 @@ async function defaultRulesetsFromLanguage() { /******************************************************************************/ +async function patchDefaultRulesets() { + const [ + oldDefaultIds = [], + newDefaultIds, + newIds, + ] = await Promise.all([ + localRead('defaultRulesetIds'), + defaultRulesetsFromLanguage(), + getRulesetDetails(), + ]); + const toAdd = []; + const toRemove = []; + for ( const id of newDefaultIds ) { + if ( oldDefaultIds.includes(id) ) { continue; } + toAdd.push(id); + } + for ( const id of oldDefaultIds ) { + if ( newDefaultIds.includes(id) ) { continue; } + toRemove.push(id); + } + for ( const id of rulesetConfig.enabledRulesets ) { + if ( newIds.has(id) ) { continue; } + toRemove.push(id); + } + localWrite('defaultRulesetIds', newDefaultIds); + if ( toAdd.length === 0 && toRemove.length === 0 ) { return; } + const enabledRulesets = new Set(rulesetConfig.enabledRulesets); + toAdd.forEach(id => enabledRulesets.add(id)); + toRemove.forEach(id => enabledRulesets.delete(id)); + rulesetConfig.enabledRulesets = Array.from(enabledRulesets); +} + +/******************************************************************************/ + async function enableRulesets(ids) { const afterIds = new Set(ids); const [ beforeIds, adminIds, rulesetDetails ] = await Promise.all([ @@ -681,6 +715,7 @@ export { filteringModesToDNR, getRulesetDetails, getEnabledRulesetsDetails, + patchDefaultRulesets, setStrictBlockMode, updateDynamicRules, };