diff --git a/src/js/messaging.js b/src/js/messaging.js index 353803597..3ea332a4c 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -829,64 +829,59 @@ const backupUserData = async function() { return { localData, userData }; }; -const restoreUserData = function(request) { +const restoreUserData = async function(request) { const userData = request.userData; - const restart = function() { - vAPI.app.restart(); - }; - - let countdown = 2; - - const onAllRemoved = function() { - countdown -= 1; - if ( countdown !== 0 ) { return; } - µBlock.saveLocalSettings(); - vAPI.storage.set(userData.userSettings); - let hiddenSettings = userData.hiddenSettings; - if ( hiddenSettings instanceof Object === false ) { - hiddenSettings = µBlock.hiddenSettingsFromString( - userData.hiddenSettingsString || '' - ); - } - // Whitelist directives can be represented as an array or as a - // (eventually to be deprecated) string. - let whitelist = userData.whitelist; - if ( - Array.isArray(whitelist) === false && - typeof userData.netWhitelist === 'string' && - userData.netWhitelist !== '' - ) { - whitelist = userData.netWhitelist.split('\n'); - } - vAPI.storage.set({ - hiddenSettings: hiddenSettings, - netWhitelist: whitelist || [], - dynamicFilteringString: userData.dynamicFilteringString || '', - urlFilteringString: userData.urlFilteringString || '', - hostnameSwitchesString: userData.hostnameSwitchesString || '', - lastRestoreFile: request.file || '', - lastRestoreTime: Date.now(), - lastBackupFile: '', - lastBackupTime: 0 - }); - µb.saveUserFilters(userData.userFilters); - if ( Array.isArray(userData.selectedFilterLists) ) { - µb.saveSelectedFilterLists(userData.selectedFilterLists, restart); - } else { - restart(); - } - }; - // https://github.com/chrisaljoudi/uBlock/issues/1102 - // Ensure all currently cached assets are flushed from storage AND memory. + // Ensure all currently cached assets are flushed from storage AND memory. µb.assets.rmrf(); // If we are going to restore all, might as well wipe out clean local - // storage - µb.cacheStorage.clear().then(( ) => { onAllRemoved(); }); - vAPI.storage.clear(onAllRemoved); + // storages vAPI.localStorage.removeItem('immediateHiddenSettings'); + await Promise.all([ + µb.cacheStorage.clear(), + vAPI.storage.clear(), + ]); + + // Restore block stats + µBlock.saveLocalSettings(); + + // Restore user data + vAPI.storage.set(userData.userSettings); + let hiddenSettings = userData.hiddenSettings; + if ( hiddenSettings instanceof Object === false ) { + hiddenSettings = µBlock.hiddenSettingsFromString( + userData.hiddenSettingsString || '' + ); + } + // Whitelist directives can be represented as an array or as a + // (eventually to be deprecated) string. + let whitelist = userData.whitelist; + if ( + Array.isArray(whitelist) === false && + typeof userData.netWhitelist === 'string' && + userData.netWhitelist !== '' + ) { + whitelist = userData.netWhitelist.split('\n'); + } + vAPI.storage.set({ + hiddenSettings: hiddenSettings, + netWhitelist: whitelist || [], + dynamicFilteringString: userData.dynamicFilteringString || '', + urlFilteringString: userData.urlFilteringString || '', + hostnameSwitchesString: userData.hostnameSwitchesString || '', + lastRestoreFile: request.file || '', + lastRestoreTime: Date.now(), + lastBackupFile: '', + lastBackupTime: 0 + }); + µb.saveUserFilters(userData.userFilters); + if ( Array.isArray(userData.selectedFilterLists) ) { + await µb.saveSelectedFilterLists(userData.selectedFilterLists); + } + + vAPI.app.restart(); }; // Remove all stored data but keep global counts, people can become diff --git a/src/js/storage.js b/src/js/storage.js index 7e80f1c3e..6b7cc9647 100644 --- a/src/js/storage.js +++ b/src/js/storage.js @@ -120,7 +120,7 @@ // This way the new default values in the future will properly apply for those // which were not modified by the user. -µBlock.saveHiddenSettings = function(callback) { +µBlock.saveHiddenSettings = function() { const bin = { hiddenSettings: {} }; for ( const prop in this.hiddenSettings ) { if ( @@ -130,7 +130,7 @@ bin.hiddenSettings[prop] = this.hiddenSettings[prop]; } } - vAPI.storage.set(bin, callback); + vAPI.storage.set(bin); this.saveImmediateHiddenSettings(); self.log.verbosity = this.hiddenSettings.consoleLogLevel; }; @@ -260,11 +260,7 @@ this.saveSelectedFilterLists(this.autoSelectRegionalFilterLists(lists)); }; -µBlock.saveSelectedFilterLists = function(newKeys, append, callback) { - if ( typeof append === 'function' ) { - callback = append; - append = false; - } +µBlock.saveSelectedFilterLists = function(newKeys, append = false) { const oldKeys = this.selectedFilterLists.slice(); if ( append ) { newKeys = newKeys.concat(oldKeys); @@ -278,12 +274,12 @@ } newKeys = Array.from(newSet); this.selectedFilterLists = newKeys; - vAPI.storage.set({ selectedFilterLists: newKeys }, callback); + return vAPI.storage.set({ selectedFilterLists: newKeys }); }; /******************************************************************************/ -µBlock.applyFilterListSelection = function(details, callback) { +µBlock.applyFilterListSelection = function(details) { let selectedListKeySet = new Set(this.selectedFilterLists); let externalLists = this.userSettings.externalLists; @@ -360,9 +356,6 @@ vAPI.storage.set({ externalLists: externalLists }); } this.saveSelectedFilterLists(result); - if ( typeof callback === 'function' ) { - callback(result); - } }; /******************************************************************************/ @@ -1032,16 +1025,17 @@ // be generated if the user doesn't change his filter lists selection for // some set time. -µBlock.selfieManager = (function() { +µBlock.selfieManager = (( ) => { const µb = µBlock; - let timer; + let createTimer; + let destroyTimer; // As of 2018-05-31: // JSON.stringify-ing ourselves results in a better baseline // memory usage at selfie-load time. For some reasons. - const create = function() { - Promise.all([ + const create = async function() { + await Promise.all([ µb.assets.put( 'selfie/main', JSON.stringify({ @@ -1052,9 +1046,8 @@ µb.redirectEngine.toSelfie('selfie/redirectEngine'), µb.staticExtFilteringEngine.toSelfie('selfie/staticExtFilteringEngine'), µb.staticNetFilteringEngine.toSelfie('selfie/staticNetFilteringEngine'), - ]).then(( ) => { - µb.lz4Codec.relinquish(); - }); + ]); + µb.lz4Codec.relinquish(); }; const load = async function() { @@ -1096,19 +1089,30 @@ }; const destroy = function() { - if ( timer !== undefined ) { - clearTimeout(timer); - timer = undefined; - } µb.cacheStorage.remove('selfie'); // TODO: obsolete, remove eventually. µb.assets.remove(/^selfie\//); - timer = vAPI.setTimeout(( ) => { - timer = undefined; + createTimer = vAPI.setTimeout(( ) => { + createTimer = undefined; create(); }, µb.hiddenSettings.selfieAfter * 60000); }; - return { load, destroy }; + const destroyAsync = function() { + if ( destroyTimer !== undefined ) { return; } + if ( createTimer !== undefined ) { + clearTimeout(createTimer); + createTimer = undefined; + } + destroyTimer = vAPI.setTimeout( + ( ) => { + destroyTimer = undefined; + destroy(); + }, + 1019 + ); + }; + + return { load, destroy: destroyAsync }; })(); /******************************************************************************/