diff --git a/background.js b/background.js
index f27541db..96c6a146 100644
--- a/background.js
+++ b/background.js
@@ -61,6 +61,7 @@ let osmInstance;
let alwaysProxy;
let onlyEmbeddedVideo;
let videoQuality;
+let whitelist;
window.browser = window.browser || window.chrome;
@@ -76,7 +77,8 @@ browser.storage.sync.get(
'disableOsm',
'alwaysProxy',
'onlyEmbeddedVideo',
- 'videoQuality'
+ 'videoQuality',
+ 'whitelist'
],
result => {
disableNitter = result.disableNitter;
@@ -90,6 +92,8 @@ browser.storage.sync.get(
alwaysProxy = result.alwaysProxy;
onlyEmbeddedVideo = result.onlyEmbeddedVideo;
videoQuality = result.videoQuality;
+ whitelist = result.whitelist.map(e => new RegExp(e));
+ console.log(whitelist);
}
);
@@ -127,6 +131,10 @@ browser.storage.onChanged.addListener(changes => {
if ('videoQuality' in changes) {
videoQuality = changes.videoQuality.newValue;
}
+ if ('whitelist' in changes) {
+ whitelist = changes.whitelist.newValue.map(e => new RegExp(e));
+ console.log(whitelist);
+ }
});
function addressToLatLng(address, callback) {
@@ -155,8 +163,12 @@ function addressToLatLng(address, callback) {
xmlhttp.send();
}
+function isWhitelisted(initiator) {
+ return initiator && whitelist.some(regex => (regex.test(initiator.href)));
+}
+
function redirectYouTube(url, initiator, type) {
- if (disableInvidious) {
+ if (disableInvidious || isWhitelisted(initiator)) {
return null;
}
if (initiator && (initiator.origin === invidiousInstance || youtubeDomains.includes(initiator.host))) {
@@ -183,8 +195,8 @@ function redirectYouTube(url, initiator, type) {
}
}
-function redirectTwitter(url) {
- if (disableNitter) {
+function redirectTwitter(url, initiator) {
+ if (disableNitter || isWhitelisted(initiator)) {
return null;
}
if (url.host.split('.')[0] === 'pbs') {
@@ -197,7 +209,7 @@ function redirectTwitter(url) {
}
function redirectInstagram(url, initiator, type) {
- if (disableBibliogram) {
+ if (disableBibliogram || isWhitelisted(initiator)) {
return null;
}
// Do not redirect Bibliogram view on Instagram links
@@ -216,8 +228,8 @@ function redirectInstagram(url, initiator, type) {
}
}
-function redirectGoogleMaps(url) {
- if (disableOsm) {
+function redirectGoogleMaps(url, initiator) {
+ if (disableOsm || isWhitelisted(initiator)) {
return null;
}
let redirect;
@@ -313,7 +325,7 @@ browser.webRequest.onBeforeRequest.addListener(
};
} else if (twitterDomains.includes(url.host)) {
redirect = {
- redirectUrl: redirectTwitter(url)
+ redirectUrl: redirectTwitter(url, initiator)
};
} else if (instagramDomains.includes(url.host)) {
redirect = {
@@ -321,7 +333,7 @@ browser.webRequest.onBeforeRequest.addListener(
};
} else if (url.href.match(googleMapsRegex)) {
redirect = {
- redirectUrl: redirectGoogleMaps(url)
+ redirectUrl: redirectGoogleMaps(url, initiator)
};
}
if (redirect && redirect.redirectUrl) {
diff --git a/pages/options/options.html b/pages/options/options.html
index f638fcf3..321babe8 100644
--- a/pages/options/options.html
+++ b/pages/options/options.html
@@ -12,15 +12,9 @@
-
-
-
+
+
+
@@ -70,6 +64,14 @@
diff --git a/pages/options/options.js b/pages/options/options.js
index d702eb83..821d6ed4 100644
--- a/pages/options/options.js
+++ b/pages/options/options.js
@@ -12,9 +12,26 @@ let alwaysProxy = document.getElementById('always-proxy');
let onlyEmbeddedVideo = document.getElementById('only-embed');
let videoQuality = document.getElementById('video-quality');
let removeTwitterSW = document.getElementById('remove-twitter-sw');
+let whitelist;
window.browser = window.browser || window.chrome;
+function prependWhitelistItem(item, index) {
+ const li = document.createElement('li');
+ li.appendChild(document.createTextNode(item.toString()));
+ const button = document.createElement('button');
+ button.appendChild(document.createTextNode('X'));
+ button.addEventListener('click', () => {
+ li.remove();
+ whitelist.splice(index, 1);
+ browser.storage.sync.set({
+ whitelist: whitelist
+ });
+ });
+ li.appendChild(button);
+ document.getElementById('whitelist-items').prepend(li);
+}
+
browser.storage.sync.get(
[
'nitterInstance',
@@ -28,7 +45,8 @@ browser.storage.sync.get(
'alwaysProxy',
'onlyEmbeddedVideo',
'videoQuality',
- 'removeTwitterSW'
+ 'removeTwitterSW',
+ 'whitelist'
],
result => {
nitterInstance.value = result.nitterInstance || '';
@@ -43,6 +61,8 @@ browser.storage.sync.get(
onlyEmbeddedVideo.checked = result.onlyEmbeddedVideo;
videoQuality.value = result.videoQuality || '';
removeTwitterSW.checked = !result.removeTwitterSW;
+ whitelist = result.whitelist || [];
+ whitelist.forEach(prependWhitelistItem);
}
);
@@ -60,17 +80,40 @@ function openTab(tab, event) {
event.currentTarget.className += ' active';
}
-document.getElementById('generalTab').addEventListener(
+document.getElementById('general-tab').addEventListener(
'click', openTab.bind(null, 'general')
);
-document.getElementById('advancedTab').addEventListener(
+document.getElementById('advanced-tab').addEventListener(
'click', openTab.bind(null, 'advanced')
);
-document.getElementById('whitelistTab').addEventListener(
+document.getElementById('whitelist-tab').addEventListener(
'click', openTab.bind(null, 'whitelist')
);
-document.getElementById('generalTab').click();
+document.getElementById('general-tab').click();
+
+function addToWhitelist() {
+ const input = document.getElementById('new-whitelist-item');
+ if (input.value) {
+ try {
+ new RegExp(input.value);
+ const index = whitelist.push(input.value);
+ prependWhitelistItem(input.value, index);
+ browser.storage.sync.set({
+ whitelist: whitelist
+ });
+ input.value = '';
+ } catch (error) {
+ input.setCustomValidity('Invalid RegExp');
+ }
+ } else {
+ input.setCustomValidity('Invalid RegExp');
+ }
+}
+
+document.getElementById('add-to-whitelist').addEventListener(
+ 'click', addToWhitelist
+);
function debounce(func, wait, immediate) {
let timeout;
diff --git a/pages/popup/popup.html b/pages/popup/popup.html
index 2f05f87f..1afd0913 100644
--- a/pages/popup/popup.html
+++ b/pages/popup/popup.html
@@ -64,6 +64,14 @@