diff options
Diffstat (limited to 'src/js')
-rw-r--r-- | src/js/about.js | 93 | ||||
-rw-r--r-- | src/js/background.js | 1 | ||||
-rw-r--r-- | src/js/dashboard.js | 2 | ||||
-rw-r--r-- | src/js/messaging.js | 17 | ||||
-rw-r--r-- | src/js/pagestore.js | 10 | ||||
-rw-r--r-- | src/js/popup.js | 24 | ||||
-rw-r--r-- | src/js/settings.js | 113 | ||||
-rw-r--r-- | src/js/storage.js | 5 |
8 files changed, 144 insertions, 121 deletions
diff --git a/src/js/about.js b/src/js/about.js index 2e2c5c7..66155c6 100644 --- a/src/js/about.js +++ b/src/js/about.js @@ -33,101 +33,8 @@ var messager = vAPI.messaging.channel('about.js'); /******************************************************************************/ -var exportToFile = function() { - var onUserDataReady = function(userData) { - if (!userData) { - return; - } - var now = new Date(); - var filename = vAPI.i18n('aboutBackupFilename') - .replace('{{datetime}}', now.toLocaleString()) - .replace(/ +/g, '_'); - vAPI.download({ - 'url': 'data:text/plain;charset=utf-8,' + encodeURIComponent(JSON.stringify(userData, null, ' ')), - 'filename': filename - }); - }; - - messager.send({ what: 'getUserData' }, onUserDataReady); -}; - -/******************************************************************************/ - -var handleImportFilePicker = function() { - var fileReaderOnLoadHandler = function() { - var userData; - try { - userData = JSON.parse(this.result); - if ( typeof userData !== 'object' ) { - throw 'Invalid'; - } - if ( typeof userData.userSettings !== 'object' ) { - throw 'Invalid'; - } - if ( typeof userData.netWhitelist !== 'string' ) { - throw 'Invalid'; - } - if ( typeof userData.filterLists !== 'object' ) { - throw 'Invalid'; - } - } - catch (e) { - userData = undefined; - } - if ( userData === undefined ) { - window.alert(vAPI.i18n('aboutRestoreDataError')); - return; - } - var time = new Date(userData.timeStamp); - var msg = vAPI.i18n('aboutRestoreDataConfirm') - .replace('{{time}}', time.toLocaleString()); - var proceed = window.confirm(msg); - if ( proceed ) { - messager.send({ what: 'restoreUserData', userData: userData }); - } - }; - - var file = this.files[0]; - if ( file === undefined || file.name === '' ) { - return; - } - if ( file.type.indexOf('text') !== 0 ) { - return; - } - var fr = new FileReader(); - fr.onload = fileReaderOnLoadHandler; - fr.readAsText(file); -}; - -/******************************************************************************/ - -var startImportFilePicker = function() { - var input = document.getElementById('restoreFilePicker'); - // Reset to empty string, this will ensure an change event is properly - // triggered if the user pick a file, even if it is the same as the last - // one picked. - input.value = ''; - input.click(); -}; - -/******************************************************************************/ - -var resetUserData = function() { - var msg = vAPI.i18n('aboutResetDataConfirm'); - var proceed = window.confirm(msg); - if ( proceed ) { - messager.send({ what: 'resetUserData' }); - } -}; - -/******************************************************************************/ - var onAppDataReady = function(appData) { uDom('#aboutNameVer').html(appData.name + ' v' + appData.version); - uDom('#export').on('click', exportToFile); - uDom('#import').on('click', startImportFilePicker); - uDom('#reset').on('click', resetUserData); - uDom('#restoreFilePicker').on('change', handleImportFilePicker); }; messager.send({ what: 'getAppData' }, onAppDataReady); diff --git a/src/js/background.js b/src/js/background.js index 4a98ab1..4306d65 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -52,6 +52,7 @@ var defaultExternalLists = [ return { userSettings: { + advancedUserEnabled: false, autoUpdate: true, collapseBlocked: true, contextMenuEnabled: true, diff --git a/src/js/dashboard.js b/src/js/dashboard.js index 6779f27..ba916e2 100644 --- a/src/js/dashboard.js +++ b/src/js/dashboard.js @@ -59,7 +59,7 @@ uDom.onLoad(function() { } } if ( !tab ) { - tab = '3p-filters'; + tab = 'settings'; } loadDashboardPanel(tab + '.html', q); uDom('.tabButton').on('click', onTabClickHandler); diff --git a/src/js/messaging.js b/src/js/messaging.js index aa95a7e..90ec132 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -171,17 +171,18 @@ var getDynamicFilterRules = function(srcHostname, desHostnames) { var getStats = function(tabId) { var r = { + advancedUserEnabled: µb.userSettings.advancedUserEnabled, appName: vAPI.app.name, appVersion: vAPI.app.version, - globalBlockedRequestCount: µb.localSettings.blockedRequestCount, + cosmeticFilteringSwitch: false, + dfEnabled: µb.userSettings.dynamicFilteringEnabled, globalAllowedRequestCount: µb.localSettings.allowedRequestCount, - tabId: tabId, + globalBlockedRequestCount: µb.localSettings.blockedRequestCount, + netFilteringSwitch: false, pageURL: '', - pageBlockedRequestCount: 0, pageAllowedRequestCount: 0, - netFilteringSwitch: false, - cosmeticFilteringSwitch: false, - dfEnabled: µb.userSettings.dynamicFilteringEnabled + pageBlockedRequestCount: 0, + tabId: tabId }; var pageStore = µb.pageStoreFromTabId(tabId); if ( pageStore ) { @@ -811,7 +812,7 @@ vAPI.messaging.listen('stats.js', onMessage); /******************************************************************************/ /******************************************************************************/ -// about.js +// settings.js (function() { @@ -902,7 +903,7 @@ var onMessage = function(request, sender, callback) { callback(response); }; -vAPI.messaging.listen('about.js', onMessage); +vAPI.messaging.listen('settings.js', onMessage); /******************************************************************************/ diff --git a/src/js/pagestore.js b/src/js/pagestore.js index 24cb3ec..f5f52bf 100644 --- a/src/js/pagestore.js +++ b/src/js/pagestore.js @@ -615,10 +615,12 @@ PageStore.prototype.filterRequest = function(context) { // - Evaluating dynamic filtering is much faster than static filtering // We evaluate dynamic filtering first, and hopefully we can skip // evaluation of static filtering. - var df = µb.dynamicNetFilteringEngine.clearRegisters(); - df.evaluateCellZY(context.rootHostname, context.requestHostname, context.requestType); - if ( df.mustBlockOrAllow() ) { - result = df.toFilterString(); + if ( µb.userSettings.advancedUserEnabled ) { + var df = µb.dynamicNetFilteringEngine.clearRegisters(); + df.evaluateCellZY(context.rootHostname, context.requestHostname, context.requestType); + if ( df.mustBlockOrAllow() ) { + result = df.toFilterString(); + } } // Static filtering never override dynamic filtering diff --git a/src/js/popup.js b/src/js/popup.js index 0d706bb..48775f4 100644 --- a/src/js/popup.js +++ b/src/js/popup.js @@ -117,7 +117,7 @@ var reRulekeyCompareNoise = /[^a-z0-9.]/g; var addDynamicFilterRow = function(des) { var row = uDom('#templates > div:nth-of-type(1)').clone(); row.descendants('[data-des]').attr('data-des', des); - row.descendants('div > span:nth-of-type(1)').text(des); + row.descendants('span:nth-of-type(1)').text(des); var hnDetails = popupData.hostnameDict[des] || {}; var isDomain = des === hnDetails.domain; @@ -245,16 +245,17 @@ var renderPopup = function() { var isHTTP = /^https?:\/\/[0-9a-z]/.test(popupData.pageURL); + // Condition for dynamic filtering toggler: + // - Advanced user + uDom('body').toggleClass('advancedUser', popupData.advancedUserEnabled); + // Conditions for request log: - // - `http` or `https` scheme + // - `http` or `https` scheme uDom('#gotoLog').toggleClass('enabled', isHTTP); // Conditions for element picker: - // - `http` or `https` scheme - uDom('#gotoPick').toggleClass( - 'enabled', - isHTTP - ); + // - `http` or `https` scheme + uDom('#gotoPick').toggleClass('enabled', isHTTP); var or = vAPI.i18n('popupOr'); var blocked = popupData.pageBlockedRequestCount; @@ -289,15 +290,15 @@ var renderPopup = function() { '%</span>' ); } + uDom('#total-blocked').html(html.join('')); // Build dynamic filtering pane only if in use - if ( popupData.dfEnabled ) { + if ( popupData.dfEnabled && popupData.advancedUserEnabled ) { syncAllDynamicFilters(); } - uDom('#total-blocked').html(html.join('')); uDom('#switch .fa').toggleClass('off', popupData.pageURL === '' || !popupData.netFilteringSwitch); - uDom('#panes').toggleClass('dfEnabled', popupData.dfEnabled); + uDom('#panes').toggleClass('dfEnabled', popupData.dfEnabled && popupData.advancedUserEnabled); }; /******************************************************************************/ @@ -373,6 +374,9 @@ var gotoLink = function(ev) { /******************************************************************************/ var toggleDynamicFiltering = function(ev) { + if ( uDom('body').hasClass('advancedUser') === false ) { + return; + } var el = uDom('#panes'); popupData.dfEnabled = !popupData.dfEnabled; messager.send({ diff --git a/src/js/settings.js b/src/js/settings.js index acd1625..cf9981b 100644 --- a/src/js/settings.js +++ b/src/js/settings.js @@ -20,11 +20,12 @@ */ /* global vAPI, uDom */ -'use strict'; /******************************************************************************/ -uDom.onLoad(function() { +(function() { + +'use strict'; /******************************************************************************/ @@ -32,6 +33,95 @@ var messager = vAPI.messaging.channel('settings.js'); /******************************************************************************/ +var exportToFile = function() { + var onUserDataReady = function(userData) { + if (!userData) { + return; + } + var now = new Date(); + var filename = vAPI.i18n('aboutBackupFilename') + .replace('{{datetime}}', now.toLocaleString()) + .replace(/ +/g, '_'); + vAPI.download({ + 'url': 'data:text/plain;charset=utf-8,' + encodeURIComponent(JSON.stringify(userData, null, ' ')), + 'filename': filename + }); + }; + + messager.send({ what: 'getUserData' }, onUserDataReady); +}; + +/******************************************************************************/ + +var handleImportFilePicker = function() { + var fileReaderOnLoadHandler = function() { + var userData; + try { + userData = JSON.parse(this.result); + if ( typeof userData !== 'object' ) { + throw 'Invalid'; + } + if ( typeof userData.userSettings !== 'object' ) { + throw 'Invalid'; + } + if ( typeof userData.netWhitelist !== 'string' ) { + throw 'Invalid'; + } + if ( typeof userData.filterLists !== 'object' ) { + throw 'Invalid'; + } + } + catch (e) { + userData = undefined; + } + if ( userData === undefined ) { + window.alert(vAPI.i18n('aboutRestoreDataError')); + return; + } + var time = new Date(userData.timeStamp); + var msg = vAPI.i18n('aboutRestoreDataConfirm') + .replace('{{time}}', time.toLocaleString()); + var proceed = window.confirm(msg); + if ( proceed ) { + messager.send({ what: 'restoreUserData', userData: userData }); + } + }; + + var file = this.files[0]; + if ( file === undefined || file.name === '' ) { + return; + } + if ( file.type.indexOf('text') !== 0 ) { + return; + } + var fr = new FileReader(); + fr.onload = fileReaderOnLoadHandler; + fr.readAsText(file); +}; + +/******************************************************************************/ + +var startImportFilePicker = function() { + var input = document.getElementById('restoreFilePicker'); + // Reset to empty string, this will ensure an change event is properly + // triggered if the user pick a file, even if it is the same as the last + // one picked. + input.value = ''; + input.click(); +}; + +/******************************************************************************/ + +var resetUserData = function() { + var msg = vAPI.i18n('aboutResetDataConfirm'); + var proceed = window.confirm(msg); + if ( proceed ) { + messager.send({ what: 'resetUserData' }); + } +}; + +/******************************************************************************/ + var changeUserSettings = function(name, value) { messager.send({ what: 'userSettings', @@ -63,15 +153,30 @@ var onUserSettingsReceived = function(details) { changeUserSettings('contextMenuEnabled', this.checked); }); + uDom('#advanced-user-enabled') + .prop('checked', details.advancedUserEnabled === true) + .on('change', function(){ + changeUserSettings('advancedUserEnabled', this.checked); + }); + uDom('#experimental-enabled') .prop('checked', details.experimentalEnabled === true) .on('change', function(){ changeUserSettings('experimentalEnabled', this.checked); }); -}; -messager.send({ what: 'userSettings' }, onUserSettingsReceived); + uDom('#export').on('click', exportToFile); + uDom('#import').on('click', startImportFilePicker); + uDom('#reset').on('click', resetUserData); + uDom('#restoreFilePicker').on('change', handleImportFilePicker); +}; /******************************************************************************/ +uDom.onLoad(function() { + messager.send({ what: 'userSettings' }, onUserSettingsReceived); }); + +/******************************************************************************/ + +})(); diff --git a/src/js/storage.js b/src/js/storage.js index 044ec86..b98a67c 100644 --- a/src/js/storage.js +++ b/src/js/storage.js @@ -670,11 +670,14 @@ µb.dynamicNetFilteringEngine.fromObsoleteSelfie(settings.dynamicFilteringSelfie); µb.userSettings.dynamicFilteringString = µb.dynamicNetFilteringEngine.toString(); µb.XAL.keyvalSetOne('dynamicFilteringString', µb.userSettings.dynamicFilteringString); + + // Auto-enable advanced user if there were dynamic rules + µb.userSettings.advancedUserEnabled = true; + µb.XAL.keyvalSetOne('advancedUserEnabled', true); } delete µb.userSettings.dynamicFilteringSelfie; µb.XAL.keyvalRemoveOne('dynamicFilteringSelfie'); } - µb.dynamicNetFilteringEngine.fromString(µb.userSettings.dynamicFilteringString); }; this.loadUserSettings(onUserSettingsReady); |