aboutsummaryrefslogtreecommitdiffstats
path: root/src/js
diff options
context:
space:
mode:
Diffstat (limited to 'src/js')
-rw-r--r--src/js/about.js93
-rw-r--r--src/js/background.js1
-rw-r--r--src/js/dashboard.js2
-rw-r--r--src/js/messaging.js17
-rw-r--r--src/js/pagestore.js10
-rw-r--r--src/js/popup.js24
-rw-r--r--src/js/settings.js113
-rw-r--r--src/js/storage.js5
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);