From a81d2a759bd89ae1591ff7f557fabddfae1bc349 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 21 Feb 2018 13:29:36 -0500 Subject: [PATCH] fix #3318, #3387 --- src/js/background.js | 4 ++- src/js/messaging.js | 16 +++++++--- src/js/storage.js | 73 ++++++++++++++++++++++++++++++++++++++------ 3 files changed, 78 insertions(+), 15 deletions(-) diff --git a/src/js/background.js b/src/js/background.js index ec6f6bb61..e0e444988 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -75,7 +75,7 @@ var µBlock = (function() { // jshint ignore:line hiddenSettingsDefault: hiddenSettingsDefault, hiddenSettings: (function() { var out = objectAssign({}, hiddenSettingsDefault), - json = vAPI.localStorage.getItem('hiddenSettings'); + json = vAPI.localStorage.getItem('immediateHiddenSettings'); if ( typeof json === 'string' ) { try { var o = JSON.parse(json); @@ -90,6 +90,8 @@ var µBlock = (function() { // jshint ignore:line catch(ex) { } } + // Remove once 1.15.12+ is widespread. + vAPI.localStorage.removeItem('hiddenSettings'); return out; })(), diff --git a/src/js/messaging.js b/src/js/messaging.js index c38ab15d3..7e9ee7f10 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -730,7 +730,7 @@ var backupUserData = function(callback) { version: vAPI.app.version, userSettings: µb.userSettings, selectedFilterLists: µb.selectedFilterLists, - hiddenSettingsString: µb.stringFromHiddenSettings(), + hiddenSettings: µb.hiddenSettings, netWhitelist: µb.stringFromWhitelist(µb.netWhitelist), dynamicFilteringString: µb.permanentFirewall.toString(), urlFilteringString: µb.permanentURLFiltering.toString(), @@ -764,8 +764,14 @@ var restoreUserData = function(request) { var onAllRemoved = function() { µBlock.saveLocalSettings(); vAPI.storage.set(userData.userSettings); - µb.hiddenSettingsFromString(userData.hiddenSettingsString || ''); + var hiddenSettings = userData.hiddenSettings; + if ( hiddenSettings instanceof Object === false ) { + hiddenSettings = µBlock.hiddenSettingsFromString( + userData.hiddenSettingsString || '' + ); + } vAPI.storage.set({ + hiddenSettings: hiddenSettings, netWhitelist: userData.netWhitelist || '', dynamicFilteringString: userData.dynamicFilteringString || '', urlFilteringString: userData.urlFilteringString || '', @@ -791,12 +797,13 @@ var restoreUserData = function(request) { // storage vAPI.cacheStorage.clear(); vAPI.storage.clear(onAllRemoved); + vAPI.localStorage.removeItem('immediateHiddenSettings'); }; var resetUserData = function() { vAPI.cacheStorage.clear(); vAPI.storage.clear(); - vAPI.localStorage.removeItem('hiddenSettings'); + vAPI.localStorage.removeItem('immediateHiddenSettings'); // Keep global counts, people can become quite attached to numbers µb.saveLocalSettings(); @@ -988,7 +995,8 @@ var onMessage = function(request, sender, callback) { break; case 'writeHiddenSettings': - µb.hiddenSettingsFromString(request.content); + µb.hiddenSettings = µb.hiddenSettingsFromString(request.content); + µb.saveHiddenSettings(); break; default: diff --git a/src/js/storage.js b/src/js/storage.js index 8e2311775..c4f06d039 100644 --- a/src/js/storage.js +++ b/src/js/storage.js @@ -80,7 +80,48 @@ /******************************************************************************/ -// For now, only boolean type is supported. +µBlock.loadHiddenSettings = function() { + var onLoaded = function(bin) { + if ( bin instanceof Object === false ) { return; } + var µb = µBlock, + hs = bin.hiddenSettings; + // Remove following condition once 1.15.12+ is widespread. + if ( + hs instanceof Object === false && + typeof bin.hiddenSettingsString === 'string' + ) { + vAPI.storage.remove('hiddenSettingsString'); + hs = µBlock.hiddenSettingsFromString(bin.hiddenSettingsString); + } + if ( hs instanceof Object ) { + var hsDefault = µb.hiddenSettingsDefault; + for ( var key in hsDefault ) { + if ( + hsDefault.hasOwnProperty(key) && + hs.hasOwnProperty(key) && + typeof hs[key] === typeof hsDefault[key] + ) { + µb.hiddenSettings[key] = hs[key]; + } + } + } + if ( vAPI.localStorage.getItem('immediateHiddenSettings') === null ) { + µb.saveImmediateHiddenSettings(); + } + }; + + vAPI.storage.get( + [ 'hiddenSettings', 'hiddenSettingsString'], + onLoaded + ); +}; + +µBlock.saveHiddenSettings = function(callback) { + vAPI.storage.set({ hiddenSettings: this.hiddenSettings, callback }); + this.saveImmediateHiddenSettings(); +}; + +/******************************************************************************/ µBlock.hiddenSettingsFromString = function(raw) { var out = objectAssign({}, this.hiddenSettingsDefault), @@ -114,19 +155,13 @@ break; } } - this.hiddenSettings = out; - vAPI.localStorage.setItem('hiddenSettings', JSON.stringify(out)); - vAPI.storage.set({ hiddenSettingsString: this.stringFromHiddenSettings() }); + return out; }; -/******************************************************************************/ - µBlock.stringFromHiddenSettings = function() { var out = [], - keys = Object.keys(this.hiddenSettings).sort(), - key; - for ( var i = 0; i < keys.length; i++ ) { - key = keys[i]; + keys = Object.keys(this.hiddenSettings).sort(); + for ( var key of keys ) { out.push(key + ' ' + this.hiddenSettings[key]); } return out.join('\n'); @@ -134,6 +169,24 @@ /******************************************************************************/ +// These settings must be available immediately on startup, without delay +// through the vAPI.localStorage. Add/remove settings as needed. + +µBlock.saveImmediateHiddenSettings = function() { + vAPI.localStorage.setItem( + 'immediateHiddenSettings', + JSON.stringify({ + suspendTabsUntilReady: this.hiddenSettings.suspendTabsUntilReady, + userResourcesLocation: this.hiddenSettings.userResourcesLocation + }) + ); +}; + +// Do this here to have these hidden settings loaded ASAP. +µBlock.loadHiddenSettings(); + +/******************************************************************************/ + µBlock.savePermanentFirewallRules = function() { this.keyvalSetOne('dynamicFilteringString', this.permanentFirewall.toString()); };