about summary refs log tree commit diff stats
path: root/background.js
diff options
context:
space:
mode:
authorSimonBrazell <simon@brazell.com.au>2020-03-31 14:57:36 +1100
committerSimonBrazell <simon@brazell.com.au>2020-03-31 15:00:44 +1100
commit9a5a3779b40decff8e271f052a8d447c04bab897 (patch)
tree47cd463ea5797accfa74f343e361ed2d30684bec /background.js
parentFix #31 - Add Firefox screenshots (diff)
downloadlibredirect-9a5a3779b40decff8e271f052a8d447c04bab897.zip
Fix #30 - 'View on ...' links, & handle more maps embed cases
Diffstat (limited to 'background.js')
-rw-r--r--background.js36
1 files changed, 29 insertions, 7 deletions
diff --git a/background.js b/background.js
index 4811994f..33ff7a8b 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 = {