From 9a5a3779b40decff8e271f052a8d447c04bab897 Mon Sep 17 00:00:00 2001 From: SimonBrazell Date: Tue, 31 Mar 2020 14:57:36 +1100 Subject: [PATCH] Fix #30 - 'View on ...' links, & handle more maps embed cases --- README.md | 4 ++-- background.js | 36 +++++++++++++++++++++++++++++------- images/buy-me-a-coffee.png | Bin 8257 -> 5008 bytes manifest.json | 2 +- 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 29c5a49..8435bff 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # ![nitter-redirect](images/icon32.png) Privacy Redirect -[![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](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/) -A simple 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/). +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/). Allows for setting custom [Nitter](https://github.com/zedeus/nitter/wiki/Instances), [Invidious](https://github.com/omarroth/invidious/wiki/Invidious-Instances), [Bibliogram](https://github.com/cloudrac3r/bibliogram/wiki/Instances) & [OpenStreetMap](https://wiki.openstreetmap.org/wiki/Tile_servers) instances and toggling all redirects on & off. diff --git a/background.js b/background.js index 4811994..33ff7a8 100644 --- a/background.js +++ b/background.js @@ -145,10 +145,13 @@ function addressToLatLng(address, callback) { xmlhttp.send(); } -function redirectYouTube(url, type) { +function redirectYouTube(url, initiator, type) { if (disableInvidious) { return null; } + 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'); @@ -170,10 +173,13 @@ function redirectYouTube(url, type) { } } -function redirectTwitter(url) { +function redirectTwitter(url, initiator) { if (disableNitter) { return null; } + if (initiator && (initiator.origin === nitterInstance || twitterDomains.includes(initiator.host))) { + return null; + } if (url.host.split('.')[0] === 'pbs') { return `${nitterInstance}/pic/${encodeURIComponent(url.href)}`; } else if (url.host.split('.')[0] === 'video') { @@ -183,10 +189,13 @@ function redirectTwitter(url) { } } -function redirectInstagram(url) { +function redirectInstagram(url, initiator) { if (disableBibliogram) { return null; } + if (initiator && (initiator.origin === bibliogramInstance || initiator.host.match(instagramRegex))) { + return null; + } if (url.pathname === '/' || url.pathname.match(instagramPathsRegex)) { return `${bibliogramInstance}${url.pathname}${url.search}`; } else { @@ -217,7 +226,19 @@ function redirectGoogleMaps(url) { params = `${params}&layers=${layers[url.searchParams.get('layer')] || layers['none']}`; // Handle Google Maps Embed API if (url.pathname.includes('/embed')) { - const query = url.searchParams.get('q') || url.searchParams.get('query'); + 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]; + } catch (error) { + console.error(error); + // Unable to find map marker in URL. + } + } let marker, bbox; addressToLatLng(query, (coords, boundingbox) => { marker = coords; @@ -267,18 +288,19 @@ function redirectGoogleMaps(url) { browser.webRequest.onBeforeRequest.addListener( details => { const url = new URL(details.url); + let initiator = details.initiator && new URL(details.initiator); let redirect; if (youtubeDomains.includes(url.host)) { redirect = { - redirectUrl: redirectYouTube(url, details.type) + redirectUrl: redirectYouTube(url, initiator, details.type) }; } else if (twitterDomains.includes(url.host)) { redirect = { - redirectUrl: redirectTwitter(url) + redirectUrl: redirectTwitter(url, initiator) }; } else if (url.host.match(instagramRegex)) { redirect = { - redirectUrl: redirectInstagram(url) + redirectUrl: redirectInstagram(url, initiator) }; } else if (url.href.match(googleMapsRegex)) { redirect = { diff --git a/images/buy-me-a-coffee.png b/images/buy-me-a-coffee.png index e0c8c11158f3d8246bb52d3ebccd961d5f4164e4..1bb2ad614344bcb5e0432f31cc81fa8d921dd2fc 100644 GIT binary patch delta 4537 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 delta 7848 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