From 098903850c0951125d727a2743c522dd29af186e Mon Sep 17 00:00:00 2001 From: Finn Krein Date: Wed, 9 Dec 2020 09:12:40 +0000 Subject: [PATCH] Add option to whitelist domain from containment (#108) * Add option to whitelist domain from containment * Use textarea for input of whitelisted domains Before we used a simple text input, which wasn't able to contain multiple lines --- background.js | 25 +++++++++++++++++++++++++ options.html | 10 ++++++++++ options.js | 25 ++++++++++++++++++++++++- 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/background.js b/background.js index 6213727..a54db9d 100644 --- a/background.js +++ b/background.js @@ -53,6 +53,7 @@ const canceledRequests = {}; const tabsWaitingToLoad = {}; const googleHostREs = []; const youtubeHostREs = []; +const whitelistedHostREs = []; async function isMACAddonEnabled () { try { @@ -161,6 +162,15 @@ function generateGoogleHostREs () { } } +function generateWhitelistedHostREs () { + if (whitelistedHostREs.length != 0) {return;} + const matchOperatorsRegex = /[|\\{}()[\]^$+*?.-]/g; + for (let whitelistedDomain of extensionSettings.whitelist) { + whitelistedDomain = whitelistedDomain.replace(matchOperatorsRegex, '\\$&'); + whitelistedHostREs.push(new RegExp(`(^|\\.)${whitelistedDomain}$`)); + } +} + async function loadExtensionSettings () { extensionSettings = await browser.storage.sync.get(); } @@ -264,6 +274,17 @@ function isYouTubeURL (url) { return false; } +function isWhitelistedURL (url) { + generateWhitelistedHostREs(); + const parsedUrl = new URL(url); + for (let whitelistedHostRE of whitelistedHostREs) { + if (whitelistedHostRE.test(parsedUrl.host)) { + return true; + } + } + return false; +} + function isSearchPageURL (url) { const parsedUrl = new URL(url); return parsedUrl.pathname.startsWith('/search'); @@ -321,6 +342,10 @@ function shouldContainInto (url, tab) { handleUrl = false; } + if (handleUrl && extensionSettings.whitelist.length!=0 && isWhitelistedURL(url)) { + handleUrl = false; + } + if (handleUrl) { if (tab.cookieStoreId !== googleCookieStoreId) { if (tab.cookieStoreId !== "firefox-default" && extensionSettings.dont_override_containers) { diff --git a/options.html b/options.html index 82c4f54..a5f3ddd 100644 --- a/options.html +++ b/options.html @@ -62,6 +62,16 @@

Settings

+

+ +

+
diff --git a/options.js b/options.js index d1f3c79..7acd12f 100644 --- a/options.js +++ b/options.js @@ -1,3 +1,24 @@ +function validate_whitelist() { + domain_regex = /^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$/; + whitelist_element = document.querySelector("#whitelist"); + if (whitelist_element.value == "") {return [];} + whitelist_domains = whitelist_element.value.split("\n"); + validated_domains = []; + for (whitelist_domain of whitelist_domains) { + if (whitelist_domain == "") {continue;} + if (whitelist_domain.match(domain_regex)) {validated_domains.push(whitelist_domain); continue;} + alert("'" + whitelist_domain + "' is not a valid domain."); + return []; + } + return validated_domains; +} + +function fill_whitelist_option(stored_whitelist) { + whitelist_text = stored_whitelist.join("\n"); + document.querySelector("#whitelist").value = whitelist_text ? whitelist_text : ""; +} + + function onOptionsPageSave(e) { e.preventDefault(); @@ -9,7 +30,8 @@ function onOptionsPageSave(e) "ignore_prefpages": document.querySelector("#ignore_prefpages").checked, "ignore_maps": document.querySelector("#ignore_maps").checked, "ignore_flights": document.querySelector("#ignore_flights").checked, - "dont_override_containers": document.querySelector("#dont_override_containers").checked + "dont_override_containers": document.querySelector("#dont_override_containers").checked, + "whitelist": validate_whitelist() }); browser.runtime.reload(); @@ -27,6 +49,7 @@ function onOptionsPageLoaded() document.querySelector("#ignore_maps").checked = res.ignore_maps || false; document.querySelector("#ignore_flights").checked = res.ignore_flights || false; document.querySelector("#dont_override_containers").checked = res.dont_override_containers || false; + fill_whitelist_option(res.whitelist); }); }