From adb399f8ba09789bc1f313bd09979a5985d978b5 Mon Sep 17 00:00:00 2001
From: kgmt0
Date: Fri, 26 Aug 2022 02:53:27 +0700
Subject: [PATCH 1/2] Add support for custom rules
This adds a textarea in the settings page that can be used to enter
custom rules in the same format as data.json. These rules are applied on
top of the ones from data.json.
---
_locales/en/messages.json | 6 ++-
clearurls.js | 85 +++++++++++++++++++++------------------
core_js/settings.js | 16 +++++++-
core_js/storage.js | 3 ++
html/settings.html | 5 +++
5 files changed, 72 insertions(+), 43 deletions(-)
diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index 37393d5..f0736dc 100644
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -167,6 +167,10 @@
"message": "The url to the data.json file (rules)",
"description": "This string is used as name for the rule url label."
},
+ "setting_custom_rules_label": {
+ "message": "Custom rules",
+ "description": "This string is used as name for the custom rules label."
+ },
"settings_html_save_button": {
"message": "Save & reload addon",
"description": "This string is used as name for the save&reload button on the settings page."
@@ -375,4 +379,4 @@
"message": " ",
"description": "not needed, only to prevent exceptions"
}
-}
\ No newline at end of file
+}
diff --git a/clearurls.js b/clearurls.js
index 4a616a0..dc75cf7 100644
--- a/clearurls.js
+++ b/clearurls.js
@@ -182,51 +182,51 @@ function start() {
* Initialize the providers form the JSON object.
*
*/
- function createProviders() {
- let data = storage.ClearURLsData;
-
+ function createProviders(data) {
for (let p = 0; p < prvKeys.length; p++) {
- //Create new provider
- providers.push(new Provider(prvKeys[p], data.providers[prvKeys[p]].getOrDefault('completeProvider', false),
- data.providers[prvKeys[p]].getOrDefault('forceRedirection', false)));
-
- //Add URL Pattern
- providers[p].setURLPattern(data.providers[prvKeys[p]].getOrDefault('urlPattern', ''));
-
- let rules = data.providers[prvKeys[p]].getOrDefault('rules', []);
- //Add rules to provider
- for (let r = 0; r < rules.length; r++) {
- providers[p].addRule(rules[r]);
- }
+ if (prvKeys[p] in data.providers) {
+ //Create new provider
+ providers.push(new Provider(prvKeys[p], data.providers[prvKeys[p]].getOrDefault('completeProvider', false),
+ data.providers[prvKeys[p]].getOrDefault('forceRedirection', false)));
+
+ //Add URL Pattern
+ providers[p].setURLPattern(data.providers[prvKeys[p]].getOrDefault('urlPattern', ''));
+
+ let rules = data.providers[prvKeys[p]].getOrDefault('rules', []);
+ //Add rules to provider
+ for (let r = 0; r < rules.length; r++) {
+ providers[p].addRule(rules[r]);
+ }
- let rawRules = data.providers[prvKeys[p]].getOrDefault('rawRules', []);
- //Add raw rules to provider
- for (let raw = 0; raw < rawRules.length; raw++) {
- providers[p].addRawRule(rawRules[raw]);
- }
+ let rawRules = data.providers[prvKeys[p]].getOrDefault('rawRules', []);
+ //Add raw rules to provider
+ for (let raw = 0; raw < rawRules.length; raw++) {
+ providers[p].addRawRule(rawRules[raw]);
+ }
- let referralMarketingRules = data.providers[prvKeys[p]].getOrDefault('referralMarketing', []);
- //Add referral marketing rules to provider
- for (let referralMarketing = 0; referralMarketing < referralMarketingRules.length; referralMarketing++) {
- providers[p].addReferralMarketing(referralMarketingRules[referralMarketing]);
- }
+ let referralMarketingRules = data.providers[prvKeys[p]].getOrDefault('referralMarketing', []);
+ //Add referral marketing rules to provider
+ for (let referralMarketing = 0; referralMarketing < referralMarketingRules.length; referralMarketing++) {
+ providers[p].addReferralMarketing(referralMarketingRules[referralMarketing]);
+ }
- let exceptions = data.providers[prvKeys[p]].getOrDefault('exceptions', []);
- //Add exceptions to provider
- for (let e = 0; e < exceptions.length; e++) {
- providers[p].addException(exceptions[e]);
- }
+ let exceptions = data.providers[prvKeys[p]].getOrDefault('exceptions', []);
+ //Add exceptions to provider
+ for (let e = 0; e < exceptions.length; e++) {
+ providers[p].addException(exceptions[e]);
+ }
- let redirections = data.providers[prvKeys[p]].getOrDefault('redirections', []);
- //Add redirections to provider
- for (let re = 0; re < redirections.length; re++) {
- providers[p].addRedirection(redirections[re]);
- }
+ let redirections = data.providers[prvKeys[p]].getOrDefault('redirections', []);
+ //Add redirections to provider
+ for (let re = 0; re < redirections.length; re++) {
+ providers[p].addRedirection(redirections[re]);
+ }
- let methods = data.providers[prvKeys[p]].getOrDefault('methods', []);
- //Add HTTP methods list to provider
- for (let re = 0; re < methods.length; re++) {
- providers[p].addMethod(methods[re]);
+ let methods = data.providers[prvKeys[p]].getOrDefault('methods', []);
+ //Add HTTP methods list to provider
+ for (let re = 0; re < methods.length; re++) {
+ providers[p].addMethod(methods[re]);
+ }
}
}
}
@@ -239,7 +239,12 @@ function start() {
*/
function toObject(retrievedText) {
getKeys(storage.ClearURLsData.providers);
- createProviders();
+ createProviders(storage.ClearURLsData);
+
+ if("providers" in storage.customRules) {
+ getKeys(storage.customRules.providers);
+ createProviders(storage.customRules);
+ }
}
/**
diff --git a/core_js/settings.js b/core_js/settings.js
index 67f1299..d49c8ef 100644
--- a/core_js/settings.js
+++ b/core_js/settings.js
@@ -82,6 +82,10 @@ 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(
+ "customRules",
+ document.querySelector('textarea[name=customRules]').value
+ ), handleError)
.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 +126,7 @@ function getData() {
loadData("ruleURL")
.then(() => loadData("hashURL"))
+ .then(() => loadData("customRules"))
.then(() => loadData("types"))
.then(() => loadData("logLimit"))
.then(logData => {
@@ -163,10 +168,16 @@ async function loadData(name) {
params: [name]
}).then(data => {
settings[name] = data.response;
- if (document.querySelector('input[id=' + name + ']') == null) {
+ if (document.querySelector('*[id=' + name + ']') == null) {
console.debug(name)
}
- document.querySelector('input[id=' + name + ']').value = data.response;
+ switch (name) {
+ case "customRules":
+ document.querySelector('*[id=' + name + ']').value = JSON.stringify(data.response);
+ break;
+ default:
+ document.querySelector('*[id=' + name + ']').value = data.response;
+ }
resolve(data);
}, handleError);
});
@@ -202,6 +213,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('custom_rules_label').textContent = translate('setting_custom_rules_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 ccfb980..bb2fdda 100644
--- a/core_js/storage.js
+++ b/core_js/storage.js
@@ -55,6 +55,7 @@ function storageDataAsString(key) {
switch (key) {
case "ClearURLsData":
case "log":
+ case "customRules":
return JSON.stringify(value);
case "types":
return value.toString();
@@ -152,6 +153,7 @@ function getEntireData() {
*/
function setData(key, value) {
switch (key) {
+ case "customRules":
case "ClearURLsData":
case "log":
storage[key] = JSON.parse(value);
@@ -216,6 +218,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.customRules = {};
storage.contextMenuEnabled = true;
storage.historyListenerEnabled = true;
storage.localHostsSkipping = true;
diff --git a/html/settings.html b/html/settings.html
index 7a37386..298aa80 100644
--- a/html/settings.html
+++ b/html/settings.html
@@ -105,6 +105,11 @@
+
+
+
+
+
From 5dcb14eaa8eda78b6caf283c453b3676d44adbda Mon Sep 17 00:00:00 2001
From: kgmt0
Date: Fri, 26 Aug 2022 02:56:40 +0700
Subject: [PATCH 2/2] Make start.getKeys() in clearurls.js ignore method names
start.getKeys() was using a for...in loop to iterate over fields in the
given object, meaning that methods names (e.g. getOrDefault()) get
included in the iteration as well. This causes erroneous entries to be
added the global list of providers. Fix this by using Object.keys() to
extract field names and iterate over that instead.
---
clearurls.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clearurls.js b/clearurls.js
index dc75cf7..2785b52 100644
--- a/clearurls.js
+++ b/clearurls.js
@@ -173,7 +173,7 @@ function start() {
* @param {object} obj
*/
function getKeys(obj) {
- for (const key in obj) {
+ for (const key of Object.keys(obj)) {
prvKeys.push(key);
}
}