diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index 37393d5..ebb949f 100644
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -87,6 +87,14 @@
"message": "Show numbers of cleaned urls",
"description": "This string is used as title for the badges switch button on the popup page."
},
+ "popup_html_configs_whitelist_button_add": {
+ "message": "Whitelist Site",
+ "description": "This string is used as name for the whitelist button on the popup page."
+ },
+ "popup_html_configs_whitelist_button_remove": {
+ "message": "Remove from Whitelist",
+ "description": "This string is used as name for the whitelist button on the popup page."
+ },
"popup_html_statistics_head": {
"message": "Statistics",
"description": "This string is used as title for the statistics on the popup page."
@@ -179,6 +187,10 @@
"message": "The url to the rules.hash file (hash)",
"description": "This string is used as name for the rule.hash url label."
},
+ "setting_whitelist_list_label": {
+ "message": "Whitelisted sites",
+ "description": "This string is used as name for the whitelisted sites list label."
+ },
"setting_types_label": {
"message": "Request types (expert level)",
"description": "This string is used as name for the types label."
diff --git a/clearurls.js b/clearurls.js
index 66a4aee..d2665c3 100644
--- a/clearurls.js
+++ b/clearurls.js
@@ -47,6 +47,19 @@ function removeFieldsFormURL(provider, pureUrl, quiet = false, request = null) {
let rawRules = provider.getRawRules();
let urlObject = new URL(url);
+ /*
+ * Skip whitelisted sites
+ */
+ for (const site of storage.whitelist) {
+ if (url.indexOf(site) !== -1) {
+ return {
+ "changes": false,
+ "url": url,
+ "cancel": false
+ }
+ }
+ }
+
if (storage.localHostsSkipping && checkLocalURL(urlObject)) {
return {
"changes": false,
diff --git a/core_js/popup.js b/core_js/popup.js
index 343ce37..d5ec010 100644
--- a/core_js/popup.js
+++ b/core_js/popup.js
@@ -62,6 +62,34 @@ function changeStatistics()
elTotal.textContent = totalCounter.toLocaleString();
}
+/**
+* Set the whitelist button text
+*/
+function setWhitelistText()
+{
+ let element = document.getElementById('whitelist_btn');
+ let currentSite;
+ browser.tabs.query({active: true, currentWindow: true}, function(tabs) {
+ currentSite = tabs[0].url;
+ });
+
+ browser.runtime.sendMessage({
+ function: "getData",
+ params: ['whitelist']
+ }).then((data) => {
+ let siteFound = data.response.some(site => currentSite.indexOf(site) !== -1);
+ if (siteFound) {
+ element.classList.replace('btn-primary', 'btn-danger')
+ element.textContent = translate('popup_html_configs_whitelist_button_remove')
+ document.getElementById('whitelist_btn').onclick = () => {changeWhitelist(true)};
+ } else {
+ element.classList.replace('btn-danger', 'btn-primary')
+ element.textContent = translate('popup_html_configs_whitelist_button_add')
+ document.getElementById('whitelist_btn').onclick = () => {changeWhitelist(false)};
+ }
+ }).catch(handleError);
+}
+
/**
* Set the value for the hashStatus on startUp.
*/
@@ -155,6 +183,36 @@ function setSwitchButton(id, varname)
element.checked = this[varname];
}
+/**
+* Adds (or removes) the site the user is on to the whitelist
+* Whitelisted sites do not get filtered
+* @param {boolean} removeWl If true remove current site instead of adding
+*/
+function changeWhitelist(removeWl) {
+ let site;
+ browser.tabs.query({active: true, currentWindow: true}, function(tabs) { // Couldn't figure out how to access currentUrl var
+ site = tabs[0].url; // So this is used instead
+ });
+ browser.runtime.sendMessage({
+ function: "getData",
+ params: ['whitelist']
+ }).then((data) => {
+ let siteUrl = new URL(site)
+ let domain = siteUrl.hostname
+ if (removeWl) {
+ data.response = data.response.filter(wlSite => wlSite !== domain)
+ } else {
+ data.response.push(domain)
+ }
+ browser.runtime.sendMessage({
+ function: "setData",
+ params: ['whitelist', data.response]
+ }).then(() => {
+ setWhitelistText();
+ }).catch(handleError);
+ }).catch(handleError);
+}
+
/**
* Reset the global statistic
*/
@@ -220,6 +278,7 @@ function setText()
injectText('configs_switch_filter','popup_html_configs_switch_filter');
injectText('configs_head','popup_html_configs_head');
injectText('configs_switch_statistics','configs_switch_statistics');
+ setWhitelistText();
document.getElementById('donate').title = translate('donate_button');
}
diff --git a/core_js/settings.js b/core_js/settings.js
index 169366b..8e0a06e 100644
--- a/core_js/settings.js
+++ b/core_js/settings.js
@@ -82,6 +82,7 @@ function save() {
saveData("badged_color", pickr.getColor().toHEXA().toString())
.then(() => saveData("ruleURL", document.querySelector('input[name=ruleURL]').value))
.then(() => saveData("hashURL", document.querySelector('input[name=hashURL]').value))
+ .then(() => saveData("whitelist", document.querySelector('input[name=whitelist]').value.split(',')))
.then(() => saveData("types", document.querySelector('input[name=types]').value))
.then(() => saveData("logLimit", Math.max(0, Math.min(5000, document.querySelector('input[name=logLimit]').value))))
.then(() => browser.runtime.sendMessage({
@@ -122,6 +123,7 @@ function getData() {
loadData("ruleURL")
.then(() => loadData("hashURL"))
+ .then(() => loadData("whitelist"))
.then(() => loadData("types"))
.then(() => loadData("logLimit"))
.then(logData => {
@@ -216,6 +218,7 @@ function setText() {
document.getElementById('reset_settings_btn').setAttribute('title', translate('setting_html_reset_button_title'));
document.getElementById('rule_url_label').textContent = translate('setting_rule_url_label');
document.getElementById('hash_url_label').textContent = translate('setting_hash_url_label');
+ document.getElementById('whitelist_list_label').textContent = translate('setting_whitelist_list_label');
document.getElementById('types_label').innerHTML = translate('setting_types_label');
document.getElementById('save_settings_btn').textContent = translate('settings_html_save_button');
document.getElementById('save_settings_btn').setAttribute('title', translate('settings_html_save_button_title'));
diff --git a/core_js/storage.js b/core_js/storage.js
index ee552c6..323e79b 100644
--- a/core_js/storage.js
+++ b/core_js/storage.js
@@ -216,6 +216,7 @@ function initSettings() {
storage.badged_color = "#ffa500";
storage.hashURL = "https://rules2.clearurls.xyz/rules.minify.hash";
storage.ruleURL = "https://rules2.clearurls.xyz/data.minify.json";
+ storage.whitelist = []; // TODO: If we do whitelist per rule, this needs to be obj
storage.contextMenuEnabled = true;
storage.historyListenerEnabled = true;
storage.localHostsSkipping = true;
diff --git a/html/popup.html b/html/popup.html
index 5f10bf0..4f0bb41 100644
--- a/html/popup.html
+++ b/html/popup.html
@@ -86,6 +86,9 @@ along with this program. If not, see
+
+
+