From bd7ce412244691290ca134aa344b831aa8f41c53 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 13 Dec 2023 21:01:51 -0500 Subject: [PATCH] Remove "Purge all caches" button from "Filter lists" pane Purging all the lists from cache storage is detrimental to differential update, and cause filter lists to be updated less often and consequently to be less up to date then when letting differential updater do its work. --- src/3p-filters.html | 1 - src/devtools.html | 1 + src/js/3p-filters.js | 31 ++-- src/js/assets.js | 33 ++++- src/js/devtools.js | 36 +++-- src/js/lz4.js | 2 +- src/js/messaging.js | 341 +++++++++++++++++++++++++------------------ src/js/start.js | 6 +- src/js/storage.js | 25 ++-- src/js/support.js | 3 +- src/js/ublock.js | 2 +- 11 files changed, 276 insertions(+), 205 deletions(-) diff --git a/src/3p-filters.html b/src/3p-filters.html index b51e1f1b0..a77912080 100644 --- a/src/3p-filters.html +++ b/src/3p-filters.html @@ -20,7 +20,6 @@
-
diff --git a/src/devtools.html b/src/devtools.html index 5683dc79e..af7b972af 100644 --- a/src/devtools.html +++ b/src/devtools.html @@ -29,6 +29,7 @@ +
diff --git a/src/js/3p-filters.js b/src/js/3p-filters.js index bbdcab505..c59365fd7 100644 --- a/src/js/3p-filters.js +++ b/src/js/3p-filters.js @@ -276,7 +276,7 @@ const renderFilterLists = ( ) => { renderWidgets(); }; - vAPI.messaging.send('dashboard', { + return vAPI.messaging.send('dashboard', { what: 'getLists', }).then(response => { onListsReceived(response); @@ -295,9 +295,6 @@ const renderWidgets = ( ) => { updating === false && qs$('#lists .listEntry.checked.obsolete:not(.toRemove)') === null ); - dom.cl.toggle('#buttonPurgeAll', 'disabled', - updating || qs$('#lists .listEntry.cached:not(.obsolete)') === null - ); }; /******************************************************************************/ @@ -510,8 +507,9 @@ const onPurgeClicked = ev => { } vAPI.messaging.send('dashboard', { - what: 'purgeCaches', + what: 'listsUpdateNow', assetKeys, + preferOrigin: ev.shiftKey, }); // If the cached version is purged, the installed version must be assumed @@ -519,6 +517,7 @@ const onPurgeClicked = ev => { // https://github.com/gorhill/uBlock/issues/1733 // An external filter list must not be marked as obsolete, they will // always be fetched anyways if there is no cached copy. + dom.cl.add(dom.body, 'updating'); dom.cl.add(liEntry, 'obsolete'); if ( qs$(liEntry, 'input[type="checkbox"]').checked ) { @@ -608,25 +607,13 @@ const buttonUpdateHandler = async ( ) => { await selectFilterLists(); dom.cl.add(dom.body, 'updating'); renderWidgets(); - vAPI.messaging.send('dashboard', { what: 'forceUpdateAssets' }); + vAPI.messaging.send('dashboard', { what: 'updateNow' }); }; dom.on('#buttonUpdate', 'click', ( ) => { buttonUpdateHandler(); }); /******************************************************************************/ -const buttonPurgeAllHandler = async hard => { - await vAPI.messaging.send('dashboard', { - what: 'purgeAllCaches', - hard, - }); - renderFilterLists(true); -}; - -dom.on('#buttonPurgeAll', 'click', ev => { buttonPurgeAllHandler(ev.shiftKey); }); - -/******************************************************************************/ - const userSettingCheckboxChanged = ( ) => { const target = event.target; vAPI.messaging.send('dashboard', { @@ -863,6 +850,12 @@ self.hasUnsavedData = function() { /******************************************************************************/ -renderFilterLists(); +renderFilterLists().then(( ) => { + const buttonUpdate = qs$('#buttonUpdate'); + if ( dom.cl.has(buttonUpdate, 'active') ) { return; } + if ( dom.cl.has(buttonUpdate, 'disabled') ) { return; } + if ( listsetDetails.autoUpdate !== true ) { return; } + buttonUpdateHandler(); +}); /******************************************************************************/ diff --git a/src/js/assets.js b/src/js/assets.js index a6b9b7336..3ba617b7c 100644 --- a/src/js/assets.js +++ b/src/js/assets.js @@ -39,6 +39,7 @@ const reIsUserAsset = /^user-/; const errorCantConnectTo = i18n$('errorCantConnectTo'); const MS_PER_HOUR = 60 * 60 * 1000; const MS_PER_DAY = 24 * MS_PER_HOUR; +const MINUTES_PER_DAY = 24 * 60; const EXPIRES_DEFAULT = 7; const assets = {}; @@ -175,6 +176,23 @@ const isDiffUpdatableAsset = content => { data.diffPath.startsWith('%') === false; }; +const computedPatchUpdateTime = assetKey => { + const entry = assetCacheRegistry[assetKey]; + if ( entry === undefined ) { return 0; } + if ( typeof entry.diffPath !== 'string' ) { return 0; } + if ( typeof entry.diffExpires !== 'number' ) { return 0; } + const match = /(\d+)\.(\d+)\.(\d+)\.(\d+)/.exec(entry.diffPath); + if ( match === null ) { return getWriteTime(); } + const date = new Date(); + date.setUTCFullYear( + parseInt(match[1], 10), + parseInt(match[2], 10) - 1, + parseInt(match[3], 10) + ); + date.setUTCHours(0, parseInt(match[4], 10) + entry.diffExpires * MINUTES_PER_DAY, 0, 0); + return date.getTime(); +}; + /******************************************************************************/ // favorLocal: avoid making network requests whenever possible @@ -1169,7 +1187,7 @@ assets.getUpdateAges = async function(conditions = {}) { out.push({ assetKey, age, - ageNormalized: age / getUpdateAfterTime(assetKey), + ageNormalized: age / Math.max(1, getUpdateAfterTime(assetKey)), }); } return out; @@ -1221,12 +1239,13 @@ async function diffUpdater() { const assetDetails = getAssetDiffDetails(assetKey); if ( assetDetails === undefined ) { continue; } assetDetails.what = 'update'; - if ( (getWriteTime(assetKey) + assetDetails.diffExpires) > now ) { - assetDetails.fetch = false; - toSoftUpdate.push(assetDetails); - } else { + const computedUpdateTime = computedPatchUpdateTime(assetKey); + if ( computedUpdateTime !== 0 && computedUpdateTime <= now ) { assetDetails.fetch = true; toHardUpdate.push(assetDetails); + } else { + assetDetails.fetch = false; + toSoftUpdate.push(assetDetails); } } if ( toHardUpdate.length === 0 ) { return; } @@ -1432,8 +1451,8 @@ function updateDone() { assets.updateStart = function(details) { const oldUpdateDelay = updaterAssetDelay; - const newUpdateDelay = typeof details.delay === 'number' - ? details.delay + const newUpdateDelay = typeof details.fetchDelay === 'number' + ? details.fetchDelay : updaterAssetDelayDefault; updaterAssetDelay = Math.min(oldUpdateDelay, newUpdateDelay); updaterAuto = details.auto === true; diff --git a/src/js/devtools.js b/src/js/devtools.js index a41770811..93b26978e 100644 --- a/src/js/devtools.js +++ b/src/js/devtools.js @@ -134,7 +134,7 @@ dom.on('#console-unfold', 'click', ( ) => { dom.on('#snfe-dump', 'click', ev => { const button = ev.target; dom.attr(button, 'disabled', ''); - vAPI.messaging.send('dashboard', { + vAPI.messaging.send('devTools', { what: 'snfeDump', }).then(result => { log(result); @@ -145,7 +145,7 @@ dom.on('#snfe-dump', 'click', ev => { dom.on('#snfe-todnr', 'click', ev => { const button = ev.target; dom.attr(button, 'disabled', ''); - vAPI.messaging.send('dashboard', { + vAPI.messaging.send('devTools', { what: 'snfeToDNR', }).then(result => { log(result); @@ -153,6 +153,25 @@ dom.on('#snfe-todnr', 'click', ev => { }); }); +dom.on('#cfe-dump', 'click', ev => { + const button = ev.target; + dom.attr(button, 'disabled', ''); + vAPI.messaging.send('devTools', { + what: 'cfeDump', + }).then(result => { + log(result); + dom.attr(button, 'disabled', null); + }); +}); + +dom.on('#purge-all-caches', 'click', ( ) => { + vAPI.messaging.send('devTools', { + what: 'purgeAllCaches' + }).then(result => { + log(result); + }); +}); + vAPI.messaging.send('dashboard', { what: 'getAppData', }).then(appData => { @@ -161,7 +180,7 @@ vAPI.messaging.send('dashboard', { dom.on('#snfe-benchmark', 'click', ev => { const button = ev.target; dom.attr(button, 'disabled', ''); - vAPI.messaging.send('dashboard', { + vAPI.messaging.send('devTools', { what: 'snfeBenchmark', }).then(result => { log(result); @@ -170,15 +189,4 @@ vAPI.messaging.send('dashboard', { }); }); -dom.on('#cfe-dump', 'click', ev => { - const button = ev.target; - dom.attr(button, 'disabled', ''); - vAPI.messaging.send('dashboard', { - what: 'cfeDump', - }).then(result => { - log(result); - dom.attr(button, 'disabled', null); - }); -}); - /******************************************************************************/ diff --git a/src/js/lz4.js b/src/js/lz4.js index d16365e6b..608cdd853 100644 --- a/src/js/lz4.js +++ b/src/js/lz4.js @@ -44,7 +44,7 @@ let ttlCount = 0; let ttlDelay = 60000; const init = function() { - ttlDelay = µb.hiddenSettings.autoUpdateAssetFetchPeriod * 1000 + 15000; + ttlDelay = µb.hiddenSettings.autoUpdateAssetFetchPeriod * 2 * 1000; if ( promisedInstance === undefined ) { let flavor; if ( µb.hiddenSettings.disableWebAssembly === true ) { diff --git a/src/js/messaging.js b/src/js/messaging.js index eae8607b5..cacf32127 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -142,124 +142,6 @@ const onMessage = function(request, sender, callback) { }); return; - case 'snfeBenchmark': - µb.benchmarkStaticNetFiltering({ redirectEngine }).then(result => { - callback(result); - }); - return; - - case 'snfeToDNR': { - const listPromises = []; - const listNames = []; - for ( const assetKey of µb.selectedFilterLists ) { - listPromises.push( - io.get(assetKey, { dontCache: true }).then(details => { - listNames.push(assetKey); - return { name: assetKey, text: details.content }; - }) - ); - } - const options = { - extensionPaths: redirectEngine.getResourceDetails().filter(e => - typeof e[1].extensionPath === 'string' && e[1].extensionPath !== '' - ).map(e => - [ e[0], e[1].extensionPath ] - ), - env: vAPI.webextFlavor.env, - }; - const t0 = Date.now(); - dnrRulesetFromRawLists(listPromises, options).then(result => { - const { network } = result; - const replacer = (k, v) => { - if ( k.startsWith('__') ) { return; } - if ( Array.isArray(v) ) { - return v.sort(); - } - if ( v instanceof Object ) { - const sorted = {}; - for ( const kk of Object.keys(v).sort() ) { - sorted[kk] = v[kk]; - } - return sorted; - } - return v; - }; - const isUnsupported = rule => - rule._error !== undefined; - const isRegex = rule => - rule.condition !== undefined && - rule.condition.regexFilter !== undefined; - const isRedirect = rule => - rule.action !== undefined && - rule.action.type === 'redirect' && - rule.action.redirect.extensionPath !== undefined; - const isCsp = rule => - rule.action !== undefined && - rule.action.type === 'modifyHeaders'; - const isRemoveparam = rule => - rule.action !== undefined && - rule.action.type === 'redirect' && - rule.action.redirect.transform !== undefined; - const runtime = Date.now() - t0; - const { ruleset } = network; - const good = ruleset.filter(rule => - isUnsupported(rule) === false && - isRegex(rule) === false && - isRedirect(rule) === false && - isCsp(rule) === false && - isRemoveparam(rule) === false - ); - const unsupported = ruleset.filter(rule => - isUnsupported(rule) - ); - const regexes = ruleset.filter(rule => - isUnsupported(rule) === false && - isRegex(rule) && - isRedirect(rule) === false && - isCsp(rule) === false && - isRemoveparam(rule) === false - ); - const redirects = ruleset.filter(rule => - isUnsupported(rule) === false && - isRedirect(rule) - ); - const headers = ruleset.filter(rule => - isUnsupported(rule) === false && - isCsp(rule) - ); - const removeparams = ruleset.filter(rule => - isUnsupported(rule) === false && - isRemoveparam(rule) - ); - const out = [ - `dnrRulesetFromRawLists(${JSON.stringify(listNames, null, 2)})`, - `Run time: ${runtime} ms`, - `Filters count: ${network.filterCount}`, - `Accepted filter count: ${network.acceptedFilterCount}`, - `Rejected filter count: ${network.rejectedFilterCount}`, - `Un-DNR-able filter count: ${unsupported.length}`, - `Resulting DNR rule count: ${ruleset.length}`, - ]; - out.push(`+ Good filters (${good.length}): ${JSON.stringify(good, replacer, 2)}`); - out.push(`+ Regex-based filters (${regexes.length}): ${JSON.stringify(regexes, replacer, 2)}`); - out.push(`+ 'redirect=' filters (${redirects.length}): ${JSON.stringify(redirects, replacer, 2)}`); - out.push(`+ 'csp=' filters (${headers.length}): ${JSON.stringify(headers, replacer, 2)}`); - out.push(`+ 'removeparam=' filters (${removeparams.length}): ${JSON.stringify(removeparams, replacer, 2)}`); - out.push(`+ Unsupported filters (${unsupported.length}): ${JSON.stringify(unsupported, replacer, 2)}`); - out.push(`+ generichide exclusions (${network.generichideExclusions.length}): ${JSON.stringify(network.generichideExclusions, replacer, 2)}`); - if ( result.specificCosmetic ) { - out.push(`+ Cosmetic filters: ${result.specificCosmetic.size}`); - for ( const details of result.specificCosmetic ) { - out.push(` ${JSON.stringify(details)}`); - } - } else { - out.push(' Cosmetic filters: 0'); - } - callback(out.join('\n')); - }); - return; - } - default: break; } @@ -280,13 +162,6 @@ const onMessage = function(request, sender, callback) { µb.createUserFilters(request); break; - case 'forceUpdateAssets': - µb.scheduleAssetUpdater(0); - io.updateStart({ - delay: µb.hiddenSettings.manualUpdateAssetFetchPeriod - }); - break; - case 'getAppData': response = { name: browser.runtime.getManifest().name, @@ -383,14 +258,6 @@ const onMessage = function(request, sender, callback) { } break; - case 'snfeDump': - response = staticNetFilteringEngine.dump(); - break; - - case 'cfeDump': - response = cosmeticFilteringEngine.dump(); - break; - default: return vAPI.messaging.UNHANDLED; } @@ -1630,19 +1497,25 @@ const onMessage = function(request, sender, callback) { response = getRules(); break; - case 'purgeAllCaches': - if ( request.hard ) { - io.remove(/./); - } else { - io.purge(/./, 'public_suffix_list.dat'); - } - break; - - case 'purgeCaches': - for ( const assetKey of request.assetKeys ) { + case 'supportUpdateNow': { + const { assetKeys } = request; + if ( assetKeys.length === 0 ) { return; } + for ( const assetKey of assetKeys ) { io.purge(assetKey); } + µb.scheduleAssetUpdater({ now: true, fetchDelay: 100 }); break; + } + + case 'listsUpdateNow': { + const { assetKeys, preferOrigin = false } = request; + if ( assetKeys.length === 0 ) { return; } + for ( const assetKey of assetKeys ) { + io.purge(assetKey); + } + µb.scheduleAssetUpdater({ now: true, fetchDelay: 100, auto: preferOrigin !== true }); + break; + } case 'readHiddenSettings': response = { @@ -1660,6 +1533,10 @@ const onMessage = function(request, sender, callback) { resetUserData(); break; + case 'updateNow': + µb.scheduleAssetUpdater({ now: true, fetchDelay: 100, auto: true }); + break; + case 'writeHiddenSettings': µb.changeHiddenSettings(µb.hiddenSettingsFromString(request.content)); break; @@ -1944,6 +1821,181 @@ vAPI.messaging.listen({ /******************************************************************************/ /******************************************************************************/ +// Channel: +// devTools +// privileged + +{ +// >>>>> start of local scope + +const onMessage = function(request, sender, callback) { + // Async + switch ( request.what ) { + case 'purgeAllCaches': + µb.getBytesInUse().then(bytesInUseBefore => + io.remove(/./).then(( ) => + µb.getBytesInUse().then(bytesInUseAfter => { + callback([ + `Storage used before: ${µb.formatCount(bytesInUseBefore)}B`, + `Storage used after: ${µb.formatCount(bytesInUseAfter)}B`, + ].join('\n')); + }) + ) + ); + return; + + case 'snfeBenchmark': + µb.benchmarkStaticNetFiltering({ redirectEngine }).then(result => { + callback(result); + }); + return; + + case 'snfeToDNR': { + const listPromises = []; + const listNames = []; + for ( const assetKey of µb.selectedFilterLists ) { + listPromises.push( + io.get(assetKey, { dontCache: true }).then(details => { + listNames.push(assetKey); + return { name: assetKey, text: details.content }; + }) + ); + } + const options = { + extensionPaths: redirectEngine.getResourceDetails().filter(e => + typeof e[1].extensionPath === 'string' && e[1].extensionPath !== '' + ).map(e => + [ e[0], e[1].extensionPath ] + ), + env: vAPI.webextFlavor.env, + }; + const t0 = Date.now(); + dnrRulesetFromRawLists(listPromises, options).then(result => { + const { network } = result; + const replacer = (k, v) => { + if ( k.startsWith('__') ) { return; } + if ( Array.isArray(v) ) { + return v.sort(); + } + if ( v instanceof Object ) { + const sorted = {}; + for ( const kk of Object.keys(v).sort() ) { + sorted[kk] = v[kk]; + } + return sorted; + } + return v; + }; + const isUnsupported = rule => + rule._error !== undefined; + const isRegex = rule => + rule.condition !== undefined && + rule.condition.regexFilter !== undefined; + const isRedirect = rule => + rule.action !== undefined && + rule.action.type === 'redirect' && + rule.action.redirect.extensionPath !== undefined; + const isCsp = rule => + rule.action !== undefined && + rule.action.type === 'modifyHeaders'; + const isRemoveparam = rule => + rule.action !== undefined && + rule.action.type === 'redirect' && + rule.action.redirect.transform !== undefined; + const runtime = Date.now() - t0; + const { ruleset } = network; + const good = ruleset.filter(rule => + isUnsupported(rule) === false && + isRegex(rule) === false && + isRedirect(rule) === false && + isCsp(rule) === false && + isRemoveparam(rule) === false + ); + const unsupported = ruleset.filter(rule => + isUnsupported(rule) + ); + const regexes = ruleset.filter(rule => + isUnsupported(rule) === false && + isRegex(rule) && + isRedirect(rule) === false && + isCsp(rule) === false && + isRemoveparam(rule) === false + ); + const redirects = ruleset.filter(rule => + isUnsupported(rule) === false && + isRedirect(rule) + ); + const headers = ruleset.filter(rule => + isUnsupported(rule) === false && + isCsp(rule) + ); + const removeparams = ruleset.filter(rule => + isUnsupported(rule) === false && + isRemoveparam(rule) + ); + const out = [ + `dnrRulesetFromRawLists(${JSON.stringify(listNames, null, 2)})`, + `Run time: ${runtime} ms`, + `Filters count: ${network.filterCount}`, + `Accepted filter count: ${network.acceptedFilterCount}`, + `Rejected filter count: ${network.rejectedFilterCount}`, + `Un-DNR-able filter count: ${unsupported.length}`, + `Resulting DNR rule count: ${ruleset.length}`, + ]; + out.push(`+ Good filters (${good.length}): ${JSON.stringify(good, replacer, 2)}`); + out.push(`+ Regex-based filters (${regexes.length}): ${JSON.stringify(regexes, replacer, 2)}`); + out.push(`+ 'redirect=' filters (${redirects.length}): ${JSON.stringify(redirects, replacer, 2)}`); + out.push(`+ 'csp=' filters (${headers.length}): ${JSON.stringify(headers, replacer, 2)}`); + out.push(`+ 'removeparam=' filters (${removeparams.length}): ${JSON.stringify(removeparams, replacer, 2)}`); + out.push(`+ Unsupported filters (${unsupported.length}): ${JSON.stringify(unsupported, replacer, 2)}`); + out.push(`+ generichide exclusions (${network.generichideExclusions.length}): ${JSON.stringify(network.generichideExclusions, replacer, 2)}`); + if ( result.specificCosmetic ) { + out.push(`+ Cosmetic filters: ${result.specificCosmetic.size}`); + for ( const details of result.specificCosmetic ) { + out.push(` ${JSON.stringify(details)}`); + } + } else { + out.push(' Cosmetic filters: 0'); + } + callback(out.join('\n')); + }); + return; + } + default: + break; + } + + // Sync + let response; + + switch ( request.what ) { + case 'snfeDump': + response = staticNetFilteringEngine.dump(); + break; + + case 'cfeDump': + response = cosmeticFilteringEngine.dump(); + break; + + default: + return vAPI.messaging.UNHANDLED; + } + + callback(response); +}; + +vAPI.messaging.listen({ + name: 'devTools', + listener: onMessage, + privileged: true, +}); + +// <<<<< end of local scope +} + +/******************************************************************************/ +/******************************************************************************/ + // Channel: // scriptlets // unprivileged @@ -2122,12 +2174,11 @@ const onMessage = function(request, sender, callback) { io.purge(listkey); } } - µb.scheduleAssetUpdater(0); µb.openNewTab({ url: 'dashboard.html#3p-filters.html', select: true, }); - io.updateStart({ delay: 100, auto: request.manual !== true }); + µb.scheduleAssetUpdater({ now: true, fetchDelay: 100, auto: request.manual !== true }); break; default: diff --git a/src/js/start.js b/src/js/start.js index bc38f2b92..60186bd30 100644 --- a/src/js/start.js +++ b/src/js/start.js @@ -474,11 +474,7 @@ lz4Codec.relinquish(); // https://github.com/chrisaljoudi/uBlock/issues/184 // Check for updates not too far in the future. io.addObserver(µb.assetObserver.bind(µb)); -µb.scheduleAssetUpdater( - µb.userSettings.autoUpdate - ? µb.hiddenSettings.autoUpdateDelayAfterLaunch * 1000 - : 0 -); +µb.scheduleAssetUpdater(); // Force an update of the context menu according to the currently // active tab. diff --git a/src/js/storage.js b/src/js/storage.js index ab5cb01fd..b8f85b733 100644 --- a/src/js/storage.js +++ b/src/js/storage.js @@ -1497,17 +1497,28 @@ onBroadcast(msg => { const launchTimer = vAPI.defer.create(fetchDelay => { next = 0; - io.updateStart({ delay: fetchDelay, auto: true }); + io.updateStart({ fetchDelay, auto: true }); }); - µb.scheduleAssetUpdater = async function(updateDelay) { + µb.scheduleAssetUpdater = async function(details = {}) { launchTimer.off(); - if ( updateDelay === 0 ) { + if ( details.now ) { next = 0; + io.updateStart(details); return; } + if ( µb.userSettings.autoUpdate === false ) { + if ( details.updateDelay === undefined ) { + next = 0; + return; + } + } + + let updateDelay = details.updateDelay || + this.hiddenSettings.autoUpdatePeriod * 3600000; + const now = Date.now(); let needEmergencyUpdate = false; @@ -1632,13 +1643,7 @@ onBroadcast(msg => { } this.loadFilterLists(); } - if ( this.userSettings.autoUpdate ) { - this.scheduleAssetUpdater( - this.hiddenSettings.autoUpdatePeriod * 3600000 || 25200000 - ); - } else { - this.scheduleAssetUpdater(0); - } + this.scheduleAssetUpdater(); broadcast({ what: 'assetsUpdated', assetKeys: details.assetKeys diff --git a/src/js/support.js b/src/js/support.js index 05ebe60f6..9bfd7cbe3 100644 --- a/src/js/support.js +++ b/src/js/support.js @@ -255,8 +255,7 @@ async function updateFilterLists() { if ( dom.body.dataset.shouldUpdateLists === undefined ) { return false; } dom.cl.add(dom.body, 'updating'); const assetKeys = JSON.parse(dom.body.dataset.shouldUpdateLists); - vAPI.messaging.send('dashboard', { what: 'purgeCaches', assetKeys }); - vAPI.messaging.send('dashboard', { what: 'forceUpdateAssets' }); + vAPI.messaging.send('dashboard', { what: 'supportUpdateNow', assetKeys }); return true; } diff --git a/src/js/ublock.js b/src/js/ublock.js index 18a8b9403..e963377c3 100644 --- a/src/js/ublock.js +++ b/src/js/ublock.js @@ -345,7 +345,7 @@ const matchBucket = function(url, hostname, bucket, start) { } break; case 'autoUpdate': - this.scheduleAssetUpdater(value ? 7 * 60 * 1000 : 0); + this.scheduleAssetUpdater({ updateDelay: value ? 2000 : 0 }); break; case 'cnameUncloakEnabled': if ( vAPI.net.canUncloakCnames === true ) {