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 37393d55..f0736dc4 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 4a616a00..dc75cf7c 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 67f12993..d49c8ef1 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 ccfb980f..bb2fddab 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 7a373867..298aa80d 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 dc75cf7c..2785b528 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); } }