From 745c5babcf9104924631185b2ea3f235c45d270a Mon Sep 17 00:00:00 2001 From: SimonBrazell Date: Sun, 12 Jul 2020 11:26:48 +1000 Subject: [PATCH] Improve exceptions (whitelist), i18n (fr), etc. - Closes #69 - Closes #70 - Fixes #71 - Closes #72 - added fr l10n - Fixes #73 - Implement additional Invidious params (#66) --- README.md | 7 +- _locales/en/messages.json | 98 +++++ _locales/fr/messages.json | 98 +++++ .../images}/Screen Shot Chrome 1.png | Bin .../images}/Screen Shot Chrome 2.png | Bin .../images}/Screen Shot Chrome 3.png | Bin .../images}/Screen Shot Chrome 4.png | Bin .../images}/Screen Shot Chrome 5.png | Bin .../images}/Screen Shot FF 1.png | Bin .../images}/Screen Shot FF 2.png | Bin .../images}/Screen Shot FF 3.png | Bin .../images}/Screen Shot FF 4.png | Bin .../images}/Screen Shot FF 5.png | Bin assets/images/amo-badge.png | Bin 0 -> 2827 bytes {images => assets/images}/buy-me-a-coffee.png | Bin assets/images/chevron-down.svg | 3 + assets/images/chrome-badge.png | Bin 0 -> 3762 bytes {images => assets/images}/icon128.png | Bin {images => assets/images}/icon16.png | Bin {images => assets/images}/icon32.png | Bin {images => assets/images}/icon48.png | Bin assets/images/logo-small.png | Bin 0 -> 22050 bytes {images => assets/images}/logo.png | Bin {images => assets/images}/small-tile.png | Bin assets/javascript/localise.js | 19 + .../persist-invidious-prefs.js | 0 assets/{ => javascript}/remove-twitter-sw.js | 20 +- background.js | 85 +++- manifest.json | 27 +- pages/options/options.html | 376 +++++++++++------- pages/options/options.js | 231 +++++++++-- pages/popup/popup.html | 149 +++---- pages/popup/popup.js | 81 ---- pages/styles.css | 149 ++++++- web-ext-config.js | 4 +- 35 files changed, 966 insertions(+), 381 deletions(-) create mode 100644 _locales/en/messages.json create mode 100644 _locales/fr/messages.json rename {images => assets/images}/Screen Shot Chrome 1.png (100%) rename {images => assets/images}/Screen Shot Chrome 2.png (100%) rename {images => assets/images}/Screen Shot Chrome 3.png (100%) rename {images => assets/images}/Screen Shot Chrome 4.png (100%) rename {images => assets/images}/Screen Shot Chrome 5.png (100%) rename {images => assets/images}/Screen Shot FF 1.png (100%) rename {images => assets/images}/Screen Shot FF 2.png (100%) rename {images => assets/images}/Screen Shot FF 3.png (100%) rename {images => assets/images}/Screen Shot FF 4.png (100%) rename {images => assets/images}/Screen Shot FF 5.png (100%) create mode 100644 assets/images/amo-badge.png rename {images => assets/images}/buy-me-a-coffee.png (100%) create mode 100644 assets/images/chevron-down.svg create mode 100644 assets/images/chrome-badge.png rename {images => assets/images}/icon128.png (100%) rename {images => assets/images}/icon16.png (100%) rename {images => assets/images}/icon32.png (100%) rename {images => assets/images}/icon48.png (100%) create mode 100644 assets/images/logo-small.png rename {images => assets/images}/logo.png (100%) rename {images => assets/images}/small-tile.png (100%) create mode 100644 assets/javascript/localise.js rename assets/{ => javascript}/persist-invidious-prefs.js (100%) rename assets/{ => javascript}/remove-twitter-sw.js (81%) diff --git a/README.md b/README.md index e5ee60f..29ccd7b 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ -# ![privacy-redirect](images/icon32.png) Privacy Redirect +# ![privacy-redirect](assets/images/logo-small.png) -[![Donate](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/SimonBrazell/donate) [![Buy me a coffee](images/buy-me-a-coffee.png)](https://www.buymeacoffee.com/SimonBrazell) +[![Donate](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/SimonBrazell/donate) [![Buy me a coffee](assets/images/buy-me-a-coffee.png)](https://www.buymeacoffee.com/SimonBrazell) -- [Chrome Extension](https://chrome.google.com/webstore/detail/privacy-redirect/pmcmeagblkinmogikoikkdjiligflglb) -- [Firefox Add-on](https://addons.mozilla.org/en-US/firefox/addon/privacy-redirect/) +[![Firefox Add-on](assets/images/amo-badge.png)](https://addons.mozilla.org/en-US/firefox/addon/privacy-redirect/) [![Chrome Extension](assets/images/chrome-badge.png)](https://chrome.google.com/webstore/detail/privacy-redirect/pmcmeagblkinmogikoikkdjiligflglb) A web extension that redirects Twitter, YouTube, Instagram & Google Maps requests to privacy friendly alternatives - [Nitter](https://github.com/zedeus/nitter), [Invidious](https://github.com/omarroth/invidious), [Bibliogram](https://github.com/cloudrac3r/bibliogram) & [OpenStreetMap](https://www.openstreetmap.org/). diff --git a/_locales/en/messages.json b/_locales/en/messages.json new file mode 100644 index 0000000..2a34b8b --- /dev/null +++ b/_locales/en/messages.json @@ -0,0 +1,98 @@ +{ + "extensionName": { + "message": "Privacy Redirect", + "description": "Name of the extension." + }, + "extensionDescription": { + "message": "Redirects Twitter, YouTube, Instagram & Google Maps requests to privacy friendly alternatives.", + "description": "Description of the extension." + }, + "nitterInstance": { + "message": "Nitter Instance", + "description": "Label for Nitter instance field option (options)." + }, + "invidiousInstance": { + "message": "Invidious Instance", + "description": "Label for Invidious instance field option (options)." + }, + "bibliogramInstance": { + "message": "Bibliogram Instance", + "description": "Label for Bibliogram instance field option (options)." + }, + "osmInstance": { + "message": "OpenStreetMap Instance", + "description": "Label for OSM instance field option (options)." + }, + "disableNitter": { + "message": "Nitter Redirects", + "description": "Label for enable/disable Nitter redirects option (options & pop-up)." + }, + "disableInvidious": { + "message": "Invidious Redirects", + "description": "Label for enable/disable Invidious redirects option (options & pop-up)." + }, + "disableBibliogram": { + "message": "Bibliogram Redirects", + "description": "Label for enable/disable Bibliogram redirects option (options & pop-up)." + }, + "disableOsm": { + "message": "OpenStreetMap Redirects", + "description": "Label for enable/disable OSM redirects option (options & pop-up)." + }, + "alwaysProxy": { + "message": "Always proxy videos through Invidious", + "description": "Label for 'Always proxy videos through Invidious' option (options)." + }, + "onlyEmbeddedVideo": { + "message": "Only redirect embedded video to Invidious", + "description": "Label for 'Only redirect embedded video to Invidious' option (options)." + }, + "videoQuality": { + "message": "Invidious Video Quality", + "description": "Label for 'Invidious Video Quality' option (options)." + }, + "removeTwitterSW": { + "message": "Proactively remove Twitter service worker", + "description": "Label for 'Proactively remove Twitter service worker' option (options)." + }, + "invidiousDarkMode": { + "message": "Invidious dark mode always on", + "description": "Label for 'Invidious dark mode always on' option (options)." + }, + "persistInvidiousPrefs": { + "message": "Persist Invidious preferences (as cookie)", + "description": "Label for 'Persist Invidious preferences (as cookie)' option (options)." + }, + "generalTab": { + "message": "General", + "description": "General tab (options)." + }, + "advancedTab": { + "message": "Advanced", + "description": "Advanced tab (options)." + }, + "exceptionsTab": { + "message": "Exceptions", + "description": "Exceptions tab (options)." + }, + "exceptionsDescription": { + "message": "

Enter a URL or Regular Expression to be excluded from redirects.

All requests for or initiating from a URL that matches the exception will be excluded from redirects.

Note - Supports JavaScript regular expressions, excluding the enclosing forward slashes.

", + "description": "A description of the 'Exceptions' feature (options)." + }, + "addException": { + "message": "Add Exception", + "description": "'Add Exceptions' button (options)." + }, + "moreOptions": { + "message": "More Options", + "description": "More Options button (pop-up)." + }, + "privacy": { + "message": "Privacy", + "description": "Extension title - Privacy (pop-up)." + }, + "redirect": { + "message": "Redirect", + "description": "Extension title - Redirect (pop-up)." + } +} \ No newline at end of file diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json new file mode 100644 index 0000000..fe2eaaf --- /dev/null +++ b/_locales/fr/messages.json @@ -0,0 +1,98 @@ +{ + "extensionName": { + "message": "Privacy Redirect", + "description": "Nom du module complémentaire." + }, + "extensionDescription": { + "message": "Redirige les requêtes les demandes Twitter, YouTube, Instagram et Google Maps vers des alternatives respectueuses de la vie privée. pour Twitter, YouTube, Instagram et Google Maps vers des alternatives respectueuses de la vie privée.", + "description": "Description du module complémentaire." + }, + "nitterInstance": { + "message": "Instance de Nitter", + "description": "Étiquette pour l'option de champ d'instance Nitter (options)." + }, + "invidiousInstance": { + "message": "Instance de Invidious", + "description": "Étiquette pour l'option de champ d'instance Invidious (options)." + }, + "bibliogramInstance": { + "message": "Instance de Bibliogram", + "description": "Étiquette pour l'option de champ d'instance Bibliogram (options)." + }, + "osmInstance": { + "message": "Instance de OpenStreetMap", + "description": "Étiquette pour l'option de champ d'instance OpenStreetMap (options)." + }, + "disableNitter": { + "message": "Redirection vers Nitter", + "description": "Étiquette pour activer / désactiver l'option de redirection vers Nitter (options et pop-up)." + }, + "disableInvidious": { + "message": "Redirection vers Invidious", + "description": "Étiquette pour activer / désactiver l'option de redirection vers Invidious (options et pop-up)." + }, + "disableBibliogram": { + "message": "Redirection vers Bibliogram", + "description": "Étiquette pour activer / désactiver l'option de redirection vers Bibliogram (options et pop-up)." + }, + "disableOsm": { + "message": "Redirection vers OpenStreetMap", + "description": "Étiquette pour activer / désactiver l'option de redirection vers OpenStreetMap (options et pop-up)." + }, + "alwaysProxy": { + "message": "Toujours transiter par proxy les vidéos via Invidious", + "description": "Libellé pour l'option 'Toujours transiter par proxy les vidéos via Invidious' (options)." + }, + "onlyEmbeddedVideo": { + "message": "Rediriger uniquement les vidéos intégrées vers Invidious", + "description": "Libellé pour l'option 'Rediriger uniquement les vidéos intégrées vers Invidious' (options)." + }, + "videoQuality": { + "message": "Qualité des vidéos Invidious", + "description": "Libellé pour l'option 'Qualité des vidéos Invidious' (options)." + }, + "removeTwitterSW": { + "message": "Supprimer proactivement le service Twitter", + "description": "Libellé pour l'option 'Supprimer proactivement le service Twitter' (options)." + }, + "invidiousDarkMode": { + "message": "Mode sombre toujours activé pour Invidious", + "description": "Libellé pour l'option 'Mode sombre toujours activé pour Invidious' (options)." + }, + "persistInvidiousPrefs": { + "message": "Conserver les préférences malveillantes (sous forme de cookie)", + "description": "Libellé pour 'Conserver les préférences malveillantes (sous forme de cookie)' option (options)." + }, + "generalTab": { + "message": "Général", + "description": "Onglet général (options)." + }, + "advancedTab": { + "message": "Avancé", + "description": "Onglet avancé (options)." + }, + "exceptionsTab": { + "message": "Exceptions", + "description": "Onglet des Exceptions dans les options." + }, + "exceptionsDescription": { + "message": "

Entrez une adresse URL ou une expression régulière qui sera exclue des redirections.

All requests for or initiating from a URL that matches the exception will be excluded from redirects.

Note - Supports JavaScript regular expressions, excluding the enclosing forward slashes.

", + "description": "Description pour la rubrique 'Exceptions' dans les options." + }, + "addException": { + "message": "Ajoutez une exception", + "description": "boutton 'Ajoutez une exception' dans les options." + }, + "moreOptions": { + "message": "Options supplémentaires", + "description": "Boutton des options supplémentaires (pop-up)." + }, + "privacy": { + "message": "Vie privée", + "description": "Titre du module complémentaire - Vie privée (pop-up)." + }, + "redirect": { + "message": "Redirection", + "description": "Titre du module complémentaire - Redirection (pop-up)." + } +} \ No newline at end of file diff --git a/images/Screen Shot Chrome 1.png b/assets/images/Screen Shot Chrome 1.png similarity index 100% rename from images/Screen Shot Chrome 1.png rename to assets/images/Screen Shot Chrome 1.png diff --git a/images/Screen Shot Chrome 2.png b/assets/images/Screen Shot Chrome 2.png similarity index 100% rename from images/Screen Shot Chrome 2.png rename to assets/images/Screen Shot Chrome 2.png diff --git a/images/Screen Shot Chrome 3.png b/assets/images/Screen Shot Chrome 3.png similarity index 100% rename from images/Screen Shot Chrome 3.png rename to assets/images/Screen Shot Chrome 3.png diff --git a/images/Screen Shot Chrome 4.png b/assets/images/Screen Shot Chrome 4.png similarity index 100% rename from images/Screen Shot Chrome 4.png rename to assets/images/Screen Shot Chrome 4.png diff --git a/images/Screen Shot Chrome 5.png b/assets/images/Screen Shot Chrome 5.png similarity index 100% rename from images/Screen Shot Chrome 5.png rename to assets/images/Screen Shot Chrome 5.png diff --git a/images/Screen Shot FF 1.png b/assets/images/Screen Shot FF 1.png similarity index 100% rename from images/Screen Shot FF 1.png rename to assets/images/Screen Shot FF 1.png diff --git a/images/Screen Shot FF 2.png b/assets/images/Screen Shot FF 2.png similarity index 100% rename from images/Screen Shot FF 2.png rename to assets/images/Screen Shot FF 2.png diff --git a/images/Screen Shot FF 3.png b/assets/images/Screen Shot FF 3.png similarity index 100% rename from images/Screen Shot FF 3.png rename to assets/images/Screen Shot FF 3.png diff --git a/images/Screen Shot FF 4.png b/assets/images/Screen Shot FF 4.png similarity index 100% rename from images/Screen Shot FF 4.png rename to assets/images/Screen Shot FF 4.png diff --git a/images/Screen Shot FF 5.png b/assets/images/Screen Shot FF 5.png similarity index 100% rename from images/Screen Shot FF 5.png rename to assets/images/Screen Shot FF 5.png diff --git a/assets/images/amo-badge.png b/assets/images/amo-badge.png new file mode 100644 index 0000000000000000000000000000000000000000..9cb49bba95ca8485ff82b38f2dc9ae35ec153c80 GIT binary patch literal 2827 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 literal 0 HcmV?d00001 diff --git a/images/buy-me-a-coffee.png b/assets/images/buy-me-a-coffee.png similarity index 100% rename from images/buy-me-a-coffee.png rename to assets/images/buy-me-a-coffee.png diff --git a/assets/images/chevron-down.svg b/assets/images/chevron-down.svg new file mode 100644 index 0000000..7679f26 --- /dev/null +++ b/assets/images/chevron-down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/images/chrome-badge.png b/assets/images/chrome-badge.png new file mode 100644 index 0000000000000000000000000000000000000000..4e48b8a6c256040f26c5877651f6dc93de46feac GIT binary patch literal 3762 zcmV;j4o&fiP);0X(-{$Piy>}m3U{k)|%w;!s&+Fd%{l3>Z=i)hc zzV%xq5C}4Y#~@CuY{EFX69Pe+=;*vgK75%leyrRLfgl6oc;z+-1ersKBM=C21Og$B zKp?~s2!uESfe=R^5M&BpwiP=%Iw%|tr&TrrG3j zQ8pJu$+jJVKwLF}U?f|d;kr=KXp{y92GVL9md5Av$-bPM|(!%ouf~iz4GFFyg7st5+q?5!|^kPDz@UMn_>$(Jd!U zyJ6+doIRIyebfzwdQ>|X+y3KN4!@y{6{wqT|4waWGEPCB6X(W_8!E=h#JY8Lb=~rD z?tG<@o_qdBu0rodI@H~_{~#SXdP243)(^@IB}1EPBOTQJ^hK)Q{!-dwd+qhziNDQj zY!f!z>f}JC=*FN%4M)k|f%4oxrU#04*Dpmhx zbE}hFubsbcH0m@PLLQ*S3l}7W7aISYo4%vk zpF3wZJ@~-tr17912s^Cb+&Q(XU66BdyvM1!x>6ApV*!a!=OfdmCXovD+4{lK@c51# zJ3;jgrp3aTFgBD$pJ)fygX=`!f;^nZ$p_LfDdx_uHICUz;7>L;E8&5FaxAg$PX`qN zK&VhCq$~``_T2L?Xt6^mDV6|fAgmBfCIS;f5ytopWk4|9`qek=Fo;p5NC1mrb<0$Y z)8482Lq8Z7%7T!3TObhH0YEAylp2>oR-EIu>$mSveJRUn)WH}e7RpoNgzV1aOa`SJBi03q;a&bBxv6WC2#`^cJvdzP>STBb2j5*U(Q!+1bE z1_+o-;5wLC+^0HkSQGDfO96`jGQlD&yJtzF z4ulHvg_|XS8wD2%WkEvSGQl-ua>9j6CP{6AJRt6H)8tl5W^Wy*B-}XksjmOnaS@Pw zvpD%;Z4k>qn5;ptahCd*KTz?~d#U)o`^ggs2yp}> zi#UG2KdnWVk&FMPV8d35Ub;wyI8o@26T;roB$Gy?luoq6`>D6-D2-nC1o@`V64D4p z4soz;THiWthwza@6x!LKtcBN(97D`X%;9uw=*g}=y79fIDe#50RQ&1ta(-iYtr|~I zB9nzo8)wpx4#u3#;zjfGKGTFOAu@hQG3#k=C-Aj#8rlh%7)`fLZr5C8F_>CUw{E`S zrp@DkG{O4KiZlsQ#H@Z;mZZ_jhF<7xyx}6n~^>1FWo$c0$_e64lNn>weY}~Yz zq;V>1eh(i$Kn2y4sd)LyVUHbJ5d?wIVDghSB5Q33RH!F3;xweW)aQ6Y+p~hewL1bPkAF!^qG5KldzCdg8s%5SN!GJJ;cs$FGiAU5$S=3?oj|GM6pd2P* zv1pTBL4BKpUWe+3p`#-IZN3F7FaNN9gUc$qjnR$XE6SkSH=q1?tc=q{S8CiJB} zSdqck#>toKumAtLQX>Qy~lY>Eb!emPtTMIP!wfl$9 z(zv>9^f!TLnwgQdG+8fJr@Hg7w2mFKYKdZ{?%Vpp`VO0QP zC%ZcM8{^Rzec~JoopK?yRm;3w2i7u~I8&3XiMh1sR6^)jFxmA&8Jxq)0ex8x%0Q{; ztE$nbJ~m$cZS5ac2ksf}kxnqaZoVJDFY140+do!YVAVIqfwH{b4`pzl(6+UXb!$c5 z#W=rw=P+%k3_8a#cCk(@3(`1PGsIIpzulRALLeTmWa28IEC_)^t(=YrzX?s-)1w|5 z1RblYnV4JZUWjjWt5oiibzvylW8nvBxDJ->pnV7%K0z92T9n1_D91s#b)4u6*2T0k z&FT~FaUVgzjX~9>O!b7HYg7)J7Vh&tI8G+ zpWF`0S^LK`;`2-xRuoJc(_=922ltul&4f9#INkj{wB_6%sVm^4#wnv|bxW7Kg^BY5 z)}d(LeDcqjMFr*WGtWnZRM7Jl`GZa5iCl59I(BXDrM}22iux+(Rscf7L>t^=Gq~y* zdtBJPK}@06oy9l8;elh*oAUMJu8t`vYgC&!PzLRB9k`3Eoq1iI=?=E2gU5pQAT)Mb zpIs}?Y=JZ&6s`qC0Qq>^go;NDmxqNMqyo7}y9VBhfbS4)C<2VlYIX1%`oM2!kM9** z5VmOS-hw13&+VuMuJNrEtZ3K*u{E{ck3f8`&$RL@@{c&LwKY*!zo}&!W{jidtv6^? zf7I2zD!u>nRAL15R@ch3Iv=A5JxYbwcT>^TM)DYBGTZWKjd*M=Prt!x``V9?4i?_J#-~*q)Lm3=1q#xC#J<{#>5pg zP%@K>-`z|F;Z|o$qn-DMFqU;$T?fY#unty@$=M;h^XZc8;>EThah06_rsXD*+6)Z|&8!E*8Idx+ zj~{#c`L$7Xn_slmtZAi~4FOkUHR2rBupl;EKPR7F-`m4v0}*(O1HP;6)$wysAiNI; zeSiS`ZUR2XaUH(%wg-$&x2kZNcubi02NM1BSa9A>(Qww1-~Yhv zJ@NH#B)!!qZ!Atz$9Wr9iC%};O?xf0s?uHIJ<_Bgf(zB4}xO|Wzn=O88jsO<(ZBZW8v3W z>4NHH710mB-yoTUwei&jg8~UlrifzP3w{p)$3=Qy=wF{)#r0TSShR(pUN5WfD>63% zRwmp?1ouw;b4+7*Ke!+3{jkP+!$sEnaqw=mNF<`ZZ+vs75#!iv_>D~+bgvQbFqta0 zy+WaaQu>NvX@X&Q(&*vQGoOvp%!x4?b>U0ojlAnh8X!_Ule+KPl=yr6`0*KEBZQm- zPPiUQ3);-Nu#o8IFiC3t-8%2%G>@YTFIzmTd&HS9eI7-{P!4k~dYlD+U$39)JkN>X z9ZF3SHc_0g+S$EdT2YhZa!U#5&mqujw(lW38WnJKLe$2kJQ%|h11(f^B% zx36Ea57*-_9o#l!tRfJjwZk)nU@7KBDcH*+F17j9eR4FN|4u|8xFy74H%%vq_0UmQ zJHas{7E6&JAlEH5sa6ya_4oJ7lNRI$aj+MM$#Zx4hf@f4j1GUGgiclzt1~rav4n+j zvoiXLiqUZw%qcP8@;Y7lPpJgCM%EIAU>k3`>F(~PXm3Ax`UX;&2HMj14$TdP=%aUe z=${w73E5AzM-!ZwVvsEqic)dsDT?+)9mq5IHR>x<35=qmA}TL0mnSXADYDM02?Td4 za+XyS2qeZ42n0eLfk22O5D0Mu0wIn-AjA;}1ny81pq*E*%bgGiG9=EXj?QaxCj^2F c@P7dY0NblRA#1n_1poj507*qoM6N<$f^h36O8@`> literal 0 HcmV?d00001 diff --git a/images/icon128.png b/assets/images/icon128.png similarity index 100% rename from images/icon128.png rename to assets/images/icon128.png diff --git a/images/icon16.png b/assets/images/icon16.png similarity index 100% rename from images/icon16.png rename to assets/images/icon16.png diff --git a/images/icon32.png b/assets/images/icon32.png similarity index 100% rename from images/icon32.png rename to assets/images/icon32.png diff --git a/images/icon48.png b/assets/images/icon48.png similarity index 100% rename from images/icon48.png rename to assets/images/icon48.png diff --git a/assets/images/logo-small.png b/assets/images/logo-small.png new file mode 100644 index 0000000000000000000000000000000000000000..09e50d18c658032892bc563c1b36abf7ec5195f1 GIT binary patch literal 22050 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 literal 0 HcmV?d00001 diff --git a/images/logo.png b/assets/images/logo.png similarity index 100% rename from images/logo.png rename to assets/images/logo.png diff --git a/images/small-tile.png b/assets/images/small-tile.png similarity index 100% rename from images/small-tile.png rename to assets/images/small-tile.png diff --git a/assets/javascript/localise.js b/assets/javascript/localise.js new file mode 100644 index 0000000..e408025 --- /dev/null +++ b/assets/javascript/localise.js @@ -0,0 +1,19 @@ +window.browser = window.browser || window.chrome; + +function localizeHtmlPage() { + // Localize using __MSG_***__ data tags + var data = document.querySelectorAll('[data-localize]'); + + for (var i in data) if (data.hasOwnProperty(i)) { + var obj = data[i]; + var tag = obj.getAttribute('data-localize').toString(); + + var msg = tag.replace(/__MSG_(\w+)__/g, function (_match, v1) { + return v1 ? browser.i18n.getMessage(v1) : null; + }); + + if (msg && msg !== tag) obj.innerHTML = msg; + } +} + +localizeHtmlPage(); \ No newline at end of file diff --git a/assets/persist-invidious-prefs.js b/assets/javascript/persist-invidious-prefs.js similarity index 100% rename from assets/persist-invidious-prefs.js rename to assets/javascript/persist-invidious-prefs.js diff --git a/assets/remove-twitter-sw.js b/assets/javascript/remove-twitter-sw.js similarity index 81% rename from assets/remove-twitter-sw.js rename to assets/javascript/remove-twitter-sw.js index d1b3063..d9d3ce3 100644 --- a/assets/remove-twitter-sw.js +++ b/assets/javascript/remove-twitter-sw.js @@ -5,17 +5,17 @@ const nitterDefault = 'https://nitter.net'; let disableNitter; let nitterInstance; let redirectBypassFlag; -let whitelist; +let exceptions; window.browser = window.browser || window.chrome; -function isNotWhitelisted(url) { - return !whitelist.some(regex => (regex.test(url.href))); +function isNotException(url) { + return !exceptions.some(regex => (regex.test(url.href))); } function shouldRedirect(url) { return !redirectBypassFlag && - isNotWhitelisted(url) && + isNotException(url) && !disableNitter && url.host !== nitterInstance && !url.pathname.includes('/home'); @@ -32,7 +32,13 @@ function redirectTwitter(url) { } browser.storage.sync.get( - ['nitterInstance', 'disableNitter', 'removeTwitterSW', 'redirectBypassFlag'], + [ + 'nitterInstance', + 'disableNitter', + 'removeTwitterSW', + 'redirectBypassFlag', + 'exceptions' + ], (result) => { redirectBypassFlag = result.redirectBypassFlag; browser.storage.sync.set({ @@ -41,8 +47,8 @@ browser.storage.sync.get( if (!result.removeTwitterSW) { disableNitter = result.disableNitter; nitterInstance = result.nitterInstance || nitterDefault; - whitelist = result.whitelist ? result.whitelist.map(e => { - return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')); + exceptions = result.exceptions ? result.exceptions.map(e => { + return new RegExp(e); }) : []; navigator.serviceWorker.getRegistrations().then(registrations => { for (let registration of registrations) { diff --git a/background.js b/background.js index 5810f42..021ccbb 100644 --- a/background.js +++ b/background.js @@ -85,7 +85,11 @@ let alwaysProxy; let onlyEmbeddedVideo; let videoQuality; let invidiousDarkMode; -let whitelist; +let invidiousVolume; +let invidiousPlayerStyle; +let invidiousSubtitles; +let invidiousAutoplay; +let exceptions; window.browser = window.browser || window.chrome; @@ -103,7 +107,11 @@ browser.storage.sync.get( 'onlyEmbeddedVideo', 'videoQuality', 'invidiousDarkMode', - 'whitelist' + 'invidiousVolume', + 'invidiousPlayerStyle', + 'invidiousSubtitles', + 'invidiousAutoplay', + 'exceptions' ], result => { disableNitter = result.disableNitter; @@ -118,9 +126,13 @@ browser.storage.sync.get( onlyEmbeddedVideo = result.onlyEmbeddedVideo; videoQuality = result.videoQuality; invidiousDarkMode = result.invidiousDarkMode; - whitelist = result.whitelist ? result.whitelist.map(e => { - return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')); + exceptions = result.exceptions ? result.exceptions.map(e => { + return new RegExp(e); }) : []; + invidiousVolume = result.invidiousVolume; + invidiousPlayerStyle = result.invidiousPlayerStyle; + invidiousSubtitles = result.invidiousSubtitles || ''; + invidiousAutoplay = !result.invidiousAutoplay; } ); @@ -161,9 +173,21 @@ browser.storage.onChanged.addListener(changes => { if ('invidiousDarkMode' in changes) { invidiousDarkMode = changes.invidiousDarkMode.newValue; } - if ('whitelist' in changes) { - whitelist = changes.whitelist.newValue.map(e => { - return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')); + if ('invidiousVolume' in changes) { + invidiousVolume = changes.invidiousVolume.newValue; + } + if ('invidiousPlayerStyle' in changes) { + invidiousPlayerStyle = changes.invidiousPlayerStyle.newValue; + } + if ('invidiousSubtitles' in changes) { + invidiousSubtitles = changes.invidiousSubtitles.newValue; + } + if ('invidiousAutoplay' in changes) { + invidiousAutoplay = changes.invidiousAutoplay.newValue; + } + if ('exceptions' in changes) { + exceptions = changes.exceptions.newValue.map(e => { + return new RegExp(e); }); } }); @@ -194,9 +218,9 @@ function addressToLatLng(address, callback) { xmlhttp.send(); } -function isWhitelisted(url, initiator) { - return whitelist.some(regex => (regex.test(url.href))) || - (initiator && whitelist.some(regex => (regex.test(initiator.href)))); +function isException(url, initiator) { + return exceptions.some(regex => (regex.test(url.href))) || + (initiator && exceptions.some(regex => (regex.test(initiator.href)))); } function isFirefox() { @@ -204,7 +228,7 @@ function isFirefox() { } function redirectYouTube(url, initiator, type) { - if (disableInvidious || isWhitelisted(url, initiator)) { + if (disableInvidious || isException(url, initiator)) { return null; } if (initiator && (initiator.origin === invidiousInstance || youtubeDomains.includes(initiator.host))) { @@ -231,11 +255,24 @@ function redirectYouTube(url, initiator, type) { if (invidiousDarkMode) { url.searchParams.append('dark_mode', invidiousDarkMode); } + if (invidiousVolume) { + url.searchParams.append('volume', invidiousVolume); + } + if (invidiousPlayerStyle) { + url.searchParams.append('player_style', invidiousPlayerStyle); + } + if (invidiousSubtitles) { + url.searchParams.append('subtitles', invidiousSubtitles); + } + if (invidiousAutoplay) { + url.searchParams.append('autoplay', invidiousAutoplay); + } + return `${invidiousInstance}${url.pathname}${url.search}`; } function redirectTwitter(url, initiator) { - if (disableNitter || isWhitelisted(url, initiator)) { + if (disableNitter || isException(url, initiator)) { return null; } if (url.pathname.includes('/home')) { @@ -259,7 +296,7 @@ function redirectTwitter(url, initiator) { } function redirectInstagram(url, initiator, type) { - if (disableBibliogram || isWhitelisted(url, initiator)) { + if (disableBibliogram || isException(url, initiator)) { return null; } // Do not redirect Bibliogram view on Instagram links @@ -279,7 +316,7 @@ function redirectInstagram(url, initiator, type) { } function redirectGoogleMaps(url, initiator) { - if (disableOsm || isWhitelisted(url, initiator)) { + if (disableOsm || isException(url, initiator)) { return null; } let redirect; @@ -363,10 +400,10 @@ browser.webRequest.onBeforeRequest.addListener( details => { const url = new URL(details.url); let initiator; - if (details.initiator) { - initiator = new URL(details.initiator); - } else if (details.originUrl) { + if (details.originUrl) { initiator = new URL(details.originUrl); + } else if (details.initiator) { + initiator = new URL(details.initiator); } let redirect; if (youtubeDomains.includes(url.host)) { @@ -406,6 +443,20 @@ browser.runtime.onInstalled.addListener( browser.storage.sync.set({ bibliogramInstance: bibliogramInstances[~~(bibliogramInstances.length * Math.random())] }); + } else if (details.reason === 'update') { + browser.storage.sync.get(['whitelist', 'exceptions'], + result => { + if (result.whitelist) { + let whitelist = result.whitelist.map( + e => e.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + ); + browser.storage.sync.set({ + exceptions: result.exceptions.concat(whitelist), + whitelist: null + }); + } + } + ); } } ); diff --git a/manifest.json b/manifest.json index b34cfc7..5329a28 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { - "name": "Privacy Redirect", - "description": "Redirects Twitter, YouTube, Instagram & Google Maps requests to privacy friendly alternatives.", - "version": "1.1.34", + "name": "__MSG_extensionName__", + "description": "__MSG_extensionDescription__", + "version": "1.1.35", "manifest_version": 2, "background": { "scripts": [ @@ -9,11 +9,12 @@ ], "persistent": true }, + "default_locale": "en", "icons": { - "16": "images/icon16.png", - "32": "images/icon32.png", - "48": "images/icon48.png", - "128": "images/icon128.png" + "16": "assets/images/icon16.png", + "32": "assets/images/icon32.png", + "48": "assets/images/icon48.png", + "128": "assets/images/icon128.png" }, "permissions": [ "storage", @@ -25,10 +26,10 @@ "default_title": "Privacy Redirect", "default_popup": "pages/popup/popup.html", "default_icon": { - "16": "images/icon16.png", - "32": "images/icon32.png", - "48": "images/icon48.png", - "128": "images/icon128.png" + "16": "assets/images/icon16.png", + "32": "assets/images/icon32.png", + "48": "assets/images/icon48.png", + "128": "assets/images/icon128.png" } }, "content_scripts": [ @@ -41,7 +42,7 @@ "*://video.twimg.com/*" ], "js": [ - "assets/remove-twitter-sw.js" + "assets/javascript/remove-twitter-sw.js" ], "run_at": "document_start" }, @@ -64,7 +65,7 @@ "*://mfqczy4mysscub2s.onio/*n" ], "js": [ - "assets/persist-invidious-prefs.js" + "assets/javascript/persist-invidious-prefs.js" ], "run_at": "document_start" } diff --git a/pages/options/options.html b/pages/options/options.html index 317f814..ca6429f 100644 --- a/pages/options/options.html +++ b/pages/options/options.html @@ -12,124 +12,136 @@
- - - + + +
-
-
-

Nitter Redirects

-   - +
+ + + + + + + +
+

Nitter Redirects

+
+   + +
+
+
+ + + + + + + +
+

Invidious Redirects

+
+   + +
+
+
+ + + + + + + +
+

Bibliogram Redirects

+
+   + +
+
+
+ + + + + + + +
+

OpenStreetMap Redirects

+
+   + +
+
+
+

Nitter Instance

+
+
- -
-
-

Invidious Redirects

-   - +
+

Invidious Instance

+
+
- -
-
-

Bibliogram Redirects

-   - +
+

Bibliogram Instance

+
+
- -
-
-

OpenStreetMap Redirects

-   - + +

OpenStreetMap Instance

+
+
-
- -
-

Nitter Instance

- - - -

Invidious Instance

- - - -

Bibliogram Instance

- - - -

OpenStreetMap Instance

- - - -
+
-
-
-

Always proxy videos through Invidious

-   - -
+
+ + + + + + + +
+

Always proxy videos through Invidious

+
+   + +
- -
-
-

Only redirect embedded video to Invidious

-   - -
+
+ + + + + + + +
+

Only redirect embedded video to Invidious

+
+   + +
- -
-

Invidious Video Quality

+
+

Invidious Video Quality

- -
-
-

Invidious dark mode always on

-   - -
+
+ + + + + + + +
+

Invidious dark mode always on

+
+   + +
- -
-
-

Persist Invidious preferences (as cookie)

-   - -
+
+

Invidious Volume

+
- -
-
-

Proactively remove Twitter service worker

-   - -
+
+

Invidious Player Style

+ +
+
+

Invidious Subtitles - language codes (comma-separated)

+ +
+
+ + + + + + + +
+

Invidious automatically play video on load

+
+   + +
+
+
+ + + + + + + +
+

Persist Invidious preferences (as cookie)

+
+   + +
+
+
+ + + + + + + +
+

Proactively remove Twitter service worker

+
+   + +
-
-
-

Whitelisted Sites

-
- - -
+
+
+

+ Enter a URL or Regular Expression to be excluded from redirects. +

+

+ All requests for or initiating from a URL that matches your exception + will be excluded from redirects. +

+

+ Note - Supports JavaScript regular expressions, excluding + the enclosing forward slashes. +

-
    +
    + + + + + + + + + + + +
    +

    Add Exception

    +
    + + + + + + + + +
    +
    +
      - + - + \ No newline at end of file diff --git a/pages/options/options.js b/pages/options/options.js index 5e25a49..19f9bba 100644 --- a/pages/options/options.js +++ b/pages/options/options.js @@ -1,5 +1,55 @@ 'use strict'; +const nitterInstances = [ + 'https://nitter.net', + 'https://nitter.snopyta.org', + 'https://nitter.42l.fr', + 'https://nitter.nixnet.services', + 'https://nitter.13ad.de', + 'https://nitter.pussthecat.org', + 'https://nitter.mastodont.cat', + 'https://nitter.dark.fail', + 'https://nitter.tedomum.net', + 'https://t.maisputain.ovh', + 'http://3nzoldnxplag42gqjs23xvghtzf6t6yzssrtytnntc6ppc7xxuoneoad.onion', + 'http://nitter.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd.onion' +]; +const invidiousInstances = [ + 'https://invidio.us', + 'https://invidious.snopyta.org', + 'https://invidious.fdn.fr', + 'https://invidious.13ad.de', + 'https://watch.nettohikari.com', + 'https://yewtu.be', + 'https://yt.maisputain.ovh', + 'https://invidious.toot.koeln', + 'https://invidious.ggc-project.de', + 'http://kgg2m7yk5aybusll.onion', + 'http://axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid.onion', + 'http://fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad.onion', + 'http://qklhadlycap4cnod.onion', + 'http://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion', + 'http://mfqczy4mysscub2s.onion' +]; +const bibliogramInstances = [ + 'https://bibliogram.art', + 'https://bibliogram.snopyta.org', + 'https://bibliogram.pussthecat.org', + 'https://bibliogram.nixnet.services', + 'https://bibliogram.hamster.dance', + 'https://insta.maisputain.ovh', + 'https://bibliogram.ggc-project.de' +]; +const osmInstances = [ + 'https://openstreetmap.org' +]; +const autocompletes = [ + { id: 'nitter-instance', instances: nitterInstances }, + { id: 'invidious-instance', instances: invidiousInstances }, + { id: 'bibliogram-instance', instances: bibliogramInstances }, + { id: 'osm-instance', instances: osmInstances } +]; + let nitterInstance = document.getElementById('nitter-instance'); let invidiousInstance = document.getElementById('invidious-instance'); let bibliogramInstance = document.getElementById('bibliogram-instance'); @@ -14,24 +64,35 @@ let videoQuality = document.getElementById('video-quality'); let removeTwitterSW = document.getElementById('remove-twitter-sw'); let invidiousDarkMode = document.getElementById('invidious-dark-mode'); let persistInvidiousPrefs = document.getElementById('persist-invidious-prefs'); -let whitelist; +let invidiousVolume = document.getElementById('invidious-volume'); +let invidiousPlayerStyle = document.getElementById('invidious-player-style'); +let invidiousSubtitles = document.getElementById('invidious-subtitles'); +let invidiousAutoplay = document.getElementById('invidious-autoplay'); +let exceptions; window.browser = window.browser || window.chrome; -function prependWhitelistItem(item, index) { +function prependExceptionsItem(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); + document.getElementById('exceptions-items').prepend(li); + const svg = + ` + + + `; + button.innerHTML = svg; + button.addEventListener('click', () => { + exceptions.splice(index, 1); + browser.storage.sync.set({ + exceptions: exceptions + }); + li.remove(); + }); } browser.storage.sync.get( @@ -48,9 +109,13 @@ browser.storage.sync.get( 'onlyEmbeddedVideo', 'videoQuality', 'removeTwitterSW', - 'whitelist', 'invidiousDarkMode', - 'persistInvidiousPrefs' + 'persistInvidiousPrefs', + 'invidiousVolume', + 'invidiousPlayerStyle', + 'invidiousSubtitles', + 'invidiousAutoplay', + 'exceptions' ], result => { nitterInstance.value = result.nitterInstance || ''; @@ -67,8 +132,12 @@ browser.storage.sync.get( removeTwitterSW.checked = !result.removeTwitterSW; invidiousDarkMode.checked = result.invidiousDarkMode; persistInvidiousPrefs.checked = result.persistInvidiousPrefs; - whitelist = result.whitelist || []; - whitelist.forEach(prependWhitelistItem); + exceptions = result.exceptions || []; + exceptions.forEach(prependExceptionsItem); + invidiousVolume.value = result.invidiousVolume; + invidiousPlayerStyle.value = result.invidiousPlayerStyle; + invidiousSubtitles.value = result.invidiousSubtitles || ''; + invidiousAutoplay.checked = !result.invidiousAutoplay; } ); @@ -92,22 +161,27 @@ document.getElementById('general-tab').addEventListener( document.getElementById('advanced-tab').addEventListener( 'click', openTab.bind(null, 'advanced') ); -document.getElementById('whitelist-tab').addEventListener( - 'click', openTab.bind(null, 'whitelist') +document.getElementById('exceptions-tab').addEventListener( + 'click', openTab.bind(null, 'exceptions') ); document.getElementById('general-tab').click(); -function addToWhitelist() { - const input = document.getElementById('new-whitelist-item'); +function addToExceptions() { + const input = document.getElementById('new-exceptions-item'); + const type = document.querySelector('input[name="type"]:checked').value; if (input.value) { try { + let value = input.value; new RegExp(input.value); - const index = whitelist.push(input.value); - prependWhitelistItem(input.value, index); + if (type === 'URL') { + value = value.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + exceptions.push(value); browser.storage.sync.set({ - whitelist: whitelist + exceptions: exceptions }); + prependExceptionsItem(value, exceptions.indexOf(value)); input.value = ''; } catch (error) { input.setCustomValidity('Invalid RegExp'); @@ -117,8 +191,8 @@ function addToWhitelist() { } } -document.getElementById('add-to-whitelist').addEventListener( - 'click', addToWhitelist +document.getElementById('add-to-exceptions').addEventListener( + 'click', addToExceptions ); function debounce(func, wait, immediate) { @@ -231,3 +305,112 @@ invidiousDarkMode.addEventListener('change', event => { persistInvidiousPrefs.addEventListener('change', event => { browser.storage.sync.set({ persistInvidiousPrefs: event.target.checked }); }); + +let invidiousVolumeChange = debounce(() => { + if (invidiousInstance.checkValidity()) { + browser.storage.sync.set({ + invidiousVolume: invidiousVolume.value + }); + } +}, 500); +invidiousVolume.addEventListener('input', invidiousVolumeChange); + +invidiousPlayerStyle.addEventListener('change', event => { + browser.storage.sync.set({ + invidiousPlayerStyle: event.target.options[invidiousPlayerStyle.selectedIndex].value + }); +}); + +let invidiousSubtitlesChange = debounce(() => { + if (invidiousInstance.checkValidity()) { + browser.storage.sync.set({ + invidiousSubtitles: invidiousSubtitles.value + }); + } +}, 500); +invidiousSubtitles.addEventListener('input', invidiousSubtitlesChange); + +invidiousAutoplay.addEventListener('change', event => { + browser.storage.sync.set({ invidiousAutoplay: !event.target.checked }); +}); + + +function autocomplete(input, list) { + let currentFocus; + input.addEventListener("focus", (e) => { + showOptions(e); + }); + input.addEventListener("input", (e) => { + const val = e.target.value; + if (!val) { return false; } + currentFocus = -1; + showOptions(e); + }); + input.addEventListener("keydown", function (e) { + let x = document.getElementById(this.id + "autocomplete-list"); + if (x) x = x.getElementsByTagName("div"); + if (e.keyCode == 40) { + currentFocus++; + addActive(x); + } else if (e.keyCode == 38) { + currentFocus--; + addActive(x); + } else if (e.keyCode == 13) { + e.preventDefault(); + if (currentFocus > -1) { + if (x) x[currentFocus].click(); + } + } + }); + function showOptions(e) { + let a, b, i, val = e.target.value; + closeAllLists(); + a = document.createElement("div"); + a.setAttribute("id", e.target.id + "autocomplete-list"); + a.setAttribute("class", "autocomplete-items"); + e.target.parentNode.appendChild(a); + for (i = 0; i < list.length; i++) { + if (list[i].toLowerCase().indexOf(val.toLowerCase()) > -1) { + b = document.createElement("div"); + b.innerHTML = "" + list[i].substr(0, val.length) + ""; + b.innerHTML += list[i].substr(val.length); + b.innerHTML += ""; + b.addEventListener("click", function (e) { + input.value = e.target.getElementsByTagName("input")[0].value; + input.dispatchEvent(new Event('input')); + closeAllLists(); + }); + a.appendChild(b); + } + } + } + function addActive(x) { + if (!x) return false; + removeActive(x); + if (currentFocus >= x.length) currentFocus = 0; + if (currentFocus < 0) currentFocus = (x.length - 1); + x[currentFocus].classList.add("autocomplete-active"); + } + function removeActive(x) { + for (let i = 0; i < x.length; i++) { + x[i].classList.remove("autocomplete-active"); + } + } + function closeAllLists(elmnt) { + let x = document.getElementsByClassName("autocomplete-items"); + for (let i = 0; i < x.length; i++) { + if (elmnt != x[i] && elmnt != input) { + x[i].parentNode.removeChild(x[i]); + } + } + } + document.addEventListener("click", (e) => { + if (!autocompletes.find(element => element.id === e.target.id)) { + closeAllLists(e.target); + } + }); +} + +autocompletes.forEach((value) => { + autocomplete(document.getElementById(value.id), value.instances); +}) diff --git a/pages/popup/popup.html b/pages/popup/popup.html index 45a8805..1ce7eb0 100644 --- a/pages/popup/popup.html +++ b/pages/popup/popup.html @@ -11,107 +11,88 @@
      - Privacy Redirect logo -

      Privacy
      Redirect

      + Privacy Redirect logo +

      Privacy
      Redirect

      Version: 
      -
      -
      -

      Nitter Redirects

      -   - -
      +
      + + + + + + + +
      +

      Nitter Redirects

      +
      +   + +
      -
      -
      -

      Invidious Redirects

      -   - -
      +
      + + + + + + + +
      +

      Invidious Redirects

      +
      +   + +
      -
      -
      -

      Bibliogram Redirects

      -   - -
      +
      + + + + + + + +
      +

      Bibliogram Redirects

      +
      +   + +
      -
      -
      -

      OpenStreetMap Redirects

      -   - -
      +
      + + + + + + + +
      +

      OpenStreetMap Redirects

      +
      +   + +
      -
      -

      Nitter Instance

      - - - -

      Invidious Instance

      - - - -

      Bibliogram Instance

      - - - -

      OpenStreetMap Instance

      - - - +
      - + \ No newline at end of file diff --git a/pages/popup/popup.js b/pages/popup/popup.js index 66842c7..2e8ec49 100644 --- a/pages/popup/popup.js +++ b/pages/popup/popup.js @@ -1,9 +1,5 @@ 'use strict'; -let nitterInstance = document.querySelector('#nitter-instance'); -let invidiousInstance = document.querySelector('#invidious-instance'); -let bibliogramInstance = document.querySelector('#bibliogram-instance'); -let osmInstance = document.querySelector('#osm-instance'); let disableNitter = document.querySelector('#disable-nitter'); let disableInvidious = document.querySelector('#disable-invidious'); let disableBibliogram = document.querySelector('#disable-bibliogram'); @@ -14,20 +10,12 @@ window.browser = window.browser || window.chrome; browser.storage.sync.get( [ - 'nitterInstance', - 'invidiousInstance', - 'bibliogramInstance', - 'osmInstance', 'disableNitter', 'disableInvidious', 'disableBibliogram', 'disableOsm' ], result => { - nitterInstance.value = result.nitterInstance || ''; - invidiousInstance.value = result.invidiousInstance || ''; - bibliogramInstance.value = result.bibliogramInstance || ''; - osmInstance.value = result.osmInstance || ''; disableNitter.checked = !result.disableNitter; disableInvidious.checked = !result.disableInvidious; disableBibliogram.checked = !result.disableBibliogram; @@ -37,75 +25,6 @@ browser.storage.sync.get( version.textContent = browser.runtime.getManifest().version; -function debounce(func, wait, immediate) { - let timeout; - return () => { - let context = this, args = arguments; - let later = () => { - timeout = null; - if (!immediate) func.apply(context, args); - }; - let callNow = immediate && !timeout; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - if (callNow) func.apply(context, args); - }; -}; - -function parseURL(urlString) { - if (urlString) { - try { - const url = new URL(urlString); - if (url.username && url.password) { - return `${url.protocol}//${url.username}:${url.password}@${url.host}` - } else { - return url.origin; - } - } catch (error) { - console.log(error); - return ''; - } - } else { - return ''; - } -} - -let nitterInstanceChange = debounce(() => { - if (nitterInstance.checkValidity()) { - browser.storage.sync.set({ - nitterInstance: parseURL(nitterInstance.value) - }); - } -}, 500); -nitterInstance.addEventListener('input', nitterInstanceChange); - -let invidiousInstanceChange = debounce(() => { - if (invidiousInstance.checkValidity()) { - browser.storage.sync.set({ - invidiousInstance: parseURL(invidiousInstance.value) - }); - } -}, 500); -invidiousInstance.addEventListener('input', invidiousInstanceChange); - -let bibliogramInstanceChange = debounce(() => { - if (bibliogramInstance.checkValidity()) { - browser.storage.sync.set({ - bibliogramInstance: parseURL(bibliogramInstance.value) - }); - } -}, 500); -bibliogramInstance.addEventListener('input', bibliogramInstanceChange); - -let osmInstanceChange = debounce(() => { - if (osmInstance.checkValidity()) { - browser.storage.sync.set({ - osmInstance: parseURL(osmInstance.value) - }); - } -}, 500); -osmInstance.addEventListener('input', osmInstanceChange); - disableNitter.addEventListener('change', event => { browser.storage.sync.set({ disableNitter: !event.target.checked }); }); diff --git a/pages/styles.css b/pages/styles.css index d9a7e5d..dd88a65 100644 --- a/pages/styles.css +++ b/pages/styles.css @@ -75,7 +75,7 @@ header .version { h1 { font-size: 14px; - margin: var(--space) auto; + margin: 7px auto; } i { @@ -122,7 +122,18 @@ input[type=checkbox] { opacity: 0; } +input[type=radio] { + appearance: radio; + -moz-appearance: radio; + -webkit-appearance: radio; +} + +input[type=radio]:checked+label { + background: transparent; +} + .checkbox-label { + margin-left: 5px; background: grey; border-radius: 25px; color: var(--text-main); @@ -156,12 +167,12 @@ input:checked+label:after { transform: translateX(-100%); } -.settings_block { +.settings-block { display: block; - padding: 10px 1em 1em 1em; + padding: 5px 10px 5px 10px; } -.settings_block h1 { +.settings-block h1 { float: left; } @@ -243,32 +254,37 @@ input:invalid { min-height: 510px; } -div.whitelist { +div.exceptions { clear: left; } -div.whitelist > input { +div.exceptions > input { width: 240px; float: left; } -#add-to-whitelist { - width: 120px; +#add-to-exceptions { float: right; border: var(--active) solid 1px; background-color: var(--active); color: var(--text-main); font-weight: bold; cursor: pointer; - border-radius: 25px; + border-radius: 50%; + padding: 1px 1px 0px 1px; + margin-right: 5px; +} + +#add-to-exceptions svg { + height: 20px; + width: 20px; } ul { padding: 0; list-style-type: none; color: var(--text-main); - margin-right: 20px; - margin-left: 20px; + margin: 20px 20px 0 20px; } li { @@ -276,7 +292,7 @@ li { padding: 20px 0px 20px 20px; } -#whitelist-items button { +#exceptions-items button { float: right; margin-right: -5px; border: var(--active) solid 1px; @@ -285,6 +301,7 @@ li { font-weight: bold; cursor: pointer; border-radius: 50%; + padding: 2px 2px 0px 2px; } .button svg { @@ -292,6 +309,109 @@ li { width: 18px; } +.autocomplete { + position: relative; + display: inline-block; + width: 100%; +} + +.autocomplete input { + background: url(../assets/images/chevron-down.svg) right no-repeat; +} + +.autocomplete-items { + position: absolute; + border: 1px solid var(--dark); + border-bottom: none; + border-top: none; + z-index: 99; + top: 100%; + left: 0; + right: 0; + overflow: auto; + max-height: 175px; +} + +.autocomplete-items div { + padding: 10px; + cursor: pointer; + background-color: var(--darker); + border-bottom: 1px solid var(--dark); +} + +.autocomplete-items div:hover { + background-color: var(--active); +} + +.autocomplete-active { + background-color: var(--active); + color: var(--lighter); +} + +.option { + width: 100%; +} + +.option td { + vertical-align: middle; +} + +input[type=range] { + -webkit-appearance: none; + margin: 18px 0; + width: 100%; +} + +input[type=range]:focus { + outline: none; +} + +input[type=range]::-webkit-slider-runnable-track { + width: 100%; + height: 8.4px; + cursor: pointer; + box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; + background: var(--light); + border-radius: 1.3px; + border: 0.2px solid #010101; +} + +input[type=range]::-webkit-slider-thumb { + box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; + border: 1px solid #000000; + height: 36px; + width: 16px; + border-radius: 3px; + background: var(--active); + cursor: pointer; + -webkit-appearance: none; + margin-top: -14px; +} + +input[type=range]:focus::-webkit-slider-runnable-track { + background: var(--light); +} + +input[type=range]::-moz-range-track { + width: 100%; + height: 8.4px; + cursor: pointer; + box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; + background: var(--light); + border-radius: 1.3px; + border: 0.2px solid #010101; +} + +input[type=range]::-moz-range-thumb { + box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; + border: 1px solid #000000; + height: 36px; + width: 16px; + border-radius: 3px; + background: var(--active); + cursor: pointer; +} + @media (prefers-color-scheme: dark) { body.popup, header, h1, input, select, div.tabcontent, button.tablinks.active { @@ -311,7 +431,6 @@ li { color: var(--text-main); opacity: 0.7; } - } @media (prefers-color-scheme: light) { @@ -347,4 +466,8 @@ li { button.tablinks.active { border-bottom: solid 1px var(--lighter); } + + .autocomplete-items div { + background-color: var(--light); + } } diff --git a/web-ext-config.js b/web-ext-config.js index 96c7c87..bfaa024 100644 --- a/web-ext-config.js +++ b/web-ext-config.js @@ -2,6 +2,8 @@ module.exports = { ignoreFiles: [ 'images/Screen*.png', 'images/small-tile.png', - 'buy-me-a-coffee.png' + 'buy-me-a-coffee.png', + 'logo*.png', + '*-badge.png' ], };