diff --git a/platform/mv3/extension/css/settings.css b/platform/mv3/extension/css/settings.css index fc9e1b41c..4c370f6c1 100644 --- a/platform/mv3/extension/css/settings.css +++ b/platform/mv3/extension/css/settings.css @@ -92,6 +92,12 @@ body:not(.committing) #commit-spinner { body.committing #commit-spinner { animation: spin 1s steps(8) infinite; } +#dnrError { + color: var(--info3-ink); + } +#dnrError:empty { + display: none; + } section[data-pane="rulesets"] > div:first-of-type > p:first-of-type { margin-top: 0; } diff --git a/platform/mv3/extension/dashboard.html b/platform/mv3/extension/dashboard.html index 469caffd7..038804b10 100644 --- a/platform/mv3/extension/dashboard.html +++ b/platform/mv3/extension/dashboard.html @@ -31,6 +31,7 @@

spinner

+

diff --git a/platform/mv3/extension/js/background.js b/platform/mv3/extension/js/background.js index 097f97e0b..56d6e176b 100644 --- a/platform/mv3/extension/js/background.js +++ b/platform/mv3/extension/js/background.js @@ -248,15 +248,18 @@ function onMessage(request, sender, callback) { switch ( request.what ) { case 'applyRulesets': { - enableRulesets(request.enabledRulesets).then(( ) => { - rulesetConfig.enabledRulesets = request.enabledRulesets; - return saveRulesetConfig(); - }).then(( ) => { - registerInjectables(); - callback(); - return dnr.getEnabledRulesets(); - }).then(enabledRulesets => { - broadcastMessage({ enabledRulesets }); + enableRulesets(request.enabledRulesets).then(result => { + if ( result === undefined || result.error ) { + callback(result); + return; + } + rulesetConfig.enabledRulesets = result.enabledRulesets; + return saveRulesetConfig().then(( ) => { + return registerInjectables(); + }).then(( ) => { + callback(result); + broadcastMessage({ enabledRulesets: result.enabledRulesets }); + }); }); return true; } @@ -547,7 +550,7 @@ async function startSession() { const rulesetsUpdated = await enableRulesets(rulesetConfig.enabledRulesets); // We need to update the regex rules only when ruleset version changes. - if ( rulesetsUpdated === false ) { + if ( rulesetsUpdated === undefined ) { if ( isNewVersion ) { updateDynamicRules(); } else { diff --git a/platform/mv3/extension/js/filter-lists.js b/platform/mv3/extension/js/filter-lists.js index e2f431e2b..3f3addfe8 100644 --- a/platform/mv3/extension/js/filter-lists.js +++ b/platform/mv3/extension/js/filter-lists.js @@ -413,10 +413,11 @@ const applyEnabledRulesets = (( ) => { const modified = hashFromIterable(enabledRulesets) !== hashFromIterable(cachedRulesetData.enabledRulesets); if ( modified ) { - await sendMessage({ + const result = await sendMessage({ what: 'applyRulesets', enabledRulesets, }); + dom.text('#dnrError', result?.error || ''); } dom.cl.remove(dom.body, 'committing'); diff --git a/platform/mv3/extension/js/ruleset-manager.js b/platform/mv3/extension/js/ruleset-manager.js index d1d9eeb42..e81172811 100644 --- a/platform/mv3/extension/js/ruleset-manager.js +++ b/platform/mv3/extension/js/ruleset-manager.js @@ -306,6 +306,9 @@ async function updateDynamicRules() { if ( dynamicRegexCount !== 0 ) { ubolLog(`Using ${dynamicRegexCount}/${dnr.MAX_NUMBER_OF_REGEX_RULES} dynamic regex-based DNR rules`); } + + const response = {}; + try { await dnr.updateDynamicRules({ addRules, removeRuleIds }); if ( removeRuleIds.length !== 0 ) { @@ -316,8 +319,15 @@ async function updateDynamicRules() { } } catch(reason) { console.error(`updateDynamicRules() / ${reason}`); + response.error = `${reason}`; } - await updateSessionRules(); + + const result = await updateSessionRules(); + if ( result?.error ) { + response.error ||= result.error; + } + + return response; } /******************************************************************************/ @@ -452,6 +462,7 @@ async function updateSessionRules() { if ( sessionRegexCount !== 0 ) { ubolLog(`Using ${sessionRegexCount}/${dnr.MAX_NUMBER_OF_REGEX_RULES} session regex-based DNR rules`); } + const response = {}; try { await dnr.updateSessionRules({ addRules, removeRuleIds }); if ( removeRuleIds.length !== 0 ) { @@ -462,7 +473,9 @@ async function updateSessionRules() { } } catch(reason) { console.error(`updateSessionRules() / ${reason}`); + response.error = `${reason}`; } + return response; } /******************************************************************************/ @@ -636,9 +649,7 @@ async function enableRulesets(ids) { disableRulesetSet.delete(id); } - if ( enableRulesetSet.size === 0 && disableRulesetSet.size === 0 ) { - return false; - } + if ( enableRulesetSet.size === 0 && disableRulesetSet.size === 0 ) { return; } const enableRulesetIds = Array.from(enableRulesetSet); const disableRulesetIds = Array.from(disableRulesetSet); @@ -649,20 +660,34 @@ async function enableRulesets(ids) { if ( disableRulesetIds.length !== 0 ) { ubolLog(`Disable ruleset: ${disableRulesetIds}`); } - await dnr.updateEnabledRulesets({ enableRulesetIds, disableRulesetIds }).catch(reason => { + + const response = {}; + + await dnr.updateEnabledRulesets({ + enableRulesetIds, + disableRulesetIds, + }).catch(reason => { ubolLog(reason); + response.error = `${reason}`; }); - await updateDynamicRules(); + const result = await updateDynamicRules(); + if ( result?.error ) { + response.error ||= result.error; + } - dnr.getEnabledRulesets().then(enabledRulesets => { + await dnr.getEnabledRulesets().then(enabledRulesets => { ubolLog(`Enabled rulesets: ${enabledRulesets}`); + response.enabledRulesets = enabledRulesets; return dnr.getAvailableStaticRuleCount(); }).then(count => { ubolLog(`Available static rule count: ${count}`); + response.staticRuleCount = count; + }).catch(reason => { + ubolLog(reason); }); - return true; + return response; } /******************************************************************************/