diff --git a/src/js/messaging.js b/src/js/messaging.js index 93151f731..595e8e5b2 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -974,16 +974,19 @@ var getLocalData = function(callback) { /******************************************************************************/ var backupUserData = function(callback) { - var onUserFiltersReady = function(details) { - var userData = { - timeStamp: Date.now(), - version: vAPI.app.version, - userSettings: µb.userSettings, - filterLists: µb.extractSelectedFilterLists(), - netWhitelist: µb.stringFromWhitelist(µb.netWhitelist), - dynamicFilteringString: µb.permanentFirewall.toString(), - userFilters: details.content - }; + var userData = { + timeStamp: Date.now(), + version: vAPI.app.version, + userSettings: µb.userSettings, + filterLists: {}, + netWhitelist: µb.stringFromWhitelist(µb.netWhitelist), + dynamicFilteringString: µb.permanentFirewall.toString(), + userFilters: '' + }; + + var onSelectedListsReady = function(filterLists) { + userData.filterLists = filterLists; + var now = new Date(); var filename = vAPI.i18n('aboutBackupFilename') .replace('{{datetime}}', now.toLocaleString()) @@ -1001,6 +1004,12 @@ var backupUserData = function(callback) { getLocalData(callback); }; + var onUserFiltersReady = function(details) { + userData.userFilters = details.content; + µb.extractSelectedFilterLists(onSelectedListsReady); + }; + + µb.assets.get('assets/user/filters.txt', onUserFiltersReady); }; @@ -1050,7 +1059,7 @@ var restoreUserData = function(request) { /******************************************************************************/ var resetUserData = function() { - vAPI.storage.clear(onAllRemoved); + vAPI.storage.clear(); // Keep global counts, people can become quite attached to numbers µb.saveLocalSettings(true); diff --git a/src/js/storage.js b/src/js/storage.js index 833e84149..cbc825077 100644 --- a/src/js/storage.js +++ b/src/js/storage.js @@ -102,19 +102,40 @@ // This will remove all unused filter list entries from // µBlock.remoteBlacklists`. This helps reduce the size of backup files. -µBlock.extractSelectedFilterLists = function() { - var r = JSON.parse(JSON.stringify(this.remoteBlacklists)); +µBlock.extractSelectedFilterLists = function(callback) { + var µb = this; - for ( var path in r ) { - if ( r.hasOwnProperty(path) === false ) { - continue; + var onBuiltinListsLoaded = function(details) { + var builtin; + try { + builtin = JSON.parse(details.content); + } catch (e) { + builtin = {}; } - if ( r[path].off !== false ) { - delete r[path]; - } - } - return r; + var result = JSON.parse(JSON.stringify(µb.remoteBlacklists)); + var builtinPath; + var defaultState; + + for ( var path in result ) { + if ( result.hasOwnProperty(path) === false ) { + continue; + } + builtinPath = path.replace(/^assets\/thirdparties\//, ''); + defaultState = builtin.hasOwnProperty(builtinPath) === false || + builtin[builtinPath].off === true; + if ( result[path].off === true && result[path].off === defaultState ) { + delete result[path]; + } + } + + callback(result); + }; + + // https://github.com/gorhill/uBlock/issues/63 + // Get built-in block lists: this will help us determine whether a + // specific list must be included in the result. + this.assets.get('assets/ublock/filter-lists.json', onBuiltinListsLoaded); }; /******************************************************************************/