From d4eb025d765e0ae6c73d23795829181a6fd56f12 Mon Sep 17 00:00:00 2001 From: SimonBrazell Date: Wed, 27 May 2020 23:29:16 +1000 Subject: Stop redirecting Google Maps JS API endpoints (#56) --- background.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'background.js') diff --git a/background.js b/background.js index 5c847024..d7b7318c 100644 --- a/background.js +++ b/background.js @@ -55,7 +55,7 @@ const bibliogramInstances = [ 'https://bibliogram.snopyta.org' ]; const osmDefault = 'https://openstreetmap.org'; -const googleMapsRegex = /https?:\/\/(((www|maps)\.)?(google).*(\/maps)|maps\.(google).*)/; +const googleMapsRegex = /https?:\/\/(((www|maps)\.)?(google\.).*(\/maps)|maps\.(google\.).*)/; const mapCentreRegex = /@(-?\d[0-9.]*),(-?\d[0-9.]*),(\d{1,2})[.z]/; const dataLatLngRegex = /(!3d|!4d)(-?[0-9]{1,10}.[0-9]{1,10})/g; const placeRegex = /\/place\/(.*)\//; -- cgit 1.4.1 From 8bdaa8ae72d69a6fc22d7bec6ed5f55665343f41 Mon Sep 17 00:00:00 2001 From: SimonBrazell Date: Sun, 31 May 2020 10:26:15 +1000 Subject: Fixes #58 - No longer host YT JS assets --- assets/iframe_api.js | 5 - assets/www-widgetapi.js | 268 ------------------------------------------------ background.js | 38 +++---- manifest.json | 6 +- pages/popup/open.svg | 5 - pages/popup/popup.html | 11 +- pages/styles.css | 20 +++- 7 files changed, 44 insertions(+), 309 deletions(-) delete mode 100644 assets/iframe_api.js delete mode 100644 assets/www-widgetapi.js delete mode 100644 pages/popup/open.svg (limited to 'background.js') diff --git a/assets/iframe_api.js b/assets/iframe_api.js deleted file mode 100644 index 494cb3a3..00000000 --- a/assets/iframe_api.js +++ /dev/null @@ -1,5 +0,0 @@ -/* - Retrieved February 19, 2020, from https://www.youtube.com/iframe_api -*/ - -if (!window['YT']) { var YT = { loading: 0, loaded: 0 }; } if (!window['YTConfig']) { var YTConfig = { 'host': 'http://www.youtube.com' }; } if (!YT.loading) { YT.loading = 1; (function () { var l = []; YT.ready = function (f) { if (YT.loaded) { f(); } else { l.push(f); } }; window.onYTReady = function () { YT.loaded = 1; for (var i = 0; i < l.length; i++) { try { l[i](); } catch (e) { } } }; YT.setConfig = function (c) { for (var k in c) { if (c.hasOwnProperty(k)) { YTConfig[k] = c[k]; } } }; var a = document.createElement('script'); a.type = 'text/javascript'; a.id = 'www-widgetapi-script'; a.src = 'https://s.ytimg.com/yts/jsbin/www-widgetapi-vflYl14TA/www-widgetapi.js'; a.async = true; var c = document.currentScript; if (c) { var n = c.nonce || c.getAttribute('nonce'); if (n) { a.setAttribute('nonce', n); } } var b = document.getElementsByTagName('script')[0]; b.parentNode.insertBefore(a, b); })(); } \ No newline at end of file diff --git a/assets/www-widgetapi.js b/assets/www-widgetapi.js deleted file mode 100644 index a29cab05..00000000 --- a/assets/www-widgetapi.js +++ /dev/null @@ -1,268 +0,0 @@ -/* - Retrieved February 19, 2020, from https://s.ytimg.com/yts/jsbin/www-widgetapi-vflYl14TA/www-widgetapi.js -*/ - -(function () {/* - - Copyright The Closure Library Authors. - SPDX-License-Identifier: Apache-2.0 -*/ - var k; function aa() { var a = l, b = 0; return function () { return b < a.length ? { done: !1, value: a[b++] } : { done: !0 } } } - var ba = "function" == typeof Object.create ? Object.create : function (a) { - function b() { } - b.prototype = a; return new b - }, p; - if ("function" == typeof Object.setPrototypeOf) p = Object.setPrototypeOf; else { var q; a: { var ca = { K: !0 }, da = {}; try { da.__proto__ = ca; q = da.K; break a } catch (a) { } q = !1 } p = q ? function (a, b) { a.__proto__ = b; if (a.__proto__ !== b) throw new TypeError(a + " is not extensible"); return a } : null } var ea = p; - function fa(a, b) { a.prototype = ba(b.prototype); a.prototype.constructor = a; if (ea) ea(a, b); else for (var c in b) if ("prototype" != c) if (Object.defineProperties) { var d = Object.getOwnPropertyDescriptor(b, c); d && Object.defineProperty(a, c, d) } else a[c] = b[c]; a.J = b.prototype } - var ha = "function" == typeof Object.defineProperties ? Object.defineProperty : function (a, b, c) { a != Array.prototype && a != Object.prototype && (a[b] = c.value) }; - function ia(a) { a = ["object" == typeof window && window, "object" == typeof self && self, "object" == typeof global && global, a]; for (var b = 0; b < a.length; ++b) { var c = a[b]; if (c && c.Math == Math) return c } return globalThis } - var ja = ia(this); function ka(a, b) { if (b) { for (var c = ja, d = a.split("."), e = 0; e < d.length - 1; e++) { var f = d[e]; f in c || (c[f] = {}); c = c[f] } d = d[d.length - 1]; e = c[d]; f = b(e); f != e && null != f && ha(c, d, { configurable: !0, writable: !0, value: f }) } } - var la = "function" == typeof Object.assign ? Object.assign : function (a, b) { for (var c = 1; c < arguments.length; c++) { var d = arguments[c]; if (d) for (var e in d) Object.prototype.hasOwnProperty.call(d, e) && (a[e] = d[e]) } return a }; - ka("Object.assign", function (a) { return a || la }); - var r = this || self; function v(a) { a = a.split("."); for (var b = r, c = 0; c < a.length; c++)if (b = b[a[c]], null == b) return null; return b } - function ma() { } - function w(a) { - var b = typeof a; if ("object" == b) if (a) { if (a instanceof Array) return "array"; if (a instanceof Object) return b; var c = Object.prototype.toString.call(a); if ("[object Window]" == c) return "object"; if ("[object Array]" == c || "number" == typeof a.length && "undefined" != typeof a.splice && "undefined" != typeof a.propertyIsEnumerable && !a.propertyIsEnumerable("splice")) return "array"; if ("[object Function]" == c || "undefined" != typeof a.call && "undefined" != typeof a.propertyIsEnumerable && !a.propertyIsEnumerable("call")) return "function" } else return "null"; - else if ("function" == b && "undefined" == typeof a.call) return "object"; return b - } - function x(a) { var b = typeof a; return "object" == b && null != a || "function" == b } - function na(a) { return Object.prototype.hasOwnProperty.call(a, y) && a[y] || (a[y] = ++oa) } - var y = "closure_uid_" + (1E9 * Math.random() >>> 0), oa = 0; function pa(a, b, c) { return a.call.apply(a.bind, arguments) } - function qa(a, b, c) { if (!a) throw Error(); if (2 < arguments.length) { var d = Array.prototype.slice.call(arguments, 2); return function () { var e = Array.prototype.slice.call(arguments); Array.prototype.unshift.apply(e, d); return a.apply(b, e) } } return function () { return a.apply(b, arguments) } } - function z(a, b, c) { Function.prototype.bind && -1 != Function.prototype.bind.toString().indexOf("native code") ? z = pa : z = qa; return z.apply(null, arguments) } - var ra = Date.now || function () { return +new Date }; - function A(a, b) { var c = a.split("."), d = r; c[0] in d || "undefined" == typeof d.execScript || d.execScript("var " + c[0]); for (var e; c.length && (e = c.shift());)c.length || void 0 === b ? d[e] && d[e] !== Object.prototype[e] ? d = d[e] : d = d[e] = {} : d[e] = b } - function sa(a, b) { - function c() { } - c.prototype = b.prototype; a.J = b.prototype; a.prototype = new c; a.prototype.constructor = a - } - ; var ta = Array.prototype.indexOf ? function (a, b) { return Array.prototype.indexOf.call(a, b, void 0) } : function (a, b) { - if ("string" === typeof a) return "string" !== typeof b || 1 != b.length ? -1 : a.indexOf(b, 0); - for (var c = 0; c < a.length; c++)if (c in a && a[c] === b) return c; return -1 - }, B = Array.prototype.forEach ? function (a, b, c) { Array.prototype.forEach.call(a, b, c) } : function (a, b, c) { for (var d = a.length, e = "string" === typeof a ? a.split("") : a, f = 0; f < d; f++)f in e && b.call(c, e[f], f, a) }, ua = Array.prototype.reduce ? function (a, b, c) { return Array.prototype.reduce.call(a, b, c) } : function (a, b, c) { - var d = c; - B(a, function (e, f) { d = b.call(void 0, d, e, f, a) }); - return d - }; - function va(a, b) { a: { var c = a.length; for (var d = "string" === typeof a ? a.split("") : a, e = 0; e < c; e++)if (e in d && b.call(void 0, d[e], e, a)) { c = e; break a } c = -1 } return 0 > c ? null : "string" === typeof a ? a.charAt(c) : a[c] } - function wa(a) { return Array.prototype.concat.apply([], arguments) } - function xa(a) { var b = a.length; if (0 < b) { for (var c = Array(b), d = 0; d < b; d++)c[d] = a[d]; return c } return [] } - ; function ya(a) { var b = !1, c; return function () { b || (c = a(), b = !0); return c } } - ; var za = /&/g, Aa = //g, Ca = /"/g, Da = /'/g, Ea = /\x00/g, Fa = /[\x00&<>"']/; var E; a: { var Ga = r.navigator; if (Ga) { var Ha = Ga.userAgent; if (Ha) { E = Ha; break a } } E = "" }; function Ia(a, b) { for (var c in a) b.call(void 0, a[c], c, a) } - function Ja(a) { var b = F, c; for (c in b) if (a.call(void 0, b[c], c, b)) return c } - ; function G(a, b) { this.b = a === Ka && b || ""; this.a = La } - var La = {}, Ka = {}, H = new G(Ka, ""); function I(a, b) { this.b = a === Ma && b || ""; this.a = Na } - var Na = {}, Ma = {}; function Oa() { this.a = ""; this.b = Pa } - var Pa = {}; function Qa(a) { var b = new Oa; b.a = a; return b } - Qa(""); var J = Qa(""); Qa("
"); function Ra(a) { var b = new I(Ma, H instanceof G && H.constructor === G && H.a === La ? H.b : "type_error:Const"); a.src = (b instanceof I && b.constructor === I && b.a === Na ? b.b : "type_error:TrustedResourceUrl").toString() } - ; var K = window; function L(a, b) { this.width = a; this.height = b } - L.prototype.aspectRatio = function () { return this.width / this.height }; - L.prototype.ceil = function () { this.width = Math.ceil(this.width); this.height = Math.ceil(this.height); return this }; - L.prototype.floor = function () { this.width = Math.floor(this.width); this.height = Math.floor(this.height); return this }; - L.prototype.round = function () { this.width = Math.round(this.width); this.height = Math.round(this.height); return this }; function Sa(a, b) { var c, d; var e = document; e = b || e; if (e.querySelectorAll && e.querySelector && a) return e.querySelectorAll(a ? "." + a : ""); if (a && e.getElementsByClassName) { var f = e.getElementsByClassName(a); return f } f = e.getElementsByTagName("*"); if (a) { var g = {}; for (c = d = 0; e = f[c]; c++) { var h = e.className, m; if (m = "function" == typeof h.split) m = 0 <= ta(h.split(/\s+/), a); m && (g[d++] = e) } g.length = d; return g } return f } - function M(a) { var b = document; a = String(a); "application/xhtml+xml" === b.contentType && (a = a.toLowerCase()); return b.createElement(a) } - function Ta(a, b) { for (var c = 0; a;) { if (b(a)) return a; a = a.parentNode; c++ } return null } - ; var Ua = /^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/\\#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#([\s\S]*))?$/; function Va(a) { var b = a.match(Ua); a = b[1]; var c = b[2], d = b[3]; b = b[4]; var e = ""; a && (e += a + ":"); d && (e += "//", c && (e += c + "@"), e += d, b && (e += ":" + b)); return e } - function Wa(a, b, c) { if ("array" == w(b)) for (var d = 0; d < b.length; d++)Wa(a, String(b[d]), c); else null != b && c.push(a + ("" === b ? "" : "=" + encodeURIComponent(String(b)))) } - function Xa(a) { var b = [], c; for (c in a) Wa(c, a[c], b); return b.join("&") } - var Ya = /#|$/; function Za(a) { var b = $a; if (b) for (var c in b) Object.prototype.hasOwnProperty.call(b, c) && a.call(void 0, b[c], c, b) } - function ab() { - var a = []; Za(function (b) { a.push(b) }); - return a - } - var $a = { M: "allow-forms", N: "allow-modals", O: "allow-orientation-lock", P: "allow-pointer-lock", R: "allow-popups", S: "allow-popups-to-escape-sandbox", T: "allow-presentation", U: "allow-same-origin", V: "allow-scripts", W: "allow-top-navigation", X: "allow-top-navigation-by-user-activation" }, bb = ya(function () { return ab() }); - function cb() { - var a = M("IFRAME"), b = {}; B(bb(), function (c) { a.sandbox && a.sandbox.supports && a.sandbox.supports(c) && (b[c] = !0) }); - return b - } - ; var db = (new Date).getTime(); function eb() { this.b = []; this.a = -1 } - eb.prototype.set = function (a, b) { b = void 0 === b ? !0 : b; 0 <= a && 52 > a && 0 === a % 1 && this.b[a] != b && (this.b[a] = b, this.a = -1) }; - eb.prototype.get = function (a) { return !!this.b[a] }; - function fb(a) { - -1 == a.a && (a.a = ua(a.b, function (b, c, d) { return c ? b + Math.pow(2, d) : b }, 0)); - return a.a - } - ; function gb(a, b) { this.f = a; this.g = b; this.b = 0; this.a = null } - gb.prototype.get = function () { if (0 < this.b) { this.b--; var a = this.a; this.a = a.next; a.next = null } else a = this.f(); return a }; function hb(a) { r.setTimeout(function () { throw a; }, 0) } - var ib; - function jb() { - var a = r.MessageChannel; "undefined" === typeof a && "undefined" !== typeof window && window.postMessage && window.addEventListener && -1 == E.indexOf("Presto") && (a = function () { - var e = M("IFRAME"); e.style.display = "none"; Ra(e); document.documentElement.appendChild(e); var f = e.contentWindow; e = f.document; e.open(); e.write(J instanceof Oa && J.constructor === Oa && J.b === Pa ? J.a : "type_error:SafeHtml"); e.close(); var g = "callImmediate" + Math.random(), h = "file:" == f.location.protocol ? "*" : f.location.protocol + "//" + f.location.host; e = - z(function (m) { if (("*" == h || m.origin == h) && m.data == g) this.port1.onmessage() }, this); - f.addEventListener("message", e, !1); this.port1 = {}; this.port2 = { postMessage: function () { f.postMessage(g, h) } } - }); - if ("undefined" !== typeof a && -1 == E.indexOf("Trident") && -1 == E.indexOf("MSIE")) { - var b = new a, c = {}, d = c; b.port1.onmessage = function () { if (void 0 !== c.next) { c = c.next; var e = c.C; c.C = null; e() } }; - return function (e) { d.next = { C: e }; d = d.next; b.port2.postMessage(0) } - } return "undefined" !== typeof document && "onreadystatechange" in M("SCRIPT") ? function (e) { - var f = M("SCRIPT"); - f.onreadystatechange = function () { f.onreadystatechange = null; f.parentNode.removeChild(f); f = null; e(); e = null }; - document.documentElement.appendChild(f) - } : function (e) { r.setTimeout(e, 0) } - } - ; function kb() { this.b = this.a = null } - var mb = new gb(function () { return new lb }, function (a) { a.reset() }); - kb.prototype.add = function (a, b) { var c = mb.get(); c.set(a, b); this.b ? this.b.next = c : this.a = c; this.b = c }; - kb.prototype.remove = function () { var a = null; this.a && (a = this.a, this.a = this.a.next, this.a || (this.b = null), a.next = null); return a }; - function lb() { this.next = this.b = this.a = null } - lb.prototype.set = function (a, b) { this.a = a; this.b = b; this.next = null }; - lb.prototype.reset = function () { this.next = this.b = this.a = null }; function nb(a) { N || ob(); pb || (N(), pb = !0); qb.add(a, void 0) } - var N; function ob() { - if (r.Promise && r.Promise.resolve) { var a = r.Promise.resolve(void 0); N = function () { a.then(rb) } } else N = function () { - var b = rb, c; - !(c = "function" != w(r.setImmediate)) && (c = r.Window && r.Window.prototype) && (c = -1 == E.indexOf("Edge") && r.Window.prototype.setImmediate == r.setImmediate); c ? (ib || (ib = jb()), ib(b)) : r.setImmediate(b) - } - } - var pb = !1, qb = new kb; function rb() { for (var a; a = qb.remove();) { try { a.a.call(a.b) } catch (c) { hb(c) } var b = mb; b.g(a); 100 > b.b && (b.b++ , a.next = b.a, b.a = a) } pb = !1 } - ; function O() { this.f = this.f; this.g = this.g } - O.prototype.f = !1; O.prototype.dispose = function () { this.f || (this.f = !0, this.w()) }; - O.prototype.w = function () { if (this.g) for (; this.g.length;)this.g.shift()() }; var sb = r.JSON.stringify; function P(a) { O.call(this); this.m = 1; this.h = []; this.i = 0; this.a = []; this.b = {}; this.o = !!a } - sa(P, O); k = P.prototype; k.subscribe = function (a, b, c) { var d = this.b[a]; d || (d = this.b[a] = []); var e = this.m; this.a[e] = a; this.a[e + 1] = b; this.a[e + 2] = c; this.m = e + 3; d.push(e); return e }; - function tb(a, b, c) { var d = Q; if (a = d.b[a]) { var e = d.a; (a = va(a, function (f) { return e[f + 1] == b && e[f + 2] == c })) && d.B(a) } } - k.B = function (a) { var b = this.a[a]; if (b) { var c = this.b[b]; if (0 != this.i) this.h.push(a), this.a[a + 1] = ma; else { if (c) { var d = ta(c, a); 0 <= d && Array.prototype.splice.call(c, d, 1) } delete this.a[a]; delete this.a[a + 1]; delete this.a[a + 2] } } return !!b }; - k.G = function (a, b) { var c = this.b[a]; if (c) { for (var d = Array(arguments.length - 1), e = 1, f = arguments.length; e < f; e++)d[e - 1] = arguments[e]; if (this.o) for (e = 0; e < c.length; e++) { var g = c[e]; ub(this.a[g + 1], this.a[g + 2], d) } else { this.i++; try { for (e = 0, f = c.length; e < f; e++)g = c[e], this.a[g + 1].apply(this.a[g + 2], d) } finally { if (this.i-- , 0 < this.h.length && 0 == this.i) for (; c = this.h.pop();)this.B(c) } } return 0 != e } return !1 }; - function ub(a, b, c) { nb(function () { a.apply(b, c) }) } - k.clear = function (a) { if (a) { var b = this.b[a]; b && (B(b, this.B, this), delete this.b[a]) } else this.a.length = 0, this.b = {} }; - k.w = function () { P.J.w.call(this); this.clear(); this.h.length = 0 }; var R = window.yt && window.yt.config_ || window.ytcfg && window.ytcfg.data_ || {}; A("yt.config_", R); function vb(a) { var b = arguments; 1 < b.length ? R[b[0]] = b[1] : 1 === b.length && Object.assign(R, b[0]) } - function wb() { var a = []; return "ERRORS" in R ? R.ERRORS : a } - ; var xb = []; function yb(a) { xb.forEach(function (b) { return b(a) }) } - function zb(a) { return a && window.yterr ? function () { try { return a.apply(this, arguments) } catch (d) { var b = d, c = v("yt.logging.errors.log"); c ? c(b, "ERROR", void 0, void 0, void 0) : (c = wb(), c.push([b, "ERROR", void 0, void 0, void 0]), vb("ERRORS", c)); yb(d) } } : a } - ; var Ab = 0; A("ytDomDomGetNextId", v("ytDomDomGetNextId") || function () { return ++Ab }); var Bb = { stopImmediatePropagation: 1, stopPropagation: 1, preventMouseEvent: 1, preventManipulation: 1, preventDefault: 1, layerX: 1, layerY: 1, screenX: 1, screenY: 1, scale: 1, rotation: 1, webkitMovementX: 1, webkitMovementY: 1 }; - function S(a) { - this.type = ""; this.state = this.source = this.data = this.currentTarget = this.relatedTarget = this.target = null; this.charCode = this.keyCode = 0; this.metaKey = this.shiftKey = this.ctrlKey = this.altKey = !1; this.clientY = this.clientX = 0; this.changedTouches = this.touches = null; try { - if (a = a || window.event) { - this.event = a; for (var b in a) b in Bb || (this[b] = a[b]); var c = a.target || a.srcElement; c && 3 == c.nodeType && (c = c.parentNode); this.target = c; var d = a.relatedTarget; if (d) try { d = d.nodeName ? d : null } catch (e) { d = null } else "mouseover" == - this.type ? d = a.fromElement : "mouseout" == this.type && (d = a.toElement); this.relatedTarget = d; this.clientX = void 0 != a.clientX ? a.clientX : a.pageX; this.clientY = void 0 != a.clientY ? a.clientY : a.pageY; this.keyCode = a.keyCode ? a.keyCode : a.which; this.charCode = a.charCode || ("keypress" == this.type ? this.keyCode : 0); this.altKey = a.altKey; this.ctrlKey = a.ctrlKey; this.shiftKey = a.shiftKey; this.metaKey = a.metaKey - } - } catch (e) { } - } - S.prototype.preventDefault = function () { this.event && (this.event.returnValue = !1, this.event.preventDefault && this.event.preventDefault()) }; - S.prototype.stopPropagation = function () { this.event && (this.event.cancelBubble = !0, this.event.stopPropagation && this.event.stopPropagation()) }; - S.prototype.stopImmediatePropagation = function () { this.event && (this.event.cancelBubble = !0, this.event.stopImmediatePropagation && this.event.stopImmediatePropagation()) }; var F = v("ytEventsEventsListeners") || {}; A("ytEventsEventsListeners", F); var Cb = v("ytEventsEventsCounter") || { count: 0 }; A("ytEventsEventsCounter", Cb); - function Db(a, b, c, d) { - d = void 0 === d ? {} : d; a.addEventListener && ("mouseenter" != b || "onmouseenter" in document ? "mouseleave" != b || "onmouseenter" in document ? "mousewheel" == b && "MozBoxSizing" in document.documentElement.style && (b = "MozMousePixelScroll") : b = "mouseout" : b = "mouseover"); return Ja(function (e) { - var f = "boolean" === typeof e[4] && e[4] == !!d, g; if (g = x(e[4]) && x(d)) a: { g = e[4]; for (var h in g) if (!(h in d) || g[h] !== d[h]) { g = !1; break a } for (var m in d) if (!(m in g)) { g = !1; break a } g = !0 } return !!e.length && e[0] == a && e[1] == b && e[2] == - c && (f || g) - }) - } - function Eb(a) { a && ("string" == typeof a && (a = [a]), B(a, function (b) { if (b in F) { var c = F[b], d = c[0], e = c[1], f = c[3]; c = c[4]; d.removeEventListener ? Fb() || "boolean" === typeof c ? d.removeEventListener(e, f, c) : d.removeEventListener(e, f, !!c.capture) : d.detachEvent && d.detachEvent("on" + e, f); delete F[b] } })) } - var Fb = ya(function () { - var a = !1; try { - var b = Object.defineProperty({}, "capture", { get: function () { a = !0 } }); - window.addEventListener("test", null, b) - } catch (c) { } return a - }); - function Gb(a, b, c) { - var d = void 0 === d ? {} : d; if (a && (a.addEventListener || a.attachEvent)) { - var e = Db(a, b, c, d); if (!e) { - e = ++Cb.count + ""; var f = !("mouseenter" != b && "mouseleave" != b || !a.addEventListener || "onmouseenter" in document); var g = f ? function (h) { h = new S(h); if (!Ta(h.relatedTarget, function (m) { return m == a })) return h.currentTarget = a, h.type = b, c.call(a, h) } : function (h) { - h = new S(h); - h.currentTarget = a; return c.call(a, h) - }; - g = zb(g); a.addEventListener ? ("mouseenter" == b && f ? b = "mouseover" : "mouseleave" == b && f ? b = "mouseout" : "mousewheel" == b && "MozBoxSizing" in document.documentElement.style && (b = "MozMousePixelScroll"), Fb() || "boolean" === typeof d ? a.addEventListener(b, g, d) : a.addEventListener(b, g, !!d.capture)) : a.attachEvent("on" + b, g); F[e] = [a, b, c, g, d] - } - } - } - ; function Hb(a) { "function" == w(a) && (a = zb(a)); return window.setInterval(a, 250) } - ; function Ib(a) { - var b = []; Ia(a, function (c, d) { var e = encodeURIComponent(String(d)), f; "array" == w(c) ? f = c : f = [c]; B(f, function (g) { "" == g ? b.push(e) : b.push(e + "=" + encodeURIComponent(String(g))) }) }); - return b.join("&") - } - ; var Jb = {}; function Kb(a) { return Jb[a] || (Jb[a] = String(a).replace(/\-([a-z])/g, function (b, c) { return c.toUpperCase() })) } - ; var T = {}, l = [], Q = new P, Lb = {}; function Mb() { var a = "undefined" != typeof Symbol && Symbol.iterator && l[Symbol.iterator]; var b; a ? b = a.call(l) : b = { next: aa() }; a = b; for (b = a.next(); !b.done; b = a.next())b = b.value, b() } - function Nb(a, b) { b || (b = document); var c = xa(b.getElementsByTagName("yt:" + a)), d = "yt-" + a, e = b || document; d = xa(e.querySelectorAll && e.querySelector ? e.querySelectorAll("." + d) : Sa(d, b)); return wa(c, d) } - function U(a, b) { var c; "yt:" == a.tagName.toLowerCase().substr(0, 3) ? c = a.getAttribute(b) : c = a ? a.dataset ? a.dataset[Kb(b)] : a.getAttribute("data-" + b) : null; return c } - function Ob(a, b) { Q.G.apply(Q, arguments) } - ; function Pb(a) { this.b = a || {}; this.f = this.a = !1; a = document.getElementById("www-widgetapi-script"); if (this.a = !!("https:" == document.location.protocol || a && 0 == a.src.indexOf("https:"))) { a = [this.b, window.YTConfig || {}]; for (var b = 0; b < a.length; b++)a[b].host && (a[b].host = a[b].host.replace("http://", "https://")) } } - function V(a, b) { for (var c = [a.b, window.YTConfig || {}], d = 0; d < c.length; d++) { var e = c[d][b]; if (void 0 != e) return e } return null } - function Qb(a, b, c) { W || (W = {}, Gb(window, "message", z(a.g, a))); W[c] = b } - Pb.prototype.g = function (a) { if (a.origin == V(this, "host") || a.origin == V(this, "host").replace(/^http:/, "https:")) { try { var b = JSON.parse(a.data) } catch (c) { return } this.f = !0; this.a || 0 != a.origin.indexOf("https:") || (this.a = !0); if (a = W[b.id]) a.o = !0, a.o && (B(a.m, a.A, a), a.m.length = 0), a.H(b) } }; - var W = null; function Rb() { - var a = Sb, b = {}; b.dt = db; b.flash = "0"; a: { try { var c = a.a.top.location.href } catch (f) { a = 2; break a } a = c ? c === a.b.location.href ? 0 : 1 : 2 } b = (b.frm = a, b); b.u_tz = -(new Date).getTimezoneOffset(); var d = void 0 === d ? K : d; try { var e = d.history.length } catch (f) { e = 0 } b.u_his = e; b.u_java = !!K.navigator && "unknown" !== typeof K.navigator.javaEnabled && !!K.navigator.javaEnabled && K.navigator.javaEnabled(); K.screen && (b.u_h = K.screen.height, b.u_w = K.screen.width, b.u_ah = K.screen.availHeight, b.u_aw = K.screen.availWidth, b.u_cd = K.screen.colorDepth); - K.navigator && K.navigator.plugins && (b.u_nplug = K.navigator.plugins.length); K.navigator && K.navigator.mimeTypes && (b.u_nmime = K.navigator.mimeTypes.length); return b - } - function Tb() { - var a = Sb; var b = a.a; try { var c = b.screenX; var d = b.screenY } catch (t) { } try { var e = b.outerWidth; var f = b.outerHeight } catch (t) { } try { var g = b.innerWidth; var h = b.innerHeight } catch (t) { } b = [b.screenLeft, b.screenTop, c, d, b.screen ? b.screen.availWidth : void 0, b.screen ? b.screen.availTop : void 0, e, f, g, h]; c = a.a.top; try { var m = (c || window).document, n = "CSS1Compat" == m.compatMode ? m.documentElement : m.body; var u = (new L(n.clientWidth, n.clientHeight)).round() } catch (t) { u = new L(-12245933, -12245933) } m = u; u = {}; n = new eb; r.SVGElement && - r.document.createElementNS && n.set(0); c = cb(); c["allow-top-navigation-by-user-activation"] && n.set(1); c["allow-popups-to-escape-sandbox"] && n.set(2); r.crypto && r.crypto.subtle && n.set(3); r.TextDecoder && r.TextEncoder && n.set(4); n = fb(n); u.bc = n; u.bih = m.height; u.biw = m.width; u.brdim = b.join(); a = a.b; return u.vis = { visible: 1, hidden: 2, prerender: 3, preview: 4, unloaded: 5 }[a.visibilityState || a.webkitVisibilityState || a.mozVisibilityState || ""] || 0, u.wgl = !!K.WebGLRenderingContext, u - } - var Sb = new function () { var a = window.document; this.a = window; this.b = a }; - A("yt.ads_.signals_.getAdSignalsString", function (a) { a = void 0 === a ? v("yt.ads.biscotti.lastId_") || "" : a; var b = Object.assign(Rb(), Tb()); b.ca_type = "image"; a && (b.bid = a); return Ib(b) }); ra(); function X(a, b, c) { - this.i = this.a = this.b = null; this.h = na(this); this.f = 0; this.o = !1; this.m = []; this.g = null; this.D = c; this.I = {}; c = document; if (a = "string" === typeof a ? c.getElementById(a) : a) if (c = "iframe" == a.tagName.toLowerCase(), b.host || (b.host = c ? Va(a.src) : "https://www.youtube.com"), this.b = new Pb(b), c || (b = Ub(this, a), this.i = a, (c = a.parentNode) && c.replaceChild(b, a), a = b), this.a = a, this.a.id || (this.a.id = "widget" + na(this.a)), T[this.a.id] = this, window.postMessage) { - this.g = new P; Vb(this); b = V(this.b, "events"); for (var d in b) b.hasOwnProperty(d) && - this.addEventListener(d, b[d]); for (var e in Lb) Wb(this, e) - } - } - k = X.prototype; k.setSize = function (a, b) { this.a.width = a; this.a.height = b; return this }; - k.L = function () { return this.a }; - k.H = function (a) { this.s(a.event, a) }; - k.addEventListener = function (a, b) { - var c = b; "string" == typeof b && (c = function () { window[b].apply(window, arguments) }); - if (!c) return this; this.g.subscribe(a, c); Xb(this, a); return this - }; - function Wb(a, b) { var c = b.split("."); if (2 == c.length) { var d = c[1]; a.D == c[0] && Xb(a, d) } } - k.destroy = function () { this.a.id && (T[this.a.id] = null); var a = this.g; a && "function" == typeof a.dispose && a.dispose(); if (this.i) { a = this.a; var b = a.parentNode; b && b.replaceChild(this.i, a) } else (a = this.a) && a.parentNode && a.parentNode.removeChild(a); W && (W[this.h] = null); this.b = null; a = this.a; for (var c in F) F[c][0] == a && Eb(c); this.i = this.a = null }; - k.u = function () { return {} }; - function Yb(a, b, c) { c = c || []; c = Array.prototype.slice.call(c); b = { event: "command", func: b, args: c }; a.o ? a.A(b) : a.m.push(b) } - k.s = function (a, b) { if (!this.g.f) { var c = { target: this, data: b }; this.g.G(a, c); Ob(this.D + "." + a, c) } }; - function Ub(a, b) { - for (var c = document.createElement("iframe"), d = b.attributes, e = 0, f = d.length; e < f; e++) { var g = d[e].value; null != g && "" != g && "null" != g && c.setAttribute(d[e].name, g) } c.setAttribute("frameBorder", 0); c.setAttribute("allowfullscreen", 1); c.setAttribute("allow", "accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"); c.setAttribute("title", "YouTube " + V(a.b, "title")); (d = V(a.b, "width")) && c.setAttribute("width", d); (d = V(a.b, "height")) && c.setAttribute("height", d); var h = a.u(); h.enablejsapi = - window.postMessage ? 1 : 0; window.location.host && (h.origin = window.location.protocol + "//" + window.location.host); h.widgetid = a.h; window.location.href && B(["debugjs", "debugcss"], function (m) { - var n = window.location.href; var u = n.search(Ya); b: { var t = 0; for (var C = m.length; 0 <= (t = n.indexOf(m, t)) && t < u;) { var D = n.charCodeAt(t - 1); if (38 == D || 63 == D) if (D = n.charCodeAt(t + C), !D || 61 == D || 38 == D || 35 == D) break b; t += C + 1 } t = -1 } if (0 > t) n = null; else { - C = n.indexOf("&", t); if (0 > C || C > u) C = u; t += m.length + 1; n = decodeURIComponent(n.substr(t, C - t).replace(/\+/g, - " ")) - } null !== n && (h[m] = n) - }); - c.src = V(a.b, "host") + a.v() + "?" + Xa(h); return c - } - k.F = function () { this.a && this.a.contentWindow ? this.A({ event: "listening" }) : window.clearInterval(this.f) }; - function Vb(a) { Qb(a.b, a, a.h); a.f = Hb(z(a.F, a)); Gb(a.a, "load", z(function () { window.clearInterval(this.f); this.f = Hb(z(this.F, this)) }, a)) } - function Xb(a, b) { a.I[b] || (a.I[b] = !0, Yb(a, "addEventListener", [b])) } - k.A = function (a) { - a.id = this.h; a.channel = "widget"; a = sb(a); var b = this.b; var c = Va(this.a.src || ""); b = 0 == c.indexOf("https:") ? [c] : b.a ? [c.replace("http:", "https:")] : b.f ? [c] : [c, c.replace("http:", "https:")]; if (this.a.contentWindow) for (c = 0; c < b.length; c++)try { this.a.contentWindow.postMessage(a, b[c]) } catch (f) { - if (f.name && "SyntaxError" == f.name) { - if (!(f.message && 0 < f.message.indexOf("target origin ''"))) { - var d = f, e = v("yt.logging.errors.log"); e ? e(d, "WARNING", void 0, void 0, !1, void 0) : (e = wb(), e.push([d, "WARNING", void 0, - void 0, !1, void 0]), vb("ERRORS", e)) - } - } else throw f; - } else console && console.warn && console.warn("The YouTube player is not attached to the DOM. API calls should be made after the onReady event. See more: https://developers.google.com/youtube/iframe_api_reference#Events") - }; function Zb(a) { return (0 == a.search("cue") || 0 == a.search("load")) && "loadModule" != a } - function $b(a) { return 0 == a.search("get") || 0 == a.search("is") } - ; function Y(a, b) { if (!a) throw Error("YouTube player element ID required."); var c = { title: "video player", videoId: "", width: 640, height: 360 }; if (b) for (var d in b) c[d] = b[d]; X.call(this, a, c, "player"); this.j = {}; this.l = {} } - fa(Y, X); k = Y.prototype; k.v = function () { return "/embed/" + V(this.b, "videoId") }; - k.u = function () { var a = V(this.b, "playerVars"); if (a) { var b = {}, c; for (c in a) b[c] = a[c]; a = b } else a = {}; window != window.top && document.referrer && (a.widget_referrer = document.referrer.substring(0, 256)); if (c = V(this.b, "embedConfig")) { if (x(c)) try { c = JSON.stringify(c) } catch (d) { console.error("Invalid embed config JSON", d) } a.embed_config = c } return a }; - k.H = function (a) { var b = a.event; a = a.info; switch (b) { case "apiInfoDelivery": if (x(a)) for (var c in a) this.j[c] = a[c]; break; case "infoDelivery": ac(this, a); break; case "initialDelivery": window.clearInterval(this.f); this.l = {}; this.j = {}; bc(this, a.apiInterface); ac(this, a); break; default: this.s(b, a) } }; - function ac(a, b) { if (x(b)) for (var c in b) a.l[c] = b[c] } - function bc(a, b) { - B(b, function (c) { - this[c] || ("getCurrentTime" == c ? this[c] = function () { var d = this.l.currentTime; if (1 == this.l.playerState) { var e = (ra() / 1E3 - this.l.currentTimeLastUpdated_) * this.l.playbackRate; 0 < e && (d += Math.min(e, 1)) } return d } : Zb(c) ? this[c] = function () { - this.l = {}; - this.j = {}; Yb(this, c, arguments); return this - } : $b(c) ? this[c] = function () { - var d = 0; - 0 == c.search("get") ? d = 3 : 0 == c.search("is") && (d = 2); return this.l[c.charAt(d).toLowerCase() + c.substr(d + 1)] - } : this[c] = function () { - Yb(this, c, arguments); - return this - }) - }, a) - } - k.getVideoEmbedCode = function () { - var a = parseInt(V(this.b, "width"), 10); var b = parseInt(V(this.b, "height"), 10), c = V(this.b, "host") + this.v(); Fa.test(c) && (-1 != c.indexOf("&") && (c = c.replace(za, "&")), -1 != c.indexOf("<") && (c = c.replace(Aa, "<")), -1 != c.indexOf(">") && (c = c.replace(Ba, ">")), -1 != c.indexOf('"') && (c = c.replace(Ca, """)), -1 != c.indexOf("'") && (c = c.replace(Da, "'")), -1 != c.indexOf("\x00") && (c = c.replace(Ea, "�"))); a = ''; - return a - }; - k.getOptions = function (a) { return this.j.namespaces ? a ? this.j[a].options || [] : this.j.namespaces || [] : [] }; - k.getOption = function (a, b) { if (this.j.namespaces && a && b) return this.j[a][b] }; - function cc(a) { if ("iframe" != a.tagName.toLowerCase()) { var b = U(a, "videoid"); b && (b = { videoId: b, width: U(a, "width"), height: U(a, "height") }, new Y(a, b)) } } - ; function Z(a, b) { var c = { title: "Thumbnail", videoId: "", width: 120, height: 68 }; if (b) for (var d in b) c[d] = b[d]; X.call(this, a, c, "thumbnail") } - fa(Z, X); Z.prototype.v = function () { return "/embed/" + V(this.b, "videoId") }; - Z.prototype.u = function () { return { player: 0, thumb_width: V(this.b, "thumbWidth"), thumb_height: V(this.b, "thumbHeight"), thumb_align: V(this.b, "thumbAlign") } }; - Z.prototype.s = function (a, b) { X.prototype.s.call(this, a, b ? b.info : void 0) }; - function dc(a) { if ("iframe" != a.tagName.toLowerCase()) { var b = U(a, "videoid"); if (b) { b = { videoId: b, events: {}, width: U(a, "width"), height: U(a, "height"), thumbWidth: U(a, "thumb-width"), thumbHeight: U(a, "thumb-height"), thumbAlign: U(a, "thumb-align") }; var c = U(a, "onclick"); c && (b.events.onClick = c); new Z(a, b) } } } - ; A("YT.PlayerState.UNSTARTED", -1); A("YT.PlayerState.ENDED", 0); A("YT.PlayerState.PLAYING", 1); A("YT.PlayerState.PAUSED", 2); A("YT.PlayerState.BUFFERING", 3); A("YT.PlayerState.CUED", 5); A("YT.get", function (a) { return T[a] }); - A("YT.scan", Mb); A("YT.subscribe", function (a, b, c) { Q.subscribe(a, b, c); Lb[a] = !0; for (var d in T) Wb(T[d], a) }); - A("YT.unsubscribe", function (a, b, c) { tb(a, b, c) }); - A("YT.Player", Y); A("YT.Thumbnail", Z); X.prototype.destroy = X.prototype.destroy; X.prototype.setSize = X.prototype.setSize; X.prototype.getIframe = X.prototype.L; X.prototype.addEventListener = X.prototype.addEventListener; Y.prototype.getVideoEmbedCode = Y.prototype.getVideoEmbedCode; Y.prototype.getOptions = Y.prototype.getOptions; Y.prototype.getOption = Y.prototype.getOption; l.push(function (a) { a = Nb("player", a); B(a, cc) }); - l.push(function () { var a = Nb("thumbnail"); B(a, dc) }); - "undefined" != typeof YTConfig && YTConfig.parsetags && "onload" != YTConfig.parsetags || Mb(); var ec = v("onYTReady"); ec && ec(); var fc = v("onYouTubeIframeAPIReady"); fc && fc(); var gc = v("onYouTubePlayerAPIReady"); gc && gc(); -}).call(this); \ No newline at end of file diff --git a/background.js b/background.js index d7b7318c..c4783e3e 100644 --- a/background.js +++ b/background.js @@ -200,28 +200,24 @@ function redirectYouTube(url, initiator, type) { if (initiator && (initiator.origin === invidiousInstance || youtubeDomains.includes(initiator.host))) { return null; } - if (url.pathname.match(/iframe_api/)) { - // Redirect requests for YouTube Player API to local files instead - return browser.runtime.getURL('assets/iframe_api.js'); - } else if (url.pathname.match(/www-widgetapi/)) { - // Redirect requests for YouTube Player API to local files instead - return browser.runtime.getURL('assets/www-widgetapi.js'); - } else { - // Proxy video through the server if enabled by user - if (alwaysProxy) { - url.searchParams.append('local', true); - } - if (videoQuality) { - url.searchParams.append('quality', videoQuality); - } - if (onlyEmbeddedVideo && type !== 'sub_frame') { - return null; - } - if (invidiousDarkMode) { - url.searchParams.append('dark_mode', invidiousDarkMode); - } - return `${invidiousInstance}${url.pathname}${url.search}`; + if (url.pathname.match(/iframe_api/) || url.pathname.match(/www-widgetapi/)) { + // Don't redirect YouTube Player API. + return null; + } + // Proxy video through the server if enabled by user + if (alwaysProxy) { + url.searchParams.append('local', true); + } + if (videoQuality) { + url.searchParams.append('quality', videoQuality); + } + if (onlyEmbeddedVideo && type !== 'sub_frame') { + return null; + } + if (invidiousDarkMode) { + url.searchParams.append('dark_mode', invidiousDarkMode); } + return `${invidiousInstance}${url.pathname}${url.search}`; } function redirectTwitter(url, initiator) { diff --git a/manifest.json b/manifest.json index 00a45f09..3127beb6 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.30", + "version": "1.1.31", "manifest_version": 2, "background": { "scripts": [ @@ -73,10 +73,6 @@ "page": "pages/options/options.html", "open_in_tab": false }, - "web_accessible_resources": [ - "assets/iframe_api.js", - "assets/www-widgetapi.js" - ], "browser_specific_settings": { "gecko": { "id": "{b7f9d2cd-d772-4302-8c3f-eb941af36f76}" diff --git a/pages/popup/open.svg b/pages/popup/open.svg deleted file mode 100644 index 04f56c15..00000000 --- a/pages/popup/open.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/pages/popup/popup.html b/pages/popup/popup.html index ede8c411..45a88052 100644 --- a/pages/popup/popup.html +++ b/pages/popup/popup.html @@ -112,7 +112,14 @@ @@ -120,4 +127,4 @@ - + \ No newline at end of file diff --git a/pages/styles.css b/pages/styles.css index 17b5f7f7..c00add43 100644 --- a/pages/styles.css +++ b/pages/styles.css @@ -137,7 +137,7 @@ input[type=checkbox] { } .checkbox-label:after { - background: #fff; + background: var(--text-main); border-radius: 90px; content: ''; height: 20px; @@ -168,6 +168,7 @@ input:checked+label:after { .button { border: var(--active) solid 1px; color: var(--text-main); + stroke: var(--text-main); display: block; font-size: 12px; font-weight: bold; @@ -186,7 +187,8 @@ input:checked+label:after { .button:hover { background-color: var(--active); - color: #fff; + color: var(--text-main); + stroke: var(--text-main); } .button:active { @@ -237,7 +239,6 @@ input:invalid { .tabcontent { padding-top: 10px; display: none; - border: solid 1px var(--dark); background-color: var(--dark); min-height: 510px; } @@ -286,6 +287,11 @@ li { border-radius: 50%; } +.button svg { + height: 18px; + width: 18px; +} + @media (prefers-color-scheme: dark) { body.popup, header, h1, input, select, div.tabcontent, button.tablinks.active { @@ -321,6 +327,7 @@ li { a.button { color: var(--text-secondary); + stroke: var(--text-secondary); } button.tablinks { @@ -333,4 +340,11 @@ li { opacity: 0.7; } + .tab button { + border-bottom: solid 1px var(--light); + } + + button.tablinks.active { + border-bottom: solid 1px var(--lighter); + } } -- cgit 1.4.1 From 3f015690992c8e0bd43c90e15a9aa88889defcc6 Mon Sep 17 00:00:00 2001 From: SimonBrazell Date: Wed, 3 Jun 2020 22:01:27 +1000 Subject: Fix #60 & complete #30 - YT studio & Nitter "View on..." links --- assets/remove-twitter-sw.js | 8 ++++++-- background.js | 10 ++++++++++ manifest.json | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) (limited to 'background.js') diff --git a/assets/remove-twitter-sw.js b/assets/remove-twitter-sw.js index d13de3e1..b897a18b 100644 --- a/assets/remove-twitter-sw.js +++ b/assets/remove-twitter-sw.js @@ -18,7 +18,7 @@ function redirectTwitter(url) { } browser.storage.sync.get( - ['nitterInstance', 'disableNitter', 'removeTwitterSW'], + ['nitterInstance', 'disableNitter', 'removeTwitterSW', 'redirectBypassFlag'], (result) => { if (!result.removeTwitterSW) { disableNitter = result.disableNitter; @@ -32,7 +32,11 @@ browser.storage.sync.get( } }); const url = new URL(window.location); - if (!disableNitter && url.host !== nitterInstance) { + const redirectBypassFlag = result.redirectBypassFlag; + browser.storage.sync.set({ + redirectBypassFlag: false + }); + if (!redirectBypassFlag && !disableNitter && url.host !== nitterInstance) { const redirect = redirectTwitter(url); console.info( 'Redirecting', `"${url.href}"`, '=>', `"${redirect}"` diff --git a/background.js b/background.js index c4783e3e..1a64639c 100644 --- a/background.js +++ b/background.js @@ -204,6 +204,10 @@ function redirectYouTube(url, initiator, type) { // Don't redirect YouTube Player API. return null; } + if (url.host.split('.')[0] === 'studio') { + // Avoid redirecting `studio.youtube.com` + return null; + } // Proxy video through the server if enabled by user if (alwaysProxy) { url.searchParams.append('local', true); @@ -224,6 +228,12 @@ function redirectTwitter(url, initiator) { if (disableNitter || isWhitelisted(initiator)) { return null; } + if (initiator && (initiator.origin === nitterInstance || twitterDomains.includes(initiator.host))) { + browser.storage.sync.set({ + redirectBypassFlag: true + }); + return null; + } if (url.host.split('.')[0] === 'pbs') { return `${nitterInstance}/pic/${encodeURIComponent(url.href)}`; } else if (url.host.split('.')[0] === 'video') { diff --git a/manifest.json b/manifest.json index 3127beb6..a0a927a1 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.31", + "version": "1.1.32", "manifest_version": 2, "background": { "scripts": [ -- cgit 1.4.1 From b21610202fcddf01e251dee1c67b90f8f369f002 Mon Sep 17 00:00:00 2001 From: SimonBrazell Date: Sun, 7 Jun 2020 22:08:15 +1000 Subject: Closes #38, fixes #61, closes #64 --- assets/remove-twitter-sw.js | 10 +++++----- background.js | 22 +++++++++++++++++----- manifest.json | 2 +- 3 files changed, 23 insertions(+), 11 deletions(-) (limited to 'background.js') diff --git a/assets/remove-twitter-sw.js b/assets/remove-twitter-sw.js index b897a18b..37200f1a 100644 --- a/assets/remove-twitter-sw.js +++ b/assets/remove-twitter-sw.js @@ -20,6 +20,10 @@ function redirectTwitter(url) { browser.storage.sync.get( ['nitterInstance', 'disableNitter', 'removeTwitterSW', 'redirectBypassFlag'], (result) => { + const redirectBypassFlag = result.redirectBypassFlag; + browser.storage.sync.set({ + redirectBypassFlag: false + }); if (!result.removeTwitterSW) { disableNitter = result.disableNitter; nitterInstance = result.nitterInstance || nitterDefault; @@ -32,11 +36,7 @@ browser.storage.sync.get( } }); const url = new URL(window.location); - const redirectBypassFlag = result.redirectBypassFlag; - browser.storage.sync.set({ - redirectBypassFlag: false - }); - if (!redirectBypassFlag && !disableNitter && url.host !== nitterInstance) { + if (!redirectBypassFlag && !disableNitter && url.host !== nitterInstance && !url.pathname.includes('/home')) { const redirect = redirectTwitter(url); console.info( 'Redirecting', `"${url.href}"`, '=>', `"${redirect}"` diff --git a/background.js b/background.js index 1a64639c..f3a50cf6 100644 --- a/background.js +++ b/background.js @@ -10,6 +10,7 @@ const youtubeDomains = [ 'www.youtube-nocookie.com', 'youtu.be', 's.ytimg.com', + 'music.youtube.com' ]; const nitterDefault = 'https://nitter.net'; const twitterDomains = [ @@ -85,6 +86,7 @@ let onlyEmbeddedVideo; let videoQuality; let invidiousDarkMode; let whitelist; +let redirectBypassFlag; window.browser = window.browser || window.chrome; @@ -161,6 +163,9 @@ browser.storage.onChanged.addListener(changes => { if ('whitelist' in changes) { whitelist = changes.whitelist.newValue.map(e => new RegExp(e)); } + if ('redirectBypassFlag' in changes) { + redirectBypassFlag = changes.redirectBypassFlag.newValue; + } }); function addressToLatLng(address, callback) { @@ -193,6 +198,10 @@ function isWhitelisted(initiator) { return initiator && whitelist.some(regex => (regex.test(initiator.href))); } +function isFirefox() { + return typeof InstallTrigger !== 'undefined'; +} + function redirectYouTube(url, initiator, type) { if (disableInvidious || isWhitelisted(initiator)) { return null; @@ -208,16 +217,16 @@ function redirectYouTube(url, initiator, type) { // Avoid redirecting `studio.youtube.com` return null; } - // Proxy video through the server if enabled by user + if (onlyEmbeddedVideo && type !== 'sub_frame') { + return null; + } + // Apply settings if (alwaysProxy) { url.searchParams.append('local', true); } if (videoQuality) { url.searchParams.append('quality', videoQuality); } - if (onlyEmbeddedVideo && type !== 'sub_frame') { - return null; - } if (invidiousDarkMode) { url.searchParams.append('dark_mode', invidiousDarkMode); } @@ -228,7 +237,10 @@ function redirectTwitter(url, initiator) { if (disableNitter || isWhitelisted(initiator)) { return null; } - if (initiator && (initiator.origin === nitterInstance || twitterDomains.includes(initiator.host))) { + if (url.pathname.includes('/home')) { + return null; + } + if (isFirefox() && initiator && (initiator.origin === nitterInstance || twitterDomains.includes(initiator.host))) { browser.storage.sync.set({ redirectBypassFlag: true }); diff --git a/manifest.json b/manifest.json index a0a927a1..542c81cc 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.32", + "version": "1.1.33", "manifest_version": 2, "background": { "scripts": [ -- cgit 1.4.1 From 0892d0c30ac973b2f01eb678af88f4dd0fc8531b Mon Sep 17 00:00:00 2001 From: SimonBrazell Date: Mon, 8 Jun 2020 11:50:12 +1000 Subject: Closes #64, closes #38 - Fix whitelist & Twitter `/home` exception --- README.md | 2 +- assets/remove-twitter-sw.js | 21 +++++++++++++++++++-- background.js | 25 +++++++++++++------------ manifest.json | 2 +- pages/styles.css | 2 +- 5 files changed, 35 insertions(+), 17 deletions(-) (limited to 'background.js') diff --git a/README.md b/README.md index 2bb6c3a1..e5ee60f5 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Allows for setting custom [Nitter](https://github.com/zedeus/nitter/wiki/Instanc ## Build 1. `npm install --global web-ext` -2. `web-ext build` +2. `web-ext build --overwrite-dest` 3. See `web-ext-artifacts/` for outputs. ## License diff --git a/assets/remove-twitter-sw.js b/assets/remove-twitter-sw.js index 37200f1a..d1b30637 100644 --- a/assets/remove-twitter-sw.js +++ b/assets/remove-twitter-sw.js @@ -4,9 +4,23 @@ const nitterDefault = 'https://nitter.net'; let disableNitter; let nitterInstance; +let redirectBypassFlag; +let whitelist; window.browser = window.browser || window.chrome; +function isNotWhitelisted(url) { + return !whitelist.some(regex => (regex.test(url.href))); +} + +function shouldRedirect(url) { + return !redirectBypassFlag && + isNotWhitelisted(url) && + !disableNitter && + url.host !== nitterInstance && + !url.pathname.includes('/home'); +} + function redirectTwitter(url) { if (url.host.split('.')[0] === 'pbs') { return `${nitterInstance}/pic/${encodeURIComponent(url.href)}`; @@ -20,13 +34,16 @@ function redirectTwitter(url) { browser.storage.sync.get( ['nitterInstance', 'disableNitter', 'removeTwitterSW', 'redirectBypassFlag'], (result) => { - const redirectBypassFlag = result.redirectBypassFlag; + redirectBypassFlag = result.redirectBypassFlag; browser.storage.sync.set({ redirectBypassFlag: false }); if (!result.removeTwitterSW) { disableNitter = result.disableNitter; nitterInstance = result.nitterInstance || nitterDefault; + whitelist = result.whitelist ? result.whitelist.map(e => { + return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')); + }) : []; navigator.serviceWorker.getRegistrations().then(registrations => { for (let registration of registrations) { if (registration.scope === 'https://twitter.com/') { @@ -36,7 +53,7 @@ browser.storage.sync.get( } }); const url = new URL(window.location); - if (!redirectBypassFlag && !disableNitter && url.host !== nitterInstance && !url.pathname.includes('/home')) { + if (shouldRedirect()) { const redirect = redirectTwitter(url); console.info( 'Redirecting', `"${url.href}"`, '=>', `"${redirect}"` diff --git a/background.js b/background.js index f3a50cf6..5810f42a 100644 --- a/background.js +++ b/background.js @@ -86,7 +86,6 @@ let onlyEmbeddedVideo; let videoQuality; let invidiousDarkMode; let whitelist; -let redirectBypassFlag; window.browser = window.browser || window.chrome; @@ -119,7 +118,9 @@ browser.storage.sync.get( onlyEmbeddedVideo = result.onlyEmbeddedVideo; videoQuality = result.videoQuality; invidiousDarkMode = result.invidiousDarkMode; - whitelist = result.whitelist ? result.whitelist.map(e => new RegExp(e)) : []; + whitelist = result.whitelist ? result.whitelist.map(e => { + return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')); + }) : []; } ); @@ -161,10 +162,9 @@ browser.storage.onChanged.addListener(changes => { invidiousDarkMode = changes.invidiousDarkMode.newValue; } if ('whitelist' in changes) { - whitelist = changes.whitelist.newValue.map(e => new RegExp(e)); - } - if ('redirectBypassFlag' in changes) { - redirectBypassFlag = changes.redirectBypassFlag.newValue; + whitelist = changes.whitelist.newValue.map(e => { + return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')); + }); } }); @@ -194,8 +194,9 @@ function addressToLatLng(address, callback) { xmlhttp.send(); } -function isWhitelisted(initiator) { - return initiator && whitelist.some(regex => (regex.test(initiator.href))); +function isWhitelisted(url, initiator) { + return whitelist.some(regex => (regex.test(url.href))) || + (initiator && whitelist.some(regex => (regex.test(initiator.href)))); } function isFirefox() { @@ -203,7 +204,7 @@ function isFirefox() { } function redirectYouTube(url, initiator, type) { - if (disableInvidious || isWhitelisted(initiator)) { + if (disableInvidious || isWhitelisted(url, initiator)) { return null; } if (initiator && (initiator.origin === invidiousInstance || youtubeDomains.includes(initiator.host))) { @@ -234,7 +235,7 @@ function redirectYouTube(url, initiator, type) { } function redirectTwitter(url, initiator) { - if (disableNitter || isWhitelisted(initiator)) { + if (disableNitter || isWhitelisted(url, initiator)) { return null; } if (url.pathname.includes('/home')) { @@ -258,7 +259,7 @@ function redirectTwitter(url, initiator) { } function redirectInstagram(url, initiator, type) { - if (disableBibliogram || isWhitelisted(initiator)) { + if (disableBibliogram || isWhitelisted(url, initiator)) { return null; } // Do not redirect Bibliogram view on Instagram links @@ -278,7 +279,7 @@ function redirectInstagram(url, initiator, type) { } function redirectGoogleMaps(url, initiator) { - if (disableOsm || isWhitelisted(initiator)) { + if (disableOsm || isWhitelisted(url, initiator)) { return null; } let redirect; diff --git a/manifest.json b/manifest.json index 542c81cc..b34cfc77 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.33", + "version": "1.1.34", "manifest_version": 2, "background": { "scripts": [ diff --git a/pages/styles.css b/pages/styles.css index c00add43..d9a7e5df 100644 --- a/pages/styles.css +++ b/pages/styles.css @@ -316,7 +316,7 @@ li { @media (prefers-color-scheme: light) { - body.popup, header, h1, input, select, div.tabcontent, button.tablinks.active { + body.popup, header, h1, input, select, div.tabcontent, button.tablinks.active, ul { background-color: var(--lighter); color: var(--text-secondary); } -- cgit 1.4.1 From 745c5babcf9104924631185b2ea3f235c45d270a Mon Sep 17 00:00:00 2001 From: SimonBrazell Date: Sun, 12 Jul 2020 11:26:48 +1000 Subject: 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 +++++++ assets/images/Screen Shot Chrome 1.png | Bin 0 -> 495422 bytes assets/images/Screen Shot Chrome 2.png | Bin 0 -> 882289 bytes assets/images/Screen Shot Chrome 3.png | Bin 0 -> 313416 bytes assets/images/Screen Shot Chrome 4.png | Bin 0 -> 1264130 bytes assets/images/Screen Shot Chrome 5.png | Bin 0 -> 320255 bytes assets/images/Screen Shot FF 1.png | Bin 0 -> 696755 bytes assets/images/Screen Shot FF 2.png | Bin 0 -> 3036251 bytes assets/images/Screen Shot FF 3.png | Bin 0 -> 530328 bytes assets/images/Screen Shot FF 4.png | Bin 0 -> 3646768 bytes assets/images/Screen Shot FF 5.png | Bin 0 -> 542853 bytes assets/images/amo-badge.png | Bin 0 -> 2827 bytes assets/images/buy-me-a-coffee.png | Bin 0 -> 5008 bytes assets/images/chevron-down.svg | 3 + assets/images/chrome-badge.png | Bin 0 -> 3762 bytes assets/images/icon128.png | Bin 0 -> 3197 bytes assets/images/icon16.png | Bin 0 -> 976 bytes assets/images/icon32.png | Bin 0 -> 1983 bytes assets/images/icon48.png | Bin 0 -> 1063 bytes assets/images/logo-small.png | Bin 0 -> 22050 bytes assets/images/logo.png | Bin 0 -> 39876 bytes assets/images/small-tile.png | Bin 0 -> 35583 bytes assets/javascript/localise.js | 19 ++ assets/javascript/persist-invidious-prefs.js | 30 +++ assets/javascript/remove-twitter-sw.js | 71 +++++ assets/persist-invidious-prefs.js | 30 --- assets/remove-twitter-sw.js | 65 ----- background.js | 85 ++++-- images/Screen Shot Chrome 1.png | Bin 495422 -> 0 bytes images/Screen Shot Chrome 2.png | Bin 882289 -> 0 bytes images/Screen Shot Chrome 3.png | Bin 313416 -> 0 bytes images/Screen Shot Chrome 4.png | Bin 1264130 -> 0 bytes images/Screen Shot Chrome 5.png | Bin 320255 -> 0 bytes images/Screen Shot FF 1.png | Bin 696755 -> 0 bytes images/Screen Shot FF 2.png | Bin 3036251 -> 0 bytes images/Screen Shot FF 3.png | Bin 530328 -> 0 bytes images/Screen Shot FF 4.png | Bin 3646768 -> 0 bytes images/Screen Shot FF 5.png | Bin 542853 -> 0 bytes images/buy-me-a-coffee.png | Bin 5008 -> 0 bytes images/icon128.png | Bin 3197 -> 0 bytes images/icon16.png | Bin 976 -> 0 bytes images/icon32.png | Bin 1983 -> 0 bytes images/icon48.png | Bin 1063 -> 0 bytes images/logo.png | Bin 39876 -> 0 bytes images/small-tile.png | Bin 35583 -> 0 bytes manifest.json | 27 +- pages/options/options.html | 376 +++++++++++++++++---------- pages/options/options.js | 225 ++++++++++++++-- pages/popup/popup.html | 149 +++++------ pages/popup/popup.js | 81 ------ pages/styles.css | 149 ++++++++++- web-ext-config.js | 4 +- 54 files changed, 1051 insertions(+), 466 deletions(-) create mode 100644 _locales/en/messages.json create mode 100644 _locales/fr/messages.json create mode 100644 assets/images/Screen Shot Chrome 1.png create mode 100644 assets/images/Screen Shot Chrome 2.png create mode 100644 assets/images/Screen Shot Chrome 3.png create mode 100644 assets/images/Screen Shot Chrome 4.png create mode 100644 assets/images/Screen Shot Chrome 5.png create mode 100644 assets/images/Screen Shot FF 1.png create mode 100644 assets/images/Screen Shot FF 2.png create mode 100644 assets/images/Screen Shot FF 3.png create mode 100644 assets/images/Screen Shot FF 4.png create mode 100644 assets/images/Screen Shot FF 5.png create mode 100644 assets/images/amo-badge.png create mode 100644 assets/images/buy-me-a-coffee.png create mode 100644 assets/images/chevron-down.svg create mode 100644 assets/images/chrome-badge.png create mode 100644 assets/images/icon128.png create mode 100644 assets/images/icon16.png create mode 100644 assets/images/icon32.png create mode 100644 assets/images/icon48.png create mode 100644 assets/images/logo-small.png create mode 100644 assets/images/logo.png create mode 100644 assets/images/small-tile.png create mode 100644 assets/javascript/localise.js create mode 100644 assets/javascript/persist-invidious-prefs.js create mode 100644 assets/javascript/remove-twitter-sw.js delete mode 100644 assets/persist-invidious-prefs.js delete mode 100644 assets/remove-twitter-sw.js delete mode 100644 images/Screen Shot Chrome 1.png delete mode 100644 images/Screen Shot Chrome 2.png delete mode 100644 images/Screen Shot Chrome 3.png delete mode 100644 images/Screen Shot Chrome 4.png delete mode 100644 images/Screen Shot Chrome 5.png delete mode 100644 images/Screen Shot FF 1.png delete mode 100644 images/Screen Shot FF 2.png delete mode 100644 images/Screen Shot FF 3.png delete mode 100644 images/Screen Shot FF 4.png delete mode 100644 images/Screen Shot FF 5.png delete mode 100644 images/buy-me-a-coffee.png delete mode 100644 images/icon128.png delete mode 100644 images/icon16.png delete mode 100644 images/icon32.png delete mode 100644 images/icon48.png delete mode 100644 images/logo.png delete mode 100644 images/small-tile.png (limited to 'background.js') diff --git a/README.md b/README.md index e5ee60f5..29ccd7b6 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 00000000..2a34b8b7 --- /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 00000000..fe2eaaf6 --- /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/assets/images/Screen Shot Chrome 1.png b/assets/images/Screen Shot Chrome 1.png new file mode 100644 index 00000000..65e18e2a Binary files /dev/null and b/assets/images/Screen Shot Chrome 1.png differ diff --git a/assets/images/Screen Shot Chrome 2.png b/assets/images/Screen Shot Chrome 2.png new file mode 100644 index 00000000..7bb98a4a Binary files /dev/null and b/assets/images/Screen Shot Chrome 2.png differ diff --git a/assets/images/Screen Shot Chrome 3.png b/assets/images/Screen Shot Chrome 3.png new file mode 100644 index 00000000..3a4fbd35 Binary files /dev/null and b/assets/images/Screen Shot Chrome 3.png differ diff --git a/assets/images/Screen Shot Chrome 4.png b/assets/images/Screen Shot Chrome 4.png new file mode 100644 index 00000000..8954e923 Binary files /dev/null and b/assets/images/Screen Shot Chrome 4.png differ diff --git a/assets/images/Screen Shot Chrome 5.png b/assets/images/Screen Shot Chrome 5.png new file mode 100644 index 00000000..bf0ffa08 Binary files /dev/null and b/assets/images/Screen Shot Chrome 5.png differ diff --git a/assets/images/Screen Shot FF 1.png b/assets/images/Screen Shot FF 1.png new file mode 100644 index 00000000..e4be8989 Binary files /dev/null and b/assets/images/Screen Shot FF 1.png differ diff --git a/assets/images/Screen Shot FF 2.png b/assets/images/Screen Shot FF 2.png new file mode 100644 index 00000000..018789a3 Binary files /dev/null and b/assets/images/Screen Shot FF 2.png differ diff --git a/assets/images/Screen Shot FF 3.png b/assets/images/Screen Shot FF 3.png new file mode 100644 index 00000000..90d28bda Binary files /dev/null and b/assets/images/Screen Shot FF 3.png differ diff --git a/assets/images/Screen Shot FF 4.png b/assets/images/Screen Shot FF 4.png new file mode 100644 index 00000000..f83e8f29 Binary files /dev/null and b/assets/images/Screen Shot FF 4.png differ diff --git a/assets/images/Screen Shot FF 5.png b/assets/images/Screen Shot FF 5.png new file mode 100644 index 00000000..fc821639 Binary files /dev/null and b/assets/images/Screen Shot FF 5.png differ diff --git a/assets/images/amo-badge.png b/assets/images/amo-badge.png new file mode 100644 index 00000000..9cb49bba Binary files /dev/null and b/assets/images/amo-badge.png differ diff --git a/assets/images/buy-me-a-coffee.png b/assets/images/buy-me-a-coffee.png new file mode 100644 index 00000000..1bb2ad61 Binary files /dev/null and b/assets/images/buy-me-a-coffee.png differ diff --git a/assets/images/chevron-down.svg b/assets/images/chevron-down.svg new file mode 100644 index 00000000..7679f267 --- /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 00000000..4e48b8a6 Binary files /dev/null and b/assets/images/chrome-badge.png differ diff --git a/assets/images/icon128.png b/assets/images/icon128.png new file mode 100644 index 00000000..ccd689cc Binary files /dev/null and b/assets/images/icon128.png differ diff --git a/assets/images/icon16.png b/assets/images/icon16.png new file mode 100644 index 00000000..1c510cb7 Binary files /dev/null and b/assets/images/icon16.png differ diff --git a/assets/images/icon32.png b/assets/images/icon32.png new file mode 100644 index 00000000..d001aab6 Binary files /dev/null and b/assets/images/icon32.png differ diff --git a/assets/images/icon48.png b/assets/images/icon48.png new file mode 100644 index 00000000..4ddd22eb Binary files /dev/null and b/assets/images/icon48.png differ diff --git a/assets/images/logo-small.png b/assets/images/logo-small.png new file mode 100644 index 00000000..09e50d18 Binary files /dev/null and b/assets/images/logo-small.png differ diff --git a/assets/images/logo.png b/assets/images/logo.png new file mode 100644 index 00000000..ecb3e381 Binary files /dev/null and b/assets/images/logo.png differ diff --git a/assets/images/small-tile.png b/assets/images/small-tile.png new file mode 100644 index 00000000..a3ed077b Binary files /dev/null and b/assets/images/small-tile.png differ diff --git a/assets/javascript/localise.js b/assets/javascript/localise.js new file mode 100644 index 00000000..e408025d --- /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/javascript/persist-invidious-prefs.js b/assets/javascript/persist-invidious-prefs.js new file mode 100644 index 00000000..4c13a310 --- /dev/null +++ b/assets/javascript/persist-invidious-prefs.js @@ -0,0 +1,30 @@ +'use strict'; + +window.browser = window.browser || window.chrome; + +function getCookie() { + let ca = document.cookie.split(';'); + for (let i = 0; i < ca.length; i++) { + let c = ca[i]; + while (c.charAt(0) == ' ') c = c.substring(1, c.length); + if (c.indexOf('PREFS=') == 0) { + return JSON.parse( + decodeURIComponent(c.substring('PREFS='.length, c.length)) + ) + }; + } + return {}; +} + +browser.storage.sync.get( + ['alwaysProxy', 'videoQuality', 'invidiousDarkMode', 'persistInvidiousPrefs'], + (result) => { + if (result.persistInvidiousPrefs) { + const prefs = getCookie(); + prefs.local = result.alwaysProxy; + prefs.quality = result.videoQuality; + prefs.dark_mode = result.invidiousDarkMode; + document.cookie = `PREFS=${encodeURIComponent(JSON.stringify(prefs))}`; + } + } +); \ No newline at end of file diff --git a/assets/javascript/remove-twitter-sw.js b/assets/javascript/remove-twitter-sw.js new file mode 100644 index 00000000..d9d3ce3e --- /dev/null +++ b/assets/javascript/remove-twitter-sw.js @@ -0,0 +1,71 @@ +'use strict'; + +const nitterDefault = 'https://nitter.net'; + +let disableNitter; +let nitterInstance; +let redirectBypassFlag; +let exceptions; + +window.browser = window.browser || window.chrome; + +function isNotException(url) { + return !exceptions.some(regex => (regex.test(url.href))); +} + +function shouldRedirect(url) { + return !redirectBypassFlag && + isNotException(url) && + !disableNitter && + url.host !== nitterInstance && + !url.pathname.includes('/home'); +} + +function redirectTwitter(url) { + if (url.host.split('.')[0] === 'pbs') { + return `${nitterInstance}/pic/${encodeURIComponent(url.href)}`; + } else if (url.host.split('.')[0] === 'video') { + return `${nitterInstance}/gif/${encodeURIComponent(url.href)}`; + } else { + return `${nitterInstance}${url.pathname}${url.search}`; + }; +} + +browser.storage.sync.get( + [ + 'nitterInstance', + 'disableNitter', + 'removeTwitterSW', + 'redirectBypassFlag', + 'exceptions' + ], + (result) => { + redirectBypassFlag = result.redirectBypassFlag; + browser.storage.sync.set({ + redirectBypassFlag: false + }); + if (!result.removeTwitterSW) { + disableNitter = result.disableNitter; + nitterInstance = result.nitterInstance || nitterDefault; + exceptions = result.exceptions ? result.exceptions.map(e => { + return new RegExp(e); + }) : []; + navigator.serviceWorker.getRegistrations().then(registrations => { + for (let registration of registrations) { + if (registration.scope === 'https://twitter.com/') { + registration.unregister(); + console.log('Unregistered Twitter SW', registration); + } + } + }); + const url = new URL(window.location); + if (shouldRedirect()) { + const redirect = redirectTwitter(url); + console.info( + 'Redirecting', `"${url.href}"`, '=>', `"${redirect}"` + ); + window.location = redirect; + } + } + } +); diff --git a/assets/persist-invidious-prefs.js b/assets/persist-invidious-prefs.js deleted file mode 100644 index 4c13a310..00000000 --- a/assets/persist-invidious-prefs.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict'; - -window.browser = window.browser || window.chrome; - -function getCookie() { - let ca = document.cookie.split(';'); - for (let i = 0; i < ca.length; i++) { - let c = ca[i]; - while (c.charAt(0) == ' ') c = c.substring(1, c.length); - if (c.indexOf('PREFS=') == 0) { - return JSON.parse( - decodeURIComponent(c.substring('PREFS='.length, c.length)) - ) - }; - } - return {}; -} - -browser.storage.sync.get( - ['alwaysProxy', 'videoQuality', 'invidiousDarkMode', 'persistInvidiousPrefs'], - (result) => { - if (result.persistInvidiousPrefs) { - const prefs = getCookie(); - prefs.local = result.alwaysProxy; - prefs.quality = result.videoQuality; - prefs.dark_mode = result.invidiousDarkMode; - document.cookie = `PREFS=${encodeURIComponent(JSON.stringify(prefs))}`; - } - } -); \ No newline at end of file diff --git a/assets/remove-twitter-sw.js b/assets/remove-twitter-sw.js deleted file mode 100644 index d1b30637..00000000 --- a/assets/remove-twitter-sw.js +++ /dev/null @@ -1,65 +0,0 @@ -'use strict'; - -const nitterDefault = 'https://nitter.net'; - -let disableNitter; -let nitterInstance; -let redirectBypassFlag; -let whitelist; - -window.browser = window.browser || window.chrome; - -function isNotWhitelisted(url) { - return !whitelist.some(regex => (regex.test(url.href))); -} - -function shouldRedirect(url) { - return !redirectBypassFlag && - isNotWhitelisted(url) && - !disableNitter && - url.host !== nitterInstance && - !url.pathname.includes('/home'); -} - -function redirectTwitter(url) { - if (url.host.split('.')[0] === 'pbs') { - return `${nitterInstance}/pic/${encodeURIComponent(url.href)}`; - } else if (url.host.split('.')[0] === 'video') { - return `${nitterInstance}/gif/${encodeURIComponent(url.href)}`; - } else { - return `${nitterInstance}${url.pathname}${url.search}`; - }; -} - -browser.storage.sync.get( - ['nitterInstance', 'disableNitter', 'removeTwitterSW', 'redirectBypassFlag'], - (result) => { - redirectBypassFlag = result.redirectBypassFlag; - browser.storage.sync.set({ - redirectBypassFlag: false - }); - if (!result.removeTwitterSW) { - disableNitter = result.disableNitter; - nitterInstance = result.nitterInstance || nitterDefault; - whitelist = result.whitelist ? result.whitelist.map(e => { - return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')); - }) : []; - navigator.serviceWorker.getRegistrations().then(registrations => { - for (let registration of registrations) { - if (registration.scope === 'https://twitter.com/') { - registration.unregister(); - console.log('Unregistered Twitter SW', registration); - } - } - }); - const url = new URL(window.location); - if (shouldRedirect()) { - const redirect = redirectTwitter(url); - console.info( - 'Redirecting', `"${url.href}"`, '=>', `"${redirect}"` - ); - window.location = redirect; - } - } - } -); diff --git a/background.js b/background.js index 5810f42a..021ccbb0 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/images/Screen Shot Chrome 1.png b/images/Screen Shot Chrome 1.png deleted file mode 100644 index 65e18e2a..00000000 Binary files a/images/Screen Shot Chrome 1.png and /dev/null differ diff --git a/images/Screen Shot Chrome 2.png b/images/Screen Shot Chrome 2.png deleted file mode 100644 index 7bb98a4a..00000000 Binary files a/images/Screen Shot Chrome 2.png and /dev/null differ diff --git a/images/Screen Shot Chrome 3.png b/images/Screen Shot Chrome 3.png deleted file mode 100644 index 3a4fbd35..00000000 Binary files a/images/Screen Shot Chrome 3.png and /dev/null differ diff --git a/images/Screen Shot Chrome 4.png b/images/Screen Shot Chrome 4.png deleted file mode 100644 index 8954e923..00000000 Binary files a/images/Screen Shot Chrome 4.png and /dev/null differ diff --git a/images/Screen Shot Chrome 5.png b/images/Screen Shot Chrome 5.png deleted file mode 100644 index bf0ffa08..00000000 Binary files a/images/Screen Shot Chrome 5.png and /dev/null differ diff --git a/images/Screen Shot FF 1.png b/images/Screen Shot FF 1.png deleted file mode 100644 index e4be8989..00000000 Binary files a/images/Screen Shot FF 1.png and /dev/null differ diff --git a/images/Screen Shot FF 2.png b/images/Screen Shot FF 2.png deleted file mode 100644 index 018789a3..00000000 Binary files a/images/Screen Shot FF 2.png and /dev/null differ diff --git a/images/Screen Shot FF 3.png b/images/Screen Shot FF 3.png deleted file mode 100644 index 90d28bda..00000000 Binary files a/images/Screen Shot FF 3.png and /dev/null differ diff --git a/images/Screen Shot FF 4.png b/images/Screen Shot FF 4.png deleted file mode 100644 index f83e8f29..00000000 Binary files a/images/Screen Shot FF 4.png and /dev/null differ diff --git a/images/Screen Shot FF 5.png b/images/Screen Shot FF 5.png deleted file mode 100644 index fc821639..00000000 Binary files a/images/Screen Shot FF 5.png and /dev/null differ diff --git a/images/buy-me-a-coffee.png b/images/buy-me-a-coffee.png deleted file mode 100644 index 1bb2ad61..00000000 Binary files a/images/buy-me-a-coffee.png and /dev/null differ diff --git a/images/icon128.png b/images/icon128.png deleted file mode 100644 index ccd689cc..00000000 Binary files a/images/icon128.png and /dev/null differ diff --git a/images/icon16.png b/images/icon16.png deleted file mode 100644 index 1c510cb7..00000000 Binary files a/images/icon16.png and /dev/null differ diff --git a/images/icon32.png b/images/icon32.png deleted file mode 100644 index d001aab6..00000000 Binary files a/images/icon32.png and /dev/null differ diff --git a/images/icon48.png b/images/icon48.png deleted file mode 100644 index 4ddd22eb..00000000 Binary files a/images/icon48.png and /dev/null differ diff --git a/images/logo.png b/images/logo.png deleted file mode 100644 index ecb3e381..00000000 Binary files a/images/logo.png and /dev/null differ diff --git a/images/small-tile.png b/images/small-tile.png deleted file mode 100644 index a3ed077b..00000000 Binary files a/images/small-tile.png and /dev/null differ diff --git a/manifest.json b/manifest.json index b34cfc77..5329a289 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 317f8145..ca6429f1 100644 --- a/pages/options/options.html +++ b/pages/options/options.html @@ -12,124 +12,136 @@
- - - + + +
-
-
-

Nitter Redirects

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

Nitter Redirects

+
+   + +
- -
-
-

Invidious Redirects

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

Invidious Redirects

+
+   + +
- -
-
-

Bibliogram Redirects

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

Bibliogram Redirects

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

OpenStreetMap Redirects

+
+   + +
+
+
+

Nitter Instance

+
+
- -
-
-

OpenStreetMap Redirects

-   - +
+

Invidious Instance

+
+
- -
-

Nitter Instance

- - - -

Invidious Instance

- - - -

Bibliogram Instance

- - - -

OpenStreetMap 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 5e25a495..19f9bba7 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')); + li.appendChild(button); + document.getElementById('exceptions-items').prepend(li); + const svg = + ` + + + `; + button.innerHTML = svg; button.addEventListener('click', () => { - li.remove(); - whitelist.splice(index, 1); + exceptions.splice(index, 1); browser.storage.sync.set({ - whitelist: whitelist + exceptions: exceptions }); + li.remove(); }); - li.appendChild(button); - document.getElementById('whitelist-items').prepend(li); } 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 45a88052..1ce7eb01 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 66842c75..2e8ec491 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 d9a7e5df..dd88a65c 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 96c7c87c..bfaa024d 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' ], }; -- cgit 1.4.1 From 0f50b816be5ba45d63f536c636dc16056755d2f9 Mon Sep 17 00:00:00 2001 From: SimonBrazell Date: Mon, 13 Jul 2020 21:47:40 +1000 Subject: Fix autoplay param & French pop-up title --- _locales/fr/messages.json | 4 ++-- background.js | 4 +--- manifest.json | 2 +- pages/options/options.html | 2 +- 4 files changed, 5 insertions(+), 7 deletions(-) (limited to 'background.js') diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index fe2eaaf6..ef172d18 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -88,11 +88,11 @@ "description": "Boutton des options supplémentaires (pop-up)." }, "privacy": { - "message": "Vie privée", + "message": "Privacy", "description": "Titre du module complémentaire - Vie privée (pop-up)." }, "redirect": { - "message": "Redirection", + "message": "Redirect", "description": "Titre du module complémentaire - Redirection (pop-up)." } } \ No newline at end of file diff --git a/background.js b/background.js index 021ccbb0..95561752 100644 --- a/background.js +++ b/background.js @@ -264,9 +264,7 @@ function redirectYouTube(url, initiator, type) { if (invidiousSubtitles) { url.searchParams.append('subtitles', invidiousSubtitles); } - if (invidiousAutoplay) { - url.searchParams.append('autoplay', invidiousAutoplay); - } + url.searchParams.append('autoplay', invidiousAutoplay ? 1 : 0); return `${invidiousInstance}${url.pathname}${url.search}`; } diff --git a/manifest.json b/manifest.json index 5329a289..41f04696 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_extensionName__", "description": "__MSG_extensionDescription__", - "version": "1.1.35", + "version": "1.1.36", "manifest_version": 2, "background": { "scripts": [ diff --git a/pages/options/options.html b/pages/options/options.html index ca6429f1..e254765d 100644 --- a/pages/options/options.html +++ b/pages/options/options.html @@ -172,7 +172,7 @@

      Invidious Player Style

      -- cgit 1.4.1 From 564e25db3d5eb112458fcadc45200ea754fd01af Mon Sep 17 00:00:00 2001 From: SimonBrazell Date: Thu, 27 Aug 2020 15:22:46 +1000 Subject: Randomise Invidious instance if empty or https://invidio.us --- background.js | 415 ++++++++++++++++++++++++++------------------- manifest.json | 10 +- pages/options/options.html | 2 +- pages/options/options.js | 4 +- 4 files changed, 246 insertions(+), 185 deletions(-) (limited to 'background.js') diff --git a/background.js b/background.js index 95561752..092f8d9d 100644 --- a/background.js +++ b/background.js @@ -1,26 +1,36 @@ -'use strict'; +"use strict"; -const invidiousDefault = 'https://invidio.us'; +const invidiousDefault = "https://invidious.snopyta.org"; const youtubeDomains = [ - 'm.youtube.com', - 'youtube.com', - 'img.youtube.com', - 'www.youtube.com', - 'youtube-nocookie.com', - 'www.youtube-nocookie.com', - 'youtu.be', - 's.ytimg.com', - 'music.youtube.com' + "m.youtube.com", + "youtube.com", + "img.youtube.com", + "www.youtube.com", + "youtube-nocookie.com", + "www.youtube-nocookie.com", + "youtu.be", + "s.ytimg.com", + "music.youtube.com", ]; -const nitterDefault = 'https://nitter.net'; +const invidiousInstances = [ + "https://invidious.snopyta.org", + "https://yewtu.be", + "https://invidious.13ad.de", + "https://invidious.xyz", + "https://invidious.site", + "https://invidiou.site", + "https://invidious.fdn.fr", + "https://invidious.toot.koeln", +]; +const nitterDefault = "https://nitter.net"; const twitterDomains = [ - 'twitter.com', - 'www.twitter.com', - 'mobile.twitter.com', - 'pbs.twimg.com', - 'video.twimg.com', + "twitter.com", + "www.twitter.com", + "mobile.twitter.com", + "pbs.twimg.com", + "video.twimg.com", ]; -const bibliogramDefault = 'https://bibliogram.art'; +const bibliogramDefault = "https://bibliogram.art"; const instagramDomains = [ "instagram.com", "www.instagram.com", @@ -28,50 +38,50 @@ const instagramDomains = [ "about.instagram.com", ]; const instagramReservedPaths = [ - 'about', - 'explore', - 'support', - 'press', - 'api', - 'privacy', - 'safety', - 'admin', - 'graphql', - 'accounts', - 'help', - 'terms', - 'contact', - 'blog', - 'igtv', - 'u', - 'p', - 'fragment', - 'imageproxy', - 'videoproxy', - '.well-known' + "about", + "explore", + "support", + "press", + "api", + "privacy", + "safety", + "admin", + "graphql", + "accounts", + "help", + "terms", + "contact", + "blog", + "igtv", + "u", + "p", + "fragment", + "imageproxy", + "videoproxy", + ".well-known", ]; const bibliogramBypassPaths = /\/(accounts\/|embeds?.js)/; const bibliogramInstances = [ - 'https://bibliogram.art', - 'https://bibliogram.snopyta.org' + "https://bibliogram.art", + "https://bibliogram.snopyta.org", ]; -const osmDefault = 'https://openstreetmap.org'; +const osmDefault = "https://openstreetmap.org"; const googleMapsRegex = /https?:\/\/(((www|maps)\.)?(google\.).*(\/maps)|maps\.(google\.).*)/; const mapCentreRegex = /@(-?\d[0-9.]*),(-?\d[0-9.]*),(\d{1,2})[.z]/; const dataLatLngRegex = /(!3d|!4d)(-?[0-9]{1,10}.[0-9]{1,10})/g; const placeRegex = /\/place\/(.*)\//; const travelModes = { - 'driving': 'fossgis_osrm_car', - 'walking': 'fossgis_osrm_foot', - 'bicycling': 'fossgis_osrm_bike', - 'transit': 'fossgis_osrm_car' // not implemented on OSM, default to car. + driving: "fossgis_osrm_car", + walking: "fossgis_osrm_foot", + bicycling: "fossgis_osrm_bike", + transit: "fossgis_osrm_car", // not implemented on OSM, default to car. }; const layers = { - 'none': 'S', - 'transit': 'T', - 'traffic': 'S', // not implemented on OSM, default to standard. - 'bicycling': 'C' -} + none: "S", + transit: "T", + traffic: "S", // not implemented on OSM, default to standard. + bicycling: "C", +}; let disableNitter; let disableInvidious; @@ -95,25 +105,25 @@ window.browser = window.browser || window.chrome; browser.storage.sync.get( [ - 'nitterInstance', - 'invidiousInstance', - 'bibliogramInstance', - 'osmInstance', - 'disableNitter', - 'disableInvidious', - 'disableBibliogram', - 'disableOsm', - 'alwaysProxy', - 'onlyEmbeddedVideo', - 'videoQuality', - 'invidiousDarkMode', - 'invidiousVolume', - 'invidiousPlayerStyle', - 'invidiousSubtitles', - 'invidiousAutoplay', - 'exceptions' + "nitterInstance", + "invidiousInstance", + "bibliogramInstance", + "osmInstance", + "disableNitter", + "disableInvidious", + "disableBibliogram", + "disableOsm", + "alwaysProxy", + "onlyEmbeddedVideo", + "videoQuality", + "invidiousDarkMode", + "invidiousVolume", + "invidiousPlayerStyle", + "invidiousSubtitles", + "invidiousAutoplay", + "exceptions", ], - result => { + (result) => { disableNitter = result.disableNitter; disableInvidious = result.disableInvidious; disableBibliogram = result.disableBibliogram; @@ -126,67 +136,70 @@ browser.storage.sync.get( onlyEmbeddedVideo = result.onlyEmbeddedVideo; videoQuality = result.videoQuality; invidiousDarkMode = result.invidiousDarkMode; - exceptions = result.exceptions ? result.exceptions.map(e => { - return new RegExp(e); - }) : []; + exceptions = result.exceptions + ? result.exceptions.map((e) => { + return new RegExp(e); + }) + : []; invidiousVolume = result.invidiousVolume; invidiousPlayerStyle = result.invidiousPlayerStyle; - invidiousSubtitles = result.invidiousSubtitles || ''; + invidiousSubtitles = result.invidiousSubtitles || ""; invidiousAutoplay = !result.invidiousAutoplay; } ); -browser.storage.onChanged.addListener(changes => { - if ('nitterInstance' in changes) { +browser.storage.onChanged.addListener((changes) => { + if ("nitterInstance" in changes) { nitterInstance = changes.nitterInstance.newValue || nitterDefault; } - if ('invidiousInstance' in changes) { + if ("invidiousInstance" in changes) { invidiousInstance = changes.invidiousInstance.newValue || invidiousDefault; } - if ('bibliogramInstance' in changes) { - bibliogramInstance = changes.bibliogramInstance.newValue || bibliogramDefault; + if ("bibliogramInstance" in changes) { + bibliogramInstance = + changes.bibliogramInstance.newValue || bibliogramDefault; } - if ('osmInstance' in changes) { + if ("osmInstance" in changes) { osmInstance = changes.osmInstance.newValue || osmDefault; } - if ('disableNitter' in changes) { + if ("disableNitter" in changes) { disableNitter = changes.disableNitter.newValue; } - if ('disableInvidious' in changes) { + if ("disableInvidious" in changes) { disableInvidious = changes.disableInvidious.newValue; } - if ('disableBibliogram' in changes) { + if ("disableBibliogram" in changes) { disableBibliogram = changes.disableBibliogram.newValue; } - if ('disableOsm' in changes) { + if ("disableOsm" in changes) { disableOsm = changes.disableOsm.newValue; } - if ('alwaysProxy' in changes) { + if ("alwaysProxy" in changes) { alwaysProxy = changes.alwaysProxy.newValue; } - if ('onlyEmbeddedVideo' in changes) { + if ("onlyEmbeddedVideo" in changes) { onlyEmbeddedVideo = changes.onlyEmbeddedVideo.newValue; } - if ('videoQuality' in changes) { + if ("videoQuality" in changes) { videoQuality = changes.videoQuality.newValue; } - if ('invidiousDarkMode' in changes) { + if ("invidiousDarkMode" in changes) { invidiousDarkMode = changes.invidiousDarkMode.newValue; } - if ('invidiousVolume' in changes) { + if ("invidiousVolume" in changes) { invidiousVolume = changes.invidiousVolume.newValue; } - if ('invidiousPlayerStyle' in changes) { + if ("invidiousPlayerStyle" in changes) { invidiousPlayerStyle = changes.invidiousPlayerStyle.newValue; } - if ('invidiousSubtitles' in changes) { + if ("invidiousSubtitles" in changes) { invidiousSubtitles = changes.invidiousSubtitles.newValue; } - if ('invidiousAutoplay' in changes) { + if ("invidiousAutoplay" in changes) { invidiousAutoplay = changes.invidiousAutoplay.newValue; } - if ('exceptions' in changes) { - exceptions = changes.exceptions.newValue.map(e => { + if ("exceptions" in changes) { + exceptions = changes.exceptions.newValue.map((e) => { return new RegExp(e); }); } @@ -204,14 +217,13 @@ function addressToLatLng(address, callback) { `${json.boundingbox[2]},${json.boundingbox[1]},${json.boundingbox[3]},${json.boundingbox[0]}` ); } - } - else { + } else { console.info("Error: Status is " + xmlhttp.status); } } }; xmlhttp.open( - 'GET', + "GET", `https://nominatim.openstreetmap.org/search/${address}?format=json&limit=1`, false ); @@ -219,52 +231,58 @@ function addressToLatLng(address, callback) { } function isException(url, initiator) { - return exceptions.some(regex => (regex.test(url.href))) || - (initiator && exceptions.some(regex => (regex.test(initiator.href)))); + return ( + exceptions.some((regex) => regex.test(url.href)) || + (initiator && exceptions.some((regex) => regex.test(initiator.href))) + ); } function isFirefox() { - return typeof InstallTrigger !== 'undefined'; + return typeof InstallTrigger !== "undefined"; } function redirectYouTube(url, initiator, type) { if (disableInvidious || isException(url, initiator)) { return null; } - if (initiator && (initiator.origin === invidiousInstance || youtubeDomains.includes(initiator.host))) { + if ( + initiator && + (initiator.origin === invidiousInstance || + youtubeDomains.includes(initiator.host)) + ) { return null; } if (url.pathname.match(/iframe_api/) || url.pathname.match(/www-widgetapi/)) { // Don't redirect YouTube Player API. return null; } - if (url.host.split('.')[0] === 'studio') { + if (url.host.split(".")[0] === "studio") { // Avoid redirecting `studio.youtube.com` return null; } - if (onlyEmbeddedVideo && type !== 'sub_frame') { + if (onlyEmbeddedVideo && type !== "sub_frame") { return null; } // Apply settings if (alwaysProxy) { - url.searchParams.append('local', true); + url.searchParams.append("local", true); } if (videoQuality) { - url.searchParams.append('quality', videoQuality); + url.searchParams.append("quality", videoQuality); } if (invidiousDarkMode) { - url.searchParams.append('dark_mode', invidiousDarkMode); + url.searchParams.append("dark_mode", invidiousDarkMode); } if (invidiousVolume) { - url.searchParams.append('volume', invidiousVolume); + url.searchParams.append("volume", invidiousVolume); } if (invidiousPlayerStyle) { - url.searchParams.append('player_style', invidiousPlayerStyle); + url.searchParams.append("player_style", invidiousPlayerStyle); } if (invidiousSubtitles) { - url.searchParams.append('subtitles', invidiousSubtitles); + url.searchParams.append("subtitles", invidiousSubtitles); } - url.searchParams.append('autoplay', invidiousAutoplay ? 1 : 0); + url.searchParams.append("autoplay", invidiousAutoplay ? 1 : 0); return `${invidiousInstance}${url.pathname}${url.search}`; } @@ -273,21 +291,28 @@ function redirectTwitter(url, initiator) { if (disableNitter || isException(url, initiator)) { return null; } - if (url.pathname.includes('/home')) { + if (url.pathname.includes("/home")) { return null; } - if (isFirefox() && initiator && (initiator.origin === nitterInstance || twitterDomains.includes(initiator.host))) { + if ( + isFirefox() && + initiator && + (initiator.origin === nitterInstance || + twitterDomains.includes(initiator.host)) + ) { browser.storage.sync.set({ - redirectBypassFlag: true + redirectBypassFlag: true, }); return null; } - if (url.host.split('.')[0] === 'pbs') { + if (url.host.split(".")[0] === "pbs") { return `${nitterInstance}/pic/${encodeURIComponent(url.href)}`; - } else if (url.host.split('.')[0] === 'video') { + } else if (url.host.split(".")[0] === "video") { return `${nitterInstance}/gif/${encodeURIComponent(url.href)}`; - } else if (url.pathname.includes('tweets')) { - return `${nitterInstance}${url.pathname.replace('/tweets', '')}${url.search}`; + } else if (url.pathname.includes("tweets")) { + return `${nitterInstance}${url.pathname.replace("/tweets", "")}${ + url.search + }`; } else { return `${nitterInstance}${url.pathname}${url.search}`; } @@ -298,14 +323,21 @@ function redirectInstagram(url, initiator, type) { return null; } // Do not redirect Bibliogram view on Instagram links - if (initiator && (initiator.origin === bibliogramInstance || instagramDomains.includes(initiator.host))) { + if ( + initiator && + (initiator.origin === bibliogramInstance || + instagramDomains.includes(initiator.host)) + ) { return null; } // Do not redirect /accounts, /embeds.js, or anything other than main_frame - if (type !== 'main_frame' || url.pathname.match(bibliogramBypassPaths)) { + if (type !== "main_frame" || url.pathname.match(bibliogramBypassPaths)) { return null; } - if (url.pathname === '/' || instagramReservedPaths.includes(url.pathname.split('/')[1])) { + if ( + url.pathname === "/" || + instagramReservedPaths.includes(url.pathname.split("/")[1]) + ) { return `${bibliogramInstance}${url.pathname}${url.search}`; } else { // Likely a user profile, redirect to '/u/...' @@ -318,31 +350,33 @@ function redirectGoogleMaps(url, initiator) { return null; } let redirect; - let mapCentre = ''; - let params = ''; + let mapCentre = ""; + let params = ""; // Set map centre if present if (url.pathname.match(mapCentreRegex)) { const [, lat, lon, zoom] = url.pathname.match(mapCentreRegex); mapCentre = `#map=${zoom}/${lat}/${lon}`; - } else if (url.search.includes('center=')) { - const [lat, lon] = url.searchParams.get('center').split(','); - mapCentre = `#map=${url.searchParams.get('zoom') || '17'}/${lat}/${lon}`; + } else if (url.search.includes("center=")) { + const [lat, lon] = url.searchParams.get("center").split(","); + mapCentre = `#map=${url.searchParams.get("zoom") || "17"}/${lat}/${lon}`; // Set default zoom if mapCentre not present } else { - params = '&zoom=17'; + params = "&zoom=17"; } // Set map layer - params = `${params}&layers=${layers[url.searchParams.get('layer')] || layers['none']}`; + params = `${params}&layers=${ + layers[url.searchParams.get("layer")] || layers["none"] + }`; // Handle Google Maps Embed API - if (url.pathname.includes('/embed')) { - let query = ''; - if (url.searchParams.has('q')) { - query = url.searchParams.get('q'); - } else if (url.searchParams.has('query')) { - query = url.searchParams.has('query'); - } else if (url.searchParams.has('pb')) { + if (url.pathname.includes("/embed")) { + let query = ""; + if (url.searchParams.has("q")) { + query = url.searchParams.get("q"); + } else if (url.searchParams.has("query")) { + query = url.searchParams.has("query"); + } else if (url.searchParams.has("pb")) { try { - query = url.searchParams.get('pb').split(/!2s(.*?)!/)[1]; + query = url.searchParams.get("pb").split(/!2s(.*?)!/)[1]; } catch (error) { console.error(error); // Unable to find map marker in URL. @@ -355,47 +389,56 @@ function redirectGoogleMaps(url, initiator) { }); redirect = `${osmInstance}/export/embed.html?bbox=${bbox}&layer=mapnik&marker=${marker}`; // Handle Google Maps Directions - } else if (url.pathname.includes('/dir')) { - const travelMode = travelModes[url.searchParams.get('travelmode')] || travelModes['driving']; + } else if (url.pathname.includes("/dir")) { + const travelMode = + travelModes[url.searchParams.get("travelmode")] || travelModes["driving"]; let origin; - addressToLatLng(url.searchParams.get('origin'), coords => { + addressToLatLng(url.searchParams.get("origin"), (coords) => { origin = coords; }); let destination; - addressToLatLng(url.searchParams.get('destination'), coords => { + addressToLatLng(url.searchParams.get("destination"), (coords) => { destination = coords; }); redirect = `${osmInstance}/directions?engine=${travelMode}&route=${origin}%3B${destination}${mapCentre}${params}`; // Get marker from data attribute - } else if (url.pathname.includes('data=') && url.pathname.match(dataLatLngRegex)) { + } else if ( + url.pathname.includes("data=") && + url.pathname.match(dataLatLngRegex) + ) { const [mlat, mlon] = url.pathname.match(dataLatLngRegex); - redirect = `${osmInstance}/?mlat=${mlat.replace('!3d', '')}&mlon=${mlon.replace('!4d', '')}${mapCentre}${params}`; + redirect = `${osmInstance}/?mlat=${mlat.replace( + "!3d", + "" + )}&mlon=${mlon.replace("!4d", "")}${mapCentre}${params}`; // Get marker from ll param - } else if (url.searchParams.has('ll')) { - const [mlat, mlon] = url.searchParams.get('ll').split(','); + } else if (url.searchParams.has("ll")) { + const [mlat, mlon] = url.searchParams.get("ll").split(","); redirect = `${osmInstance}/?mlat=${mlat}&mlon=${mlon}${mapCentre}${params}`; // Get marker from viewpoint param. - } else if (url.searchParams.has('viewpoint')) { - const [mlat, mlon] = url.searchParams.get('viewpoint').split(','); + } else if (url.searchParams.has("viewpoint")) { + const [mlat, mlon] = url.searchParams.get("viewpoint").split(","); redirect = `${osmInstance}/?mlat=${mlat}&mlon=${mlon}${mapCentre}${params}`; // Use query as search if present. } else { let query; - if (url.searchParams.has('q')) { - query = url.searchParams.get('q'); - } else if (url.searchParams.has('query')) { - query = url.searchParams.get('query'); + if (url.searchParams.has("q")) { + query = url.searchParams.get("q"); + } else if (url.searchParams.has("query")) { + query = url.searchParams.get("query"); } else if (url.pathname.match(placeRegex)) { query = url.pathname.match(placeRegex)[1]; } - redirect = `${osmInstance}/${query ? 'search?query=' + query : ''}${mapCentre || '#'}${params}`; + redirect = `${osmInstance}/${query ? "search?query=" + query : ""}${ + mapCentre || "#" + }${params}`; } return redirect; } browser.webRequest.onBeforeRequest.addListener( - details => { + (details) => { const url = new URL(details.url); let initiator; if (details.originUrl) { @@ -406,55 +449,69 @@ browser.webRequest.onBeforeRequest.addListener( let redirect; if (youtubeDomains.includes(url.host)) { redirect = { - redirectUrl: redirectYouTube(url, initiator, details.type) + redirectUrl: redirectYouTube(url, initiator, details.type), }; } else if (twitterDomains.includes(url.host)) { redirect = { - redirectUrl: redirectTwitter(url, initiator) + redirectUrl: redirectTwitter(url, initiator), }; } else if (instagramDomains.includes(url.host)) { redirect = { - redirectUrl: redirectInstagram(url, initiator, details.type) + redirectUrl: redirectInstagram(url, initiator, details.type), }; } else if (url.href.match(googleMapsRegex)) { redirect = { - redirectUrl: redirectGoogleMaps(url, initiator) + redirectUrl: redirectGoogleMaps(url, initiator), }; } if (redirect && redirect.redirectUrl) { console.info( - 'Redirecting', `"${url.href}"`, '=>', `"${redirect.redirectUrl}"` + "Redirecting", + `"${url.href}"`, + "=>", + `"${redirect.redirectUrl}"` ); - console.info('Details', details); + console.info("Details", details); } return redirect; }, { - urls: [""] + urls: [""], }, - ['blocking'] + ["blocking"] ); -browser.runtime.onInstalled.addListener( - details => { - if (details.reason === 'install') { - 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 - }); - } +browser.runtime.onInstalled.addListener((details) => { + if (details.reason === "install") { + browser.storage.sync.set({ + bibliogramInstance: + bibliogramInstances[~~(bibliogramInstances.length * Math.random())], + invidiousInstance: + invidiousInstances[~~(invidiousInstances.length * Math.random())], + }); + } else if (details.reason === "update") { + browser.storage.sync.get( + ["whitelist", "exceptions", "invidiousInstance"], + (result) => { + if (result.whitelist) { + let whitelist = result.whitelist.map((e) => + e.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&") + ); + browser.storage.sync.set({ + exceptions: result.exceptions.concat(whitelist), + whitelist: null, + }); } - ); - } + if ( + result.invidiousInstance === "https://invidio.us" || + result.invidiousInstance === null + ) { + browser.storage.sync.set({ + invidiousInstance: + invidiousInstances[~~(invidiousInstances.length * Math.random())], + }); + } + } + ); } -); +}); diff --git a/manifest.json b/manifest.json index ba55111a..88be6e84 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_extensionName__", "description": "__MSG_extensionDescription__", - "version": "1.1.39", + "version": "1.1.40", "manifest_version": 2, "background": { "scripts": ["background.js"], @@ -39,9 +39,11 @@ }, { "matches": [ - "*://invidio.us/*", "*://invidious.snopyta.org/*", "*://yewtu.be/*", + "*://invidious.xyz/*", + "*://invidious.site/*", + "*://invidiou.site/*", "*://invidious.ggc-project.de/*", "*://invidious.13ad.de/*", "*://invidious.toot.koeln/*", @@ -54,8 +56,8 @@ "*://fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad.onion/*", "*://qklhadlycap4cnod.onion/*", "*://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion/*", - "*://mfqczy4mysscub2s.onion/*" - "*://4l2dgddgsrkf2ous66i6seeyi6etzfgrue332grh2n7madpwopotugyd.onion/*", + "*://mfqczy4mysscub2s.onion/*", + "*://4l2dgddgsrkf2ous66i6seeyi6etzfgrue332grh2n7madpwopotugyd.onion/*" ], "js": ["assets/javascript/persist-invidious-prefs.js"], "run_at": "document_start" diff --git a/pages/options/options.html b/pages/options/options.html index 0f38ff0a..8e074037 100644 --- a/pages/options/options.html +++ b/pages/options/options.html @@ -137,7 +137,7 @@
      diff --git a/pages/options/options.js b/pages/options/options.js index 43545385..d6fc731b 100644 --- a/pages/options/options.js +++ b/pages/options/options.js @@ -15,12 +15,14 @@ const nitterInstances = [ "http://nitter.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd.onion", ]; const invidiousInstances = [ - "https://invidio.us", "https://invidious.snopyta.org", "https://yewtu.be", "https://invidious.ggc-project.de", "https://invidious.13ad.de", + "https://invidious.xyz", "https://invidious.toot.koeln", + "https://invidious.site", + "https://invidiou.site", "https://invidious.fdn.fr", "https://watch.nettohikari.com", "https://yt.iswleuven.be", -- cgit 1.4.1 From 67dc5fcc3b3ae35fb2aa9abbde24b35df8bf75a3 Mon Sep 17 00:00:00 2001 From: SimonBrazell Date: Fri, 28 Aug 2020 09:17:36 +1000 Subject: Fixes #89 - autoplay reversed, improve instance selects (#90) --- background.js | 2 +- pages/options/options.js | 46 +++++++++++++++++++++++++--------------------- 2 files changed, 26 insertions(+), 22 deletions(-) (limited to 'background.js') diff --git a/background.js b/background.js index 092f8d9d..ffe1857e 100644 --- a/background.js +++ b/background.js @@ -144,7 +144,7 @@ browser.storage.sync.get( invidiousVolume = result.invidiousVolume; invidiousPlayerStyle = result.invidiousPlayerStyle; invidiousSubtitles = result.invidiousSubtitles || ""; - invidiousAutoplay = !result.invidiousAutoplay; + invidiousAutoplay = result.invidiousAutoplay; } ); diff --git a/pages/options/options.js b/pages/options/options.js index d6fc731b..89ef315f 100644 --- a/pages/options/options.js +++ b/pages/options/options.js @@ -142,7 +142,7 @@ browser.storage.sync.get( invidiousVolume.value = result.invidiousVolume; invidiousPlayerStyle.value = result.invidiousPlayerStyle || ""; invidiousSubtitles.value = result.invidiousSubtitles || ""; - invidiousAutoplay.checked = !result.invidiousAutoplay; + invidiousAutoplay.checked = result.invidiousAutoplay; } ); @@ -338,7 +338,7 @@ let invidiousSubtitlesChange = debounce(() => { invidiousSubtitles.addEventListener("input", invidiousSubtitlesChange); invidiousAutoplay.addEventListener("change", (event) => { - browser.storage.sync.set({ invidiousAutoplay: !event.target.checked }); + browser.storage.sync.set({ invidiousAutoplay: event.target.checked }); }); theme.addEventListener("change", (event) => { @@ -364,7 +364,7 @@ theme.addEventListener("change", (event) => { function autocomplete(input, list) { let currentFocus; input.addEventListener("focus", (e) => { - showOptions(e); + showOptions(e, true); }); input.addEventListener("input", (e) => { const val = e.target.value; @@ -390,31 +390,35 @@ function autocomplete(input, list) { } } }); - function showOptions(e) { - let a, - b, + function showOptions(event, showAll = false) { + let div, i, - val = e.target.value; + val = event.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); + div = document.createElement("div"); + div.setAttribute("id", event.target.id + "autocomplete-list"); + div.setAttribute("class", "autocomplete-items"); + event.target.parentNode.appendChild(div); 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); + div.appendChild(getItem(list[i], val)); + } else if (showAll) { + div.appendChild(getItem(list[i], val)); } } } + function getItem(item, val) { + let div = document.createElement("div"); + div.innerHTML = "" + item.substr(0, val.length) + ""; + div.innerHTML += item.substr(val.length); + div.innerHTML += ""; + div.addEventListener("click", function (e) { + input.value = e.target.getElementsByTagName("input")[0].value; + input.dispatchEvent(new Event("input")); + closeAllLists(); + }); + return div; + } function addActive(x) { if (!x) return false; removeActive(x); -- cgit 1.4.1 From ae6f4f6a6cd9fbd5fe583f52782e94641c752706 Mon Sep 17 00:00:00 2001 From: SimonBrazell Date: Tue, 1 Sep 2020 17:26:23 +1000 Subject: Randomise instances when empty (#48) --- assets/javascript/remove-twitter-sw.js | 68 ++++++++++++++++--------- background.js | 91 ++++++++++++++++++++++------------ manifest.json | 2 +- pages/options/options.html | 17 ++++--- pages/options/options.js | 14 ++++-- pages/styles.css | 4 ++ 6 files changed, 125 insertions(+), 71 deletions(-) (limited to 'background.js') diff --git a/assets/javascript/remove-twitter-sw.js b/assets/javascript/remove-twitter-sw.js index d9d3ce3e..222a7283 100644 --- a/assets/javascript/remove-twitter-sw.js +++ b/assets/javascript/remove-twitter-sw.js @@ -1,6 +1,20 @@ -'use strict'; +"use strict"; -const nitterDefault = 'https://nitter.net'; +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", + "https://nitter.tedomum.net", + "https://nitter.cattube.org", + "https://nitter.fdn.fr", + "https://nitter.1d4.us", + "https://nitter.kavin.rocks", +]; let disableNitter; let nitterInstance; @@ -9,61 +23,67 @@ let exceptions; window.browser = window.browser || window.chrome; +function getRandomInstance() { + return nitterInstances[~~(nitterInstances.length * Math.random())]; +} + function isNotException(url) { - return !exceptions.some(regex => (regex.test(url.href))); + return !exceptions.some((regex) => regex.test(url.href)); } function shouldRedirect(url) { - return !redirectBypassFlag && + return ( + !redirectBypassFlag && isNotException(url) && !disableNitter && url.host !== nitterInstance && - !url.pathname.includes('/home'); + !url.pathname.includes("/home") + ); } function redirectTwitter(url) { - if (url.host.split('.')[0] === 'pbs') { + if (url.host.split(".")[0] === "pbs") { return `${nitterInstance}/pic/${encodeURIComponent(url.href)}`; - } else if (url.host.split('.')[0] === 'video') { + } else if (url.host.split(".")[0] === "video") { return `${nitterInstance}/gif/${encodeURIComponent(url.href)}`; } else { return `${nitterInstance}${url.pathname}${url.search}`; - }; + } } browser.storage.sync.get( [ - 'nitterInstance', - 'disableNitter', - 'removeTwitterSW', - 'redirectBypassFlag', - 'exceptions' + "nitterInstance", + "disableNitter", + "removeTwitterSW", + "redirectBypassFlag", + "exceptions", ], (result) => { redirectBypassFlag = result.redirectBypassFlag; browser.storage.sync.set({ - redirectBypassFlag: false + redirectBypassFlag: false, }); if (!result.removeTwitterSW) { disableNitter = result.disableNitter; - nitterInstance = result.nitterInstance || nitterDefault; - exceptions = result.exceptions ? result.exceptions.map(e => { - return new RegExp(e); - }) : []; - navigator.serviceWorker.getRegistrations().then(registrations => { + nitterInstance = result.nitterInstance || getRandomInstance(); + exceptions = result.exceptions + ? result.exceptions.map((e) => { + return new RegExp(e); + }) + : []; + navigator.serviceWorker.getRegistrations().then((registrations) => { for (let registration of registrations) { - if (registration.scope === 'https://twitter.com/') { + if (registration.scope === "https://twitter.com/") { registration.unregister(); - console.log('Unregistered Twitter SW', registration); + console.log("Unregistered Twitter SW", registration); } } }); const url = new URL(window.location); if (shouldRedirect()) { const redirect = redirectTwitter(url); - console.info( - 'Redirecting', `"${url.href}"`, '=>', `"${redirect}"` - ); + console.info("Redirecting", `"${url.href}"`, "=>", `"${redirect}"`); window.location = redirect; } } diff --git a/background.js b/background.js index ffe1857e..3f5145cd 100644 --- a/background.js +++ b/background.js @@ -1,6 +1,5 @@ "use strict"; -const invidiousDefault = "https://invidious.snopyta.org"; const youtubeDomains = [ "m.youtube.com", "youtube.com", @@ -22,7 +21,6 @@ const invidiousInstances = [ "https://invidious.fdn.fr", "https://invidious.toot.koeln", ]; -const nitterDefault = "https://nitter.net"; const twitterDomains = [ "twitter.com", "www.twitter.com", @@ -30,7 +28,20 @@ const twitterDomains = [ "pbs.twimg.com", "video.twimg.com", ]; -const bibliogramDefault = "https://bibliogram.art"; +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.tedomum.net", + "https://nitter.cattube.org", + "https://nitter.fdn.fr", + "https://nitter.1d4.us", + "https://nitter.kavin.rocks", +]; const instagramDomains = [ "instagram.com", "www.instagram.com", @@ -64,6 +75,13 @@ const bibliogramBypassPaths = /\/(accounts\/|embeds?.js)/; const bibliogramInstances = [ "https://bibliogram.art", "https://bibliogram.snopyta.org", + "https://bibliogram.pussthecat.org", + "https://bibliogram.nixnet.services", + "https://bg.endl.site", + "https://bibliogram.13ad.de ", + "https://bibliogram.stemy.me ", + "https://bibliogram.hamster.dance", + "https://bibliogram.ggc-project.de", ]; const osmDefault = "https://openstreetmap.org"; const googleMapsRegex = /https?:\/\/(((www|maps)\.)?(google\.).*(\/maps)|maps\.(google\.).*)/; @@ -128,9 +146,9 @@ browser.storage.sync.get( disableInvidious = result.disableInvidious; disableBibliogram = result.disableBibliogram; disableOsm = result.disableOsm; - nitterInstance = result.nitterInstance || nitterDefault; - invidiousInstance = result.invidiousInstance || invidiousDefault; - bibliogramInstance = result.bibliogramInstance || bibliogramDefault; + nitterInstance = result.nitterInstance; + invidiousInstance = result.invidiousInstance; + bibliogramInstance = result.bibliogramInstance; osmInstance = result.osmInstance || osmDefault; alwaysProxy = result.alwaysProxy; onlyEmbeddedVideo = result.onlyEmbeddedVideo; @@ -150,14 +168,13 @@ browser.storage.sync.get( browser.storage.onChanged.addListener((changes) => { if ("nitterInstance" in changes) { - nitterInstance = changes.nitterInstance.newValue || nitterDefault; + nitterInstance = changes.nitterInstance.newValue; } if ("invidiousInstance" in changes) { - invidiousInstance = changes.invidiousInstance.newValue || invidiousDefault; + invidiousInstance = changes.invidiousInstance.newValue; } if ("bibliogramInstance" in changes) { - bibliogramInstance = - changes.bibliogramInstance.newValue || bibliogramDefault; + bibliogramInstance = changes.bibliogramInstance.newValue; } if ("osmInstance" in changes) { osmInstance = changes.osmInstance.newValue || osmDefault; @@ -205,6 +222,10 @@ browser.storage.onChanged.addListener((changes) => { } }); +function getRandomInstance(instanceList) { + return instanceList[~~(instanceList.length * Math.random())]; +} + function addressToLatLng(address, callback) { const xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = () => { @@ -248,6 +269,7 @@ function redirectYouTube(url, initiator, type) { if ( initiator && (initiator.origin === invidiousInstance || + invidiousInstances.includes(initiator.origin) || youtubeDomains.includes(initiator.host)) ) { return null; @@ -284,7 +306,9 @@ function redirectYouTube(url, initiator, type) { } url.searchParams.append("autoplay", invidiousAutoplay ? 1 : 0); - return `${invidiousInstance}${url.pathname}${url.search}`; + return `${invidiousInstance || getRandomInstance(invidiousInstances)}${ + url.pathname + }${url.search}`; } function redirectTwitter(url, initiator) { @@ -298,6 +322,7 @@ function redirectTwitter(url, initiator) { isFirefox() && initiator && (initiator.origin === nitterInstance || + nitterInstances.includes(initiator.origin) || twitterDomains.includes(initiator.host)) ) { browser.storage.sync.set({ @@ -306,15 +331,21 @@ function redirectTwitter(url, initiator) { return null; } if (url.host.split(".")[0] === "pbs") { - return `${nitterInstance}/pic/${encodeURIComponent(url.href)}`; + return `${ + nitterInstance || getRandomInstance(nitterInstances) + }/pic/${encodeURIComponent(url.href)}`; } else if (url.host.split(".")[0] === "video") { - return `${nitterInstance}/gif/${encodeURIComponent(url.href)}`; + return `${ + nitterInstance || getRandomInstance(nitterInstances) + }/gif/${encodeURIComponent(url.href)}`; } else if (url.pathname.includes("tweets")) { - return `${nitterInstance}${url.pathname.replace("/tweets", "")}${ - url.search - }`; + return `${ + nitterInstance || getRandomInstance(nitterInstances) + }${url.pathname.replace("/tweets", "")}${url.search}`; } else { - return `${nitterInstance}${url.pathname}${url.search}`; + return `${nitterInstance || getRandomInstance(nitterInstances)}${ + url.pathname + }${url.search}`; } } @@ -326,6 +357,7 @@ function redirectInstagram(url, initiator, type) { if ( initiator && (initiator.origin === bibliogramInstance || + bibliogramInstances.includes(initiator.origin) || instagramDomains.includes(initiator.host)) ) { return null; @@ -338,10 +370,14 @@ function redirectInstagram(url, initiator, type) { url.pathname === "/" || instagramReservedPaths.includes(url.pathname.split("/")[1]) ) { - return `${bibliogramInstance}${url.pathname}${url.search}`; + return `${bibliogramInstance || getRandomInstance(bibliogramInstances)}${ + url.pathname + }${url.search}`; } else { // Likely a user profile, redirect to '/u/...' - return `${bibliogramInstance}/u${url.pathname}${url.search}`; + return `${bibliogramInstance || getRandomInstance(bibliogramInstances)}/u${ + url.pathname + }${url.search}`; } } @@ -482,14 +518,7 @@ browser.webRequest.onBeforeRequest.addListener( ); browser.runtime.onInstalled.addListener((details) => { - if (details.reason === "install") { - browser.storage.sync.set({ - bibliogramInstance: - bibliogramInstances[~~(bibliogramInstances.length * Math.random())], - invidiousInstance: - invidiousInstances[~~(invidiousInstances.length * Math.random())], - }); - } else if (details.reason === "update") { + if (details.reason === "update") { browser.storage.sync.get( ["whitelist", "exceptions", "invidiousInstance"], (result) => { @@ -502,13 +531,9 @@ browser.runtime.onInstalled.addListener((details) => { whitelist: null, }); } - if ( - result.invidiousInstance === "https://invidio.us" || - result.invidiousInstance === null - ) { + if (result.invidiousInstance === "https://invidio.us") { browser.storage.sync.set({ - invidiousInstance: - invidiousInstances[~~(invidiousInstances.length * Math.random())], + invidiousInstance: null, }); } } diff --git a/manifest.json b/manifest.json index 88be6e84..ea0756b3 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_extensionName__", "description": "__MSG_extensionDescription__", - "version": "1.1.40", + "version": "1.1.41", "manifest_version": 2, "background": { "scripts": ["background.js"], diff --git a/pages/options/options.html b/pages/options/options.html index 8e074037..6641e5c4 100644 --- a/pages/options/options.html +++ b/pages/options/options.html @@ -127,7 +127,7 @@ id="nitter-instance" type="url" name="nitter-instance" - placeholder="https://nitter.net" + placeholder="Random instance (none selected)" />
      @@ -137,7 +137,7 @@
      @@ -147,7 +147,7 @@ @@ -228,9 +228,8 @@ - + +
      @@ -257,7 +256,9 @@
      -

      Invidious Volume

      +

      + Invidious Volume +

      + />

      diff --git a/pages/options/options.js b/pages/options/options.js index 89ef315f..8149be7b 100644 --- a/pages/options/options.js +++ b/pages/options/options.js @@ -140,6 +140,9 @@ browser.storage.sync.get( exceptions = result.exceptions || []; exceptions.forEach(prependExceptionsItem); invidiousVolume.value = result.invidiousVolume; + document.querySelector("#volume-value").textContent = result.invidiousVolume + ? `${result.invidiousVolume}%` + : " - "; invidiousPlayerStyle.value = result.invidiousPlayerStyle || ""; invidiousSubtitles.value = result.invidiousSubtitles || ""; invidiousAutoplay.checked = result.invidiousAutoplay; @@ -313,11 +316,12 @@ persistInvidiousPrefs.addEventListener("change", (event) => { }); let invidiousVolumeChange = debounce(() => { - if (invidiousInstance.checkValidity()) { - browser.storage.sync.set({ - invidiousVolume: invidiousVolume.value, - }); - } + document.querySelector( + "#volume-value" + ).textContent = `${invidiousVolume.value}%`; + browser.storage.sync.set({ + invidiousVolume: invidiousVolume.value, + }); }, 500); invidiousVolume.addEventListener("input", invidiousVolumeChange); diff --git a/pages/styles.css b/pages/styles.css index 300dadbf..dd58676b 100644 --- a/pages/styles.css +++ b/pages/styles.css @@ -457,3 +457,7 @@ input[type="range"]::-moz-range-thumb { background-color: var(--bg-secondary); } } + +#volume-value { + float: right; +} -- cgit 1.4.1