about summary refs log tree commit diff stats
path: root/src/pages/background/background.js
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-09-11 18:44:14 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-09-11 18:44:14 +0200
commit2af0f5e64e47c59e575802249983feb8968959b1 (patch)
treea2d80749d6b297ef05b1893949081b678f9e8677 /src/pages/background/background.js
parentchore(Merge): remote-tracking branch 'origin/master' (diff)
parentTranslated using Weblate (Arabic) (diff)
downloadlibredirect-2af0f5e64e47c59e575802249983feb8968959b1.zip
chore(merge): Merge remote-tracking branch 'origin/master'
Following Conflicts have been resolved:
        README.md
        src/_locales/bs/messages.json
        src/_locales/de/messages.json
        src/_locales/en/messages.json
        src/_locales/fr/messages.json
        src/_locales/ko/messages.json
        src/_locales/nb_NO/messages.json
        src/_locales/pt/messages.json
        src/_locales/pt_BR/messages.json
        src/_locales/sr/messages.json
        src/_locales/vi/messages.json
        src/assets/images/libredirect.svg
        src/assets/javascripts/services.js
        src/config.json
        src/manifest.json
        src/updates/updates.xml
Diffstat (limited to 'src/pages/background/background.js')
-rw-r--r--src/pages/background/background.js663
1 files changed, 351 insertions, 312 deletions
diff --git a/src/pages/background/background.js b/src/pages/background/background.js
index 4b8f1ca2..1fcba190 100644
--- a/src/pages/background/background.js
+++ b/src/pages/background/background.js
@@ -7,338 +7,377 @@ const isChrome = browser.runtime.getBrowserInfo === undefined
 window.browser = window.browser || window.chrome
 
 browser.runtime.onInstalled.addListener(async details => {
-	if (details.previousVersion != browser.runtime.getManifest().version) {
-		// ^Used to prevent this running when debugging with auto-reload
-		if (details.reason == "install") {
-			if (!(await utils.getOptions())) {
-				await servicesHelper.initDefaults()
-			}
-			browser.runtime.openOptionsPage()
-		}
-		else if (details.reason == "update") {
-			if (details.previousVersion == '2.5.2') {
-				await servicesHelper.upgradeOptions()
-				await servicesHelper.processUpdate()
-			} else {
-				await servicesHelper.processUpdate()
-			}
-		}
-	}
+  if (details.previousVersion != browser.runtime.getManifest().version) {
+    // ^Used to prevent this running when debugging with auto-reload
+    if (details.reason == "install") {
+      if (!(await utils.getOptions())) {
+        await servicesHelper.initDefaults()
+      }
+    } else if (details.reason == "update") {
+      await servicesHelper.processUpdate()
+    }
+  }
 })
 
+// true to redirect, false to bypass
 let tabIdRedirects = {}
 
 // true == Always redirect, false == Never redirect, null/undefined == follow options for services
 browser.webRequest.onBeforeRequest.addListener(
-	details => {
-		const url = new URL(details.url)
-		if (new RegExp(/^chrome-extension:\/{2}.*\/instances\/.*.json$/).test(url.href) && details.type == "xmlhttprequest") return
-		let initiator
-		try {
-			if (details.originUrl) initiator = new URL(details.originUrl)
-			else if (details.initiator && details.initiator !== "null") initiator = new URL(details.initiator)
-		} catch {
-			return null
-		}
-		if (tabIdRedirects[details.tabId] == false) return null
-		let newUrl = servicesHelper.redirect(url, details.type, initiator, tabIdRedirects[details.tabId], details.incognito)
+  details => {
+    const old_href = details.url
+    const url = new URL(details.url)
+    if (new RegExp(/^chrome-extension:\/{2}.*\/instances\/.*.json$/).test(url.href) && details.type == "xmlhttprequest")
+      return null
 
-		if (details.frameAncestors && details.frameAncestors.length > 0 && servicesHelper.isException(new URL(details.frameAncestors[0].url))) newUrl = null
+    // if url is previously bypassed
+    if (tabIdRedirects[details.tabId] == false) return null
 
-		if (servicesHelper.isException(url)) {
-			if (details.type == "main_frame")
-				newUrl = "BYPASSTAB"
-			else
-				return null
-		}
+    // Bypass embeds from excepted urls
+    if (
+      details.frameAncestors &&
+      details.frameAncestors.length >= 1 &&
+      servicesHelper.isException(new URL(details.frameAncestors[0].url))
+    )
+      return null
 
-		if (!newUrl) {
-			const match = url.href.match(/^https?:\/{2}.*\.libredirect\.invalid.*/)
-			if (match) {
-				browser.tabs.update({
-					url: browser.runtime.getURL(`/pages/messages/no_instance.html`)
-				});
-			}
-		}
+    if (servicesHelper.isException(url)) {
+      if (details.type == "main_frame") {
+        console.log(`Bypassing ${details.tabId} ${url}`)
+        tabIdRedirects[details.tabId] = false
+      }
+      return null
+    }
 
-		if (newUrl) {
-			if (newUrl === "CANCEL") {
-				console.log(`Canceled ${url}`)
-				return { cancel: true }
-			}
-			if (newUrl === "BYPASSTAB") {
-				console.log(`Bypassed ${details.tabId} ${url}`)
-				if (tabIdRedirects[details.tabId] != false) tabIdRedirects[details.tabId] = false
-				return null
-			}
-			console.info("Redirecting", url.href, "=>", newUrl)
-			return { redirectUrl: newUrl }
-		}
-		return null
-	},
-	{ urls: ["<all_urls>"] },
-	["blocking"]
-)
+    let originUrl
+    let documentUrl
+    try {
+      if (details.originUrl) originUrl = new URL(details.originUrl)
+      if (details.documentUrl) documentUrl = new URL(details.documentUrl)
+    } catch {
+      return null
+    }
 
-browser.tabs.onRemoved.addListener(tabId => {
-	if (tabIdRedirects[tabId] != undefined) {
-		delete tabIdRedirects[tabId]
-		console.log(`Removed tab ${tabId} from tabIdRedirects`)
-	}
-})
+    let newUrl = servicesHelper.redirect(
+      url,
+      details.type,
+      originUrl,
+      documentUrl,
+      details.incognito,
+      tabIdRedirects[details.tabId]
+    )
 
-browser.commands.onCommand.addListener(async command => {
-	browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
-		const url = new URL(tabs[0].url)
-		switch (command) {
-			case "switchInstance":
-				const newUrl = await servicesHelper.switchInstance(url)
-				if (newUrl) browser.tabs.update({ url: newUrl })
-				break
-			case "copyRaw": {
-				servicesHelper.copyRaw(url)
-				break
-			}
-			case "redirect": {
-				browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
-					if (tabs[0].url) {
-						const url = new URL(tabs[0].url)
-						const newUrl = servicesHelper.redirect(url, "main_frame", null, true)
-						if (newUrl) {
-							browser.tabs.update(tabs[0].id, { url: newUrl }, () => {
-								tabIdRedirects[tabs[0].id] = true
-							})
-						}
-					}
-				})
-				break
-			}
-			case "reverse": {
-				browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
-					if (tabs[0].url) {
-						const url = new URL(tabs[0].url)
-						const newUrl = await servicesHelper.reverse(url)
-						if (newUrl) {
-							browser.tabs.update(tabs[0].id, { url: newUrl }, () => {
-								tabIdRedirects[tabs[0].id] = false
-							})
-						}
-					}
-				})
-				break
-			}
-		}
-	})
-})
+    if (
+      (newUrl && newUrl.startsWith("https://no-instance.libredirect.invalid")) ||
+      (!newUrl && url.href.startsWith("https://no-instance.libredirect.invalid"))
+    ) {
+      newUrl = newUrl ? new URL(newUrl) : url
+      const frontend = newUrl.searchParams.get("frontend")
+      const oldUrl = new URL(newUrl.searchParams.get("url"))
+      const params = new URLSearchParams({
+        message: "no_instance",
+        url: oldUrl,
+        frontend: frontend,
+      })
+      browser.tabs.update({
+        url: browser.runtime.getURL(`/pages/messages/index.html?${params.toString()}`),
+      })
+      return { cancel: true }
+    }
 
-browser.contextMenus.create({ id: "settingsTab", title: browser.i18n.getMessage("settings"), contexts: ["browser_action"] })
-browser.contextMenus.create({ id: "switchInstanceTab", title: browser.i18n.getMessage("switchInstance"), contexts: ["browser_action"] })
-browser.contextMenus.create({ id: "copyReverseTab", title: 'Copy Original', contexts: ["browser_action"] })
-browser.contextMenus.create({ id: "redirectTab", title: 'Redirect', contexts: ["browser_action"] })
-browser.contextMenus.create({ id: "reverseTab", title: 'Redirect To Original', contexts: ["browser_action"] })
+    if (!newUrl) {
+      if (url.href.match(/^https?:\/{2}(.*\.)?libredirect\.invalid.*/)) {
+        const params = new URLSearchParams({
+          message: "disabled",
+          url: url.href,
+        })
+        browser.tabs.update({
+          url: browser.runtime.getURL(`/pages/messages/index.html?${params.toString()}`),
+        })
+        return { cancel: true }
+      }
+    }
 
-browser.contextMenus.create({ id: "redirectLink", title: 'Redirect', contexts: ["link"] })
-browser.contextMenus.create({ id: "redirectLinkInNewTab", title: 'Redirect In New Tab', contexts: ["link"] })
-browser.contextMenus.create({ id: "reverseLink", title: 'Redirect To Original', contexts: ["link"] })
-browser.contextMenus.create({ id: "reverseLinkInNewTab", title: 'Redirect To Original In New Tab', contexts: ["link"] })
-browser.contextMenus.create({ id: "copyReverseLink", title: 'Copy Original', contexts: ["link"] })
-browser.contextMenus.create({ id: "bypassLink", title: 'Bypass', contexts: ["link"] })
-browser.contextMenus.create({ id: "bypassLinkInNewTab", title: 'Bypass In New Tab', contexts: ["link"] })
+    if (newUrl === "CANCEL") {
+      console.log(`Cancelling ${url}`)
+      return { cancel: true }
+    }
+    if (newUrl === "BYPASSTAB") {
+      console.log(`Bypassing ${details.tabId} ${url}`)
+      tabIdRedirects[details.tabId] = false
+      return null
+    }
+    if (newUrl) {
+      console.log("Redirecting", old_href, "=>", newUrl)
+      return { redirectUrl: newUrl }
+    }
+    return null
+  },
+  { urls: ["<all_urls>"] },
+  ["blocking"]
+)
 
-if (!isChrome) {
-	browser.contextMenus.create({ id: "redirectBookmark", title: 'Redirect', contexts: ["bookmark"] })
-	browser.contextMenus.create({ id: "redirectBookmarkInNewTab", title: 'Redirect In New Tab', contexts: ["bookmark"] })
-	browser.contextMenus.create({ id: "reverseBookmark", title: 'Redirect To Original', contexts: ["bookmark"] })
-	browser.contextMenus.create({ id: "reverseBookmarkInNewTab", title: 'Redirect To Original In New Tab', contexts: ["bookmark"] })
-	browser.contextMenus.create({ id: "copyReverseBookmark", title: 'Copy Original', contexts: ["bookmark"] })
-	browser.contextMenus.create({ id: "bypassBookmark", title: 'Bypass', contexts: ["bookmark"] })
-	browser.contextMenus.create({ id: "bypassBookmarkInNewTab", title: 'Bypass In New Tab', contexts: ["bookmark"] })
-}
+browser.webRequest.onHeadersReceived.addListener(
+  details => {
+    if (details.statusCode >= 501 || details.statusCode == 429 || details.statusCode == 403) {
+      const url = new URL(details.url)
+      const { service, frontend } = servicesHelper.computeFrontend(url)
+      if (!service) return
+      const params = new URLSearchParams({
+        message: "server_error",
+        code: details.statusCode,
+        url: url.href,
+        frontend: frontend,
+        service: service,
+      })
+      setTimeout(() => {
+        browser.tabs.update({
+          url: browser.runtime.getURL(`/pages/messages/index.html?${params.toString()}`),
+        })
+      }, 2000)
+    }
+  },
+  { urls: ["<all_urls>"] }
+)
 
-browser.contextMenus.onClicked.addListener(async (info) => {
-	switch (info.menuItemId) {
-		case 'switchInstanceTab': {
-			const url = new URL(info.pageUrl)
-			const newUrl = await servicesHelper.switchInstance(url)
-			if (newUrl) {
-				browser.tabs.update({ url: newUrl })
-			}
-			return
-		}
-		case 'settingsTab': {
-			browser.runtime.openOptionsPage()
-			return
-		}
-		case 'copyReverseTab': {
-			browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
-				if (tabs[0].url) {
-					const url = new URL(tabs[0].url)
-					servicesHelper.copyRaw(url)
-				}
-			})
-			return
-		}
-		case 'reverseTab': {
-			browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
-				if (tabs[0].url) {
-					const url = new URL(tabs[0].url)
-					const newUrl = await servicesHelper.reverse(url)
-					if (newUrl) {
-						browser.tabs.update(tabs[0].id, { url: newUrl }, () => {
-							tabIdRedirects[tabs[0].id] = false
-						})
-					}
-				}
-			})
-			return
-		}
-		case 'redirectTab': {
-			browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
-				if (tabs[0].url) {
-					const url = new URL(tabs[0].url)
-					const newUrl = servicesHelper.redirect(url, "main_frame", null, true)
-					if (newUrl) {
-						browser.tabs.update(tabs[0].id, { url: newUrl }, () => {
-							tabIdRedirects[tabs[0].id] = true
-						})
-					}
-				}
-			})
-			return
-		}
+browser.tabs.onRemoved.addListener(tabId => {
+  if (tabIdRedirects[tabId] != undefined) {
+    delete tabIdRedirects[tabId]
+    console.log(`Removed tab ${tabId} from tabIdRedirects`)
+  }
+})
 
-		case 'copyReverseLink': {
-			const url = new URL(info.linkUrl)
-			await servicesHelper.copyRaw(url)
-			return
-		}
-		case 'redirectLink':
-		case 'redirectLinkInNewTab': {
-			const url = new URL(info.linkUrl)
-			const newUrl = servicesHelper.redirect(url, "main_frame", null, true)
-			if (newUrl) {
-				if (info.menuItemId == "redirectLink") browser.tabs.update({ url: newUrl })
-				else browser.tabs.create({ url: newUrl })
-			}
-			return
-		}
-		case 'reverseLink':
-		case 'reverseLinkInNewTab': {
-			const url = new URL(info.linkUrl)
-			const newUrl = await servicesHelper.reverse(url)
-			if (newUrl) {
-				if (info.menuItemId == "reverseLink") {
-					browser.tabs.update({ url: newUrl }, tab => {
-						tabIdRedirects[tab.id] = false
-					})
-				} else {
-					browser.tabs.create({ url: newUrl }, tab => {
-						tabIdRedirects[tab.id] = false
-					})
-				}
-			}
-			return
-		}
+browser.runtime.getPlatformInfo(r => {
+  if (r.os != "fuchsia" && r.os != "ios" && r.os != "android") {
+    browser.commands.onCommand.addListener(async command => {
+      browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
+        const url = new URL(tabs[0].url)
+        switch (command) {
+          case "switchInstance": {
+            const newUrl = await servicesHelper.switchInstance(url)
+            if (newUrl) browser.tabs.update({ url: newUrl })
+            break
+          }
+          case "copyRaw":
+            servicesHelper.copyRaw(url)
+            break
+          case "redirect":
+            browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
+              if (tabs[0].url) {
+                const url = new URL(tabs[0].url)
+                const newUrl = servicesHelper.redirect(url, "main_frame", null, null, false, true)
+                if (newUrl) {
+                  browser.tabs.update(tabs[0].id, { url: newUrl }, () => {
+                    tabIdRedirects[tabs[0].id] = true
+                  })
+                }
+              }
+            })
+            break
+          case "reverse":
+            browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
+              if (tabs[0].url) {
+                const url = new URL(tabs[0].url)
+                const newUrl = await servicesHelper.reverse(url)
+                if (newUrl) {
+                  browser.tabs.update(tabs[0].id, { url: newUrl }, () => {
+                    tabIdRedirects[tabs[0].id] = false
+                  })
+                }
+              }
+            })
+            break
+        }
+      })
+    })
 
-		case 'bypassLink':
-		case 'bypassLinkInNewTab': {
-			const url = new URL(info.linkUrl)
-			if (info.menuItemId == "bypassLink") {
-				browser.tabs.update({ url: url.href }, tab => {
-					tabIdRedirects[tab.id] = false
-				})
-			} else {
-				browser.tabs.create({ url: url.href }, tab => {
-					tabIdRedirects[tab.id] = false
-				})
-			}
-			return
-		}
+    browser.contextMenus.create({
+      id: "settingsTab",
+      title: browser.i18n.getMessage("settings"),
+      contexts: ["browser_action"],
+    })
+    browser.contextMenus.create({
+      id: "switchInstanceTab",
+      title: browser.i18n.getMessage("switchInstance"),
+      contexts: ["browser_action"],
+    })
+    browser.contextMenus.create({ id: "copyReverseTab", title: "Copy Original", contexts: ["browser_action"] })
+    browser.contextMenus.create({ id: "redirectTab", title: "Redirect", contexts: ["browser_action"] })
+    browser.contextMenus.create({ id: "reverseTab", title: "Redirect To Original", contexts: ["browser_action"] })
 
-		case 'copyReverseBookmark': {
-			browser.bookmarks.get(info.bookmarkId, bookmarks => {
-				const url = new URL(bookmarks[0].url)
-				servicesHelper.copyRaw(url)
-			});
-			return
-		}
+    browser.contextMenus.create({ id: "redirectLink", title: "Redirect", contexts: ["link"] })
+    browser.contextMenus.create({ id: "redirectLinkInNewTab", title: "Redirect In New Tab", contexts: ["link"] })
+    browser.contextMenus.create({ id: "reverseLink", title: "Redirect To Original", contexts: ["link"] })
+    browser.contextMenus.create({
+      id: "reverseLinkInNewTab",
+      title: "Redirect To Original In New Tab",
+      contexts: ["link"],
+    })
+    browser.contextMenus.create({ id: "copyReverseLink", title: "Copy Original", contexts: ["link"] })
+    browser.contextMenus.create({ id: "bypassLink", title: "Bypass", contexts: ["link"] })
+    browser.contextMenus.create({ id: "bypassLinkInNewTab", title: "Bypass In New Tab", contexts: ["link"] })
 
-		case 'redirectBookmark':
-		case 'redirectBookmarkInNewTab': {
-			browser.bookmarks.get(info.bookmarkId, bookmarks => {
-				const url = new URL(bookmarks[0].url)
-				const newUrl = servicesHelper.redirect(url, "main_frame", null, true)
-				if (newUrl) {
-					if (info.menuItemId == 'redirectBookmark') browser.tabs.update({ url: newUrl })
-					else browser.tabs.create({ url: newUrl })
-				}
-			})
-			return
-		}
-		case 'reverseBookmark':
-		case 'reverseBookmarkInNewTab': {
-			browser.bookmarks.get(info.bookmarkId, async bookmarks => {
-				const url = new URL(bookmarks[0].url)
-				const newUrl = await servicesHelper.reverse(url)
-				if (newUrl) {
-					if (info.menuItemId == "reverseBookmark") {
-						browser.tabs.update({ url: newUrl }, tab => {
-							tabIdRedirects[tab.id] = false
-						})
-					} else {
-						browser.tabs.create({ url: newUrl }, tab => {
-							tabIdRedirects[tab.id] = false
-						})
-					}
-				}
-			})
-			return
-		}
+    if (!isChrome) {
+      browser.contextMenus.create({ id: "redirectBookmark", title: "Redirect", contexts: ["bookmark"] })
+      browser.contextMenus.create({
+        id: "redirectBookmarkInNewTab",
+        title: "Redirect In New Tab",
+        contexts: ["bookmark"],
+      })
+      browser.contextMenus.create({ id: "reverseBookmark", title: "Redirect To Original", contexts: ["bookmark"] })
+      browser.contextMenus.create({
+        id: "reverseBookmarkInNewTab",
+        title: "Redirect To Original In New Tab",
+        contexts: ["bookmark"],
+      })
+      browser.contextMenus.create({ id: "copyReverseBookmark", title: "Copy Original", contexts: ["bookmark"] })
+      browser.contextMenus.create({ id: "bypassBookmark", title: "Bypass", contexts: ["bookmark"] })
+      browser.contextMenus.create({ id: "bypassBookmarkInNewTab", title: "Bypass In New Tab", contexts: ["bookmark"] })
+    }
 
-		case 'bypassBookmark':
-		case 'bypassBookmarkInNewTab': {
-			browser.bookmarks.get(info.bookmarkId, async bookmarks => {
-				const url = new URL(bookmarks[0].url)
-				if (info.menuItemId == "bypassBookmark") {
-					browser.tabs.update({ url: url.href }, tab => {
-						tabIdRedirects[tab.id] = false
-					})
-				} else {
-					browser.tabs.create({ url: url.href }, tab => {
-						tabIdRedirects[tab.id] = false
-					})
-				}
-				return
-			})
-		}
-	}
+    browser.contextMenus.onClicked.addListener(async info => {
+      switch (info.menuItemId) {
+        case "switchInstanceTab": {
+          const url = new URL(info.pageUrl)
+          const newUrl = await servicesHelper.switchInstance(url)
+          if (newUrl) browser.tabs.update({ url: newUrl })
+          return
+        }
+        case "settingsTab":
+          browser.runtime.openOptionsPage()
+          return
+        case "copyReverseTab":
+          browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
+            if (tabs[0].url) {
+              const url = new URL(tabs[0].url)
+              servicesHelper.copyRaw(url)
+            }
+          })
+          return
+        case "reverseTab":
+          browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
+            if (tabs[0].url) {
+              const url = new URL(tabs[0].url)
+              const newUrl = await servicesHelper.reverse(url)
+              if (newUrl) {
+                browser.tabs.update(tabs[0].id, { url: newUrl }, () => {
+                  tabIdRedirects[tabs[0].id] = false
+                })
+              }
+            }
+          })
+          return
+        case "redirectTab":
+          browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
+            if (tabs[0].url) {
+              const url = new URL(tabs[0].url)
+              const newUrl = servicesHelper.redirect(url, "main_frame", null, null, false, true)
+              if (newUrl) {
+                browser.tabs.update(tabs[0].id, { url: newUrl }, () => {
+                  tabIdRedirects[tabs[0].id] = true
+                })
+              }
+            }
+          })
+          return
+        case "copyReverseLink": {
+          const url = new URL(info.linkUrl)
+          await servicesHelper.copyRaw(url)
+          return
+        }
+        case "redirectLink":
+        case "redirectLinkInNewTab": {
+          const url = new URL(info.linkUrl)
+          const newUrl = servicesHelper.redirect(url, "main_frame", null, null, false, true)
+          if (newUrl) {
+            if (info.menuItemId == "redirectLink") browser.tabs.update({ url: newUrl })
+            else browser.tabs.create({ url: newUrl })
+          }
+          return
+        }
+        case "reverseLink":
+        case "reverseLinkInNewTab": {
+          const url = new URL(info.linkUrl)
+          const newUrl = await servicesHelper.reverse(url)
+          if (newUrl) {
+            if (info.menuItemId == "reverseLink") {
+              browser.tabs.update({ url: newUrl }, tab => {
+                tabIdRedirects[tab.id] = false
+              })
+            } else {
+              browser.tabs.create({ url: newUrl }, tab => {
+                tabIdRedirects[tab.id] = false
+              })
+            }
+          }
+          return
+        }
+        case "bypassLink":
+        case "bypassLinkInNewTab": {
+          const url = new URL(info.linkUrl)
+          if (info.menuItemId == "bypassLink") {
+            browser.tabs.update({ url: url.href }, tab => {
+              tabIdRedirects[tab.id] = false
+            })
+          } else {
+            browser.tabs.create({ url: url.href }, tab => {
+              tabIdRedirects[tab.id] = false
+            })
+          }
+          return
+        }
+        case "copyReverseBookmark":
+          browser.bookmarks.get(info.bookmarkId, bookmarks => {
+            const url = new URL(bookmarks[0].url)
+            servicesHelper.copyRaw(url)
+          })
+          return
+        case "redirectBookmark":
+        case "redirectBookmarkInNewTab":
+          browser.bookmarks.get(info.bookmarkId, bookmarks => {
+            const url = new URL(bookmarks[0].url)
+            const newUrl = servicesHelper.redirect(url, "main_frame", null, null, false, true)
+            if (newUrl) {
+              if (info.menuItemId == "redirectBookmark") browser.tabs.update({ url: newUrl })
+              else browser.tabs.create({ url: newUrl })
+            }
+          })
+          return
+        case "reverseBookmark":
+        case "reverseBookmarkInNewTab":
+          browser.bookmarks.get(info.bookmarkId, async bookmarks => {
+            const url = new URL(bookmarks[0].url)
+            const newUrl = await servicesHelper.reverse(url)
+            if (newUrl) {
+              if (info.menuItemId == "reverseBookmark") {
+                browser.tabs.update({ url: newUrl }, tab => {
+                  tabIdRedirects[tab.id] = false
+                })
+              } else {
+                browser.tabs.create({ url: newUrl }, tab => {
+                  tabIdRedirects[tab.id] = false
+                })
+              }
+            }
+          })
+          return
+        case "bypassBookmark":
+        case "bypassBookmarkInNewTab":
+          browser.bookmarks.get(info.bookmarkId, async bookmarks => {
+            const url = new URL(bookmarks[0].url)
+            if (info.menuItemId == "bypassBookmark") {
+              browser.tabs.update({ url: url.href }, tab => (tabIdRedirects[tab.id] = false))
+            } else {
+              browser.tabs.create({ url: url.href }, tab => (tabIdRedirects[tab.id] = false))
+            }
+            return
+          })
+      }
+    })
+  }
 })
 
-browser.runtime.onMessage.addListener((request, sender, sendResponse) => {
-	if (request == "reverseTab") {
-		browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
-			if (tabs[0].url) {
-				const url = new URL(tabs[0].url)
-				const newUrl = await servicesHelper.reverse(url)
-				if (newUrl) {
-					browser.tabs.update(tabs[0].id, { url: newUrl }, () => {
-						tabIdRedirects[tabs[0].id] = false
-					})
-				}
-			}
-		})
-	}
-	else if (request == "redirectTab") {
-		browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
-			if (tabs[0].url) {
-				const url = new URL(tabs[0].url)
-				const newUrl = servicesHelper.redirect(url, "main_frame", null, true)
-				if (newUrl) {
-					browser.tabs.update(tabs[0].id, { url: newUrl }, () => {
-						tabIdRedirects[tabs[0].id] = true
-					})
-				}
-			}
-		})
-	}
-})
\ No newline at end of file
+browser.runtime.onMessage.addListener(r => {
+  if (r.message == "reverse") tabIdRedirects[r.tabId] = false
+  else if (r.message == "redirect") tabIdRedirects[r.tabId] = true
+})