Closes #27 - added ability to whitelist sites

This commit is contained in:
SimonBrazell 2020-04-26 00:43:43 +10:00
parent 269739347f
commit 236712d4f6
5 changed files with 166 additions and 32 deletions

View File

@ -61,6 +61,7 @@ let osmInstance;
let alwaysProxy; let alwaysProxy;
let onlyEmbeddedVideo; let onlyEmbeddedVideo;
let videoQuality; let videoQuality;
let whitelist;
window.browser = window.browser || window.chrome; window.browser = window.browser || window.chrome;
@ -76,7 +77,8 @@ browser.storage.sync.get(
'disableOsm', 'disableOsm',
'alwaysProxy', 'alwaysProxy',
'onlyEmbeddedVideo', 'onlyEmbeddedVideo',
'videoQuality' 'videoQuality',
'whitelist'
], ],
result => { result => {
disableNitter = result.disableNitter; disableNitter = result.disableNitter;
@ -90,6 +92,8 @@ browser.storage.sync.get(
alwaysProxy = result.alwaysProxy; alwaysProxy = result.alwaysProxy;
onlyEmbeddedVideo = result.onlyEmbeddedVideo; onlyEmbeddedVideo = result.onlyEmbeddedVideo;
videoQuality = result.videoQuality; 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) { if ('videoQuality' in changes) {
videoQuality = changes.videoQuality.newValue; videoQuality = changes.videoQuality.newValue;
} }
if ('whitelist' in changes) {
whitelist = changes.whitelist.newValue.map(e => new RegExp(e));
console.log(whitelist);
}
}); });
function addressToLatLng(address, callback) { function addressToLatLng(address, callback) {
@ -155,8 +163,12 @@ function addressToLatLng(address, callback) {
xmlhttp.send(); xmlhttp.send();
} }
function isWhitelisted(initiator) {
return initiator && whitelist.some(regex => (regex.test(initiator.href)));
}
function redirectYouTube(url, initiator, type) { function redirectYouTube(url, initiator, type) {
if (disableInvidious) { if (disableInvidious || isWhitelisted(initiator)) {
return null; return null;
} }
if (initiator && (initiator.origin === invidiousInstance || youtubeDomains.includes(initiator.host))) { if (initiator && (initiator.origin === invidiousInstance || youtubeDomains.includes(initiator.host))) {
@ -183,8 +195,8 @@ function redirectYouTube(url, initiator, type) {
} }
} }
function redirectTwitter(url) { function redirectTwitter(url, initiator) {
if (disableNitter) { if (disableNitter || isWhitelisted(initiator)) {
return null; return null;
} }
if (url.host.split('.')[0] === 'pbs') { if (url.host.split('.')[0] === 'pbs') {
@ -197,7 +209,7 @@ function redirectTwitter(url) {
} }
function redirectInstagram(url, initiator, type) { function redirectInstagram(url, initiator, type) {
if (disableBibliogram) { if (disableBibliogram || isWhitelisted(initiator)) {
return null; return null;
} }
// Do not redirect Bibliogram view on Instagram links // Do not redirect Bibliogram view on Instagram links
@ -216,8 +228,8 @@ function redirectInstagram(url, initiator, type) {
} }
} }
function redirectGoogleMaps(url) { function redirectGoogleMaps(url, initiator) {
if (disableOsm) { if (disableOsm || isWhitelisted(initiator)) {
return null; return null;
} }
let redirect; let redirect;
@ -313,7 +325,7 @@ browser.webRequest.onBeforeRequest.addListener(
}; };
} else if (twitterDomains.includes(url.host)) { } else if (twitterDomains.includes(url.host)) {
redirect = { redirect = {
redirectUrl: redirectTwitter(url) redirectUrl: redirectTwitter(url, initiator)
}; };
} else if (instagramDomains.includes(url.host)) { } else if (instagramDomains.includes(url.host)) {
redirect = { redirect = {
@ -321,7 +333,7 @@ browser.webRequest.onBeforeRequest.addListener(
}; };
} else if (url.href.match(googleMapsRegex)) { } else if (url.href.match(googleMapsRegex)) {
redirect = { redirect = {
redirectUrl: redirectGoogleMaps(url) redirectUrl: redirectGoogleMaps(url, initiator)
}; };
} }
if (redirect && redirect.redirectUrl) { if (redirect && redirect.redirectUrl) {

View File

@ -12,15 +12,9 @@
<body> <body>
<div class="tab"> <div class="tab">
<button class="tablinks" id="generalTab"> <button class="tablinks" id="general-tab">General</button>
General <button class="tablinks" id="advanced-tab">Advanced</button>
</button> <button class="tablinks" id="whitelist-tab">Whitelist</button>
<button class="tablinks" id="advancedTab">
Advanced
</button>
<button class="tablinks" id="whitelistTab">
Whitelist
</button>
</div> </div>
<div id="general" class="tabcontent"> <div id="general" class="tabcontent">
@ -70,6 +64,14 @@
<option value="https://nitter.nixnet.xyz"> <option value="https://nitter.nixnet.xyz">
<option value="https://nitter.13ad.de"> <option value="https://nitter.13ad.de">
<option value="https://tw.openalgeria.org"> <option value="https://tw.openalgeria.org">
<option value="https://nitter.pussthecat.org">
<option value="https://nitter.mastodont.cat">
<option value="https://nitter.dark.fail">
<option value="https://nitter.tedomum.net">
<option value="https://t.maisputain.ovh">
<option value="http://3nzoldnxplag42gqjs23xvghtzf6t6yzssrtytnntc6ppc7xxuoneoad.onion">
<option value="http://nitter.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd.onion">
<option value="http://3nzoldnxplag42gqjs23xvghtzf6t6yzssrtytnntc6ppc7xxuoneoad.onion">
</datalist> </datalist>
<h1>Invidious Instance</h1> <h1>Invidious Instance</h1>
<input id="invidious-instance" list="invidious-instances-list" type="url" placeholder="https://invidio.us"> <input id="invidious-instance" list="invidious-instances-list" type="url" placeholder="https://invidio.us">
@ -78,9 +80,16 @@
<option value="https://invidious.snopyta.org"> <option value="https://invidious.snopyta.org">
<option value="https://invidiou.sh"> <option value="https://invidiou.sh">
<option value="https://yewtu.be"> <option value="https://yewtu.be">
<option value="https://invidious.zapashcanon.fr"> <option value="https://yt.maisputain.ovh">
<option value="https://invidious.toot.koeln"> <option value="https://invidious.toot.koeln">
<option value="https://invidious.ggc-project.de"> <option value="https://invidious.ggc-project.de">
<option value="https://invidious.toot.koeln">
<option value="http://kgg2m7yk5aybusll.onion">
<option value="http://axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid.onion">
<option value="http://fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad.onion">
<option value="http://qklhadlycap4cnod.onion">
<option value="http://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion">
<option value="http://mfqczy4mysscub2s.onion">
</datalist> </datalist>
<h1>Bibliogram Instance</h1> <h1>Bibliogram Instance</h1>
<input id="bibliogram-instance" list="bibliogram-instance-list" type="url" placeholder="https://bibliogram.art"> <input id="bibliogram-instance" list="bibliogram-instance-list" type="url" placeholder="https://bibliogram.art">
@ -88,6 +97,8 @@
<option value="https://bibliogram.art"> <option value="https://bibliogram.art">
<option value="https://bibliogram.snopyta.org"> <option value="https://bibliogram.snopyta.org">
<option value="https://bibliogram.pussthecat.org"> <option value="https://bibliogram.pussthecat.org">
<option value="https://insta.maisputain.ovh">
<option value="https://bibliogram.nixnet.services">
</datalist> </datalist>
<h1>OpenStreetMap Instance</h1> <h1>OpenStreetMap Instance</h1>
<input id="osm-instance" list="osm-instance-list" type="url" placeholder="https://openstreetmap.org"> <input id="osm-instance" list="osm-instance-list" type="url" placeholder="https://openstreetmap.org">
@ -137,7 +148,14 @@
</div> </div>
<div id="whitelist" class="tabcontent"> <div id="whitelist" class="tabcontent">
<section class="options settings_block">
<h1>Whitelisted Sites</h1>
<div class="whitelist">
<input id="new-whitelist-item" type="text" placeholder="URL (RegExp accepted)">
<button id="add-to-whitelist">Add to Whitelist</button>
</div>
</section>
<ul id="whitelist-items"></ul>
</div> </div>
<script src="./options.js"></script> <script src="./options.js"></script>

View File

@ -12,9 +12,26 @@ let alwaysProxy = document.getElementById('always-proxy');
let onlyEmbeddedVideo = document.getElementById('only-embed'); let onlyEmbeddedVideo = document.getElementById('only-embed');
let videoQuality = document.getElementById('video-quality'); let videoQuality = document.getElementById('video-quality');
let removeTwitterSW = document.getElementById('remove-twitter-sw'); let removeTwitterSW = document.getElementById('remove-twitter-sw');
let whitelist;
window.browser = window.browser || window.chrome; 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( browser.storage.sync.get(
[ [
'nitterInstance', 'nitterInstance',
@ -28,7 +45,8 @@ browser.storage.sync.get(
'alwaysProxy', 'alwaysProxy',
'onlyEmbeddedVideo', 'onlyEmbeddedVideo',
'videoQuality', 'videoQuality',
'removeTwitterSW' 'removeTwitterSW',
'whitelist'
], ],
result => { result => {
nitterInstance.value = result.nitterInstance || ''; nitterInstance.value = result.nitterInstance || '';
@ -43,6 +61,8 @@ browser.storage.sync.get(
onlyEmbeddedVideo.checked = result.onlyEmbeddedVideo; onlyEmbeddedVideo.checked = result.onlyEmbeddedVideo;
videoQuality.value = result.videoQuality || ''; videoQuality.value = result.videoQuality || '';
removeTwitterSW.checked = !result.removeTwitterSW; removeTwitterSW.checked = !result.removeTwitterSW;
whitelist = result.whitelist || [];
whitelist.forEach(prependWhitelistItem);
} }
); );
@ -60,17 +80,40 @@ function openTab(tab, event) {
event.currentTarget.className += ' active'; event.currentTarget.className += ' active';
} }
document.getElementById('generalTab').addEventListener( document.getElementById('general-tab').addEventListener(
'click', openTab.bind(null, 'general') 'click', openTab.bind(null, 'general')
); );
document.getElementById('advancedTab').addEventListener( document.getElementById('advanced-tab').addEventListener(
'click', openTab.bind(null, 'advanced') 'click', openTab.bind(null, 'advanced')
); );
document.getElementById('whitelistTab').addEventListener( document.getElementById('whitelist-tab').addEventListener(
'click', openTab.bind(null, 'whitelist') '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) { function debounce(func, wait, immediate) {
let timeout; let timeout;

View File

@ -64,6 +64,14 @@
<option value="https://nitter.nixnet.xyz"> <option value="https://nitter.nixnet.xyz">
<option value="https://nitter.13ad.de"> <option value="https://nitter.13ad.de">
<option value="https://tw.openalgeria.org"> <option value="https://tw.openalgeria.org">
<option value="https://nitter.pussthecat.org">
<option value="https://nitter.mastodont.cat">
<option value="https://nitter.dark.fail">
<option value="https://nitter.tedomum.net">
<option value="https://t.maisputain.ovh">
<option value="http://3nzoldnxplag42gqjs23xvghtzf6t6yzssrtytnntc6ppc7xxuoneoad.onion">
<option value="http://nitter.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd.onion">
<option value="http://3nzoldnxplag42gqjs23xvghtzf6t6yzssrtytnntc6ppc7xxuoneoad.onion">
</datalist> </datalist>
<h1>Invidious Instance</h1> <h1>Invidious Instance</h1>
<input id="invidious-instance" list="invidious-instances-list" type="url" placeholder="https://invidio.us"> <input id="invidious-instance" list="invidious-instances-list" type="url" placeholder="https://invidio.us">
@ -72,16 +80,25 @@
<option value="https://invidious.snopyta.org"> <option value="https://invidious.snopyta.org">
<option value="https://invidiou.sh"> <option value="https://invidiou.sh">
<option value="https://yewtu.be"> <option value="https://yewtu.be">
<option value="https://invidious.zapashcanon.fr"> <option value="https://yt.maisputain.ovh">
<option value="https://invidious.toot.koeln"> <option value="https://invidious.toot.koeln">
<option value="https://invidious.ggc-project.de"> <option value="https://invidious.ggc-project.de">
<option value="https://invidious.toot.koeln">
<option value="http://kgg2m7yk5aybusll.onion">
<option value="http://axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid.onion">
<option value="http://fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad.onion">
<option value="http://qklhadlycap4cnod.onion">
<option value="http://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion">
<option value="http://mfqczy4mysscub2s.onion">
</datalist> </datalist>
<h1>Bibliogram Instance</h1> <h1>Bibliogram Instance</h1>
<input id="bibliogram-instance" list="bibliogram-instance-list" type="url" placeholder="https://bibliogram.art"> <input id="bibliogram-instance" list="bibliogram-instance-list" type="url" placeholder="https://bibliogram.art">
<datalist id="bibliogram-instance-list"> <datalist id="bibliogram-instance-list">
<option value="https://bibliogram.art"> <option value="https://bibliogram.art">
<option value="https://bibliogram.snopyta.org"> <option value="https://bibliogram.snopyta.org">
<option value="https://bibliogram.dsrev.ru"> <option value="https://bibliogram.pussthecat.org">
<option value="https://insta.maisputain.ovh">
<option value="https://bibliogram.nixnet.services">
</datalist> </datalist>
<h1>OpenStreetMap Instance</h1> <h1>OpenStreetMap Instance</h1>
<input id="osm-instance" list="osm-instance-list" type="url" placeholder="https://openstreetmap.org"> <input id="osm-instance" list="osm-instance-list" type="url" placeholder="https://openstreetmap.org">

View File

@ -14,9 +14,9 @@ body {
color: var(--text-secondary); color: var(--text-secondary);
margin: 0; margin: 0;
background-color: var(--darker-grey); background-color: var(--darker-grey);
max-width: 400px; width: 400px;
margin: auto; margin: auto;
min-height: 460px; min-height: 572px;
} }
.popup { .popup {
@ -95,7 +95,7 @@ footer a.button {
/* Elements */ /* Elements */
input[type=url], select { input[type=url], input[type=text], select {
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
margin-bottom: 5px; margin-bottom: 5px;
@ -183,7 +183,7 @@ input:checked+label:after {
transform: translateY(4px); transform: translateY(4px);
} }
input[type="url"]:invalid { input:invalid {
color: var(--danger); color: var(--danger);
border-color: var(--danger); border-color: var(--danger);
background-color: var(--danger-light); background-color: var(--danger-light);
@ -227,5 +227,49 @@ input[type="url"]:invalid {
display: none; display: none;
border: solid 1px var(--dark-grey); border: solid 1px var(--dark-grey);
background-color: var(--dark-grey); background-color: var(--dark-grey);
min-height: 403px; min-height: 510px;
}
div.whitelist {
clear: left;
}
div.whitelist > input {
width: 240px;
float: left;
}
#add-to-whitelist {
width: 120px;
float: right;
border: var(--active) solid 1px;
background-color: var(--active);
color: var(--text-main);
font-weight: bold;
cursor: pointer;
border-radius: 25px;
}
ul {
padding: 0;
list-style-type: none;
color: var(--text-main);
margin-right: 20px;
margin-left: 20px;
}
li {
border-bottom: solid 0.5px var(--darker-grey);
padding: 20px 0px 20px 20px;
}
#whitelist-items button {
float: right;
margin-right: -5px;
border: var(--active) solid 1px;
background-color: var(--active);
color: var(--text-main);
font-weight: bold;
cursor: pointer;
border-radius: 50%;
} }