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);
});
}