about summary refs log tree commit diff stats
path: root/src/assets/javascripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/assets/javascripts')
-rw-r--r--src/assets/javascripts/general.js2
-rw-r--r--src/assets/javascripts/services.js82
-rw-r--r--src/assets/javascripts/utils.js212
3 files changed, 37 insertions, 259 deletions
diff --git a/src/assets/javascripts/general.js b/src/assets/javascripts/general.js
index 9e490c4a..7b8f9dac 100644
--- a/src/assets/javascripts/general.js
+++ b/src/assets/javascripts/general.js
@@ -32,10 +32,8 @@ async function initDefaults() {
 					},
 					theme: "detect",
 					popupServices: ["youtube", "twitter", "instagram", "tiktok", "imgur", "reddit", "quora", "translate", "maps"],
-					autoRedirect: false,
 					network: "clearnet",
 					networkFallback: true,
-					latencyThreshold: 1000,
 				},
 			},
 			() => resolve()
diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js
index a8d99075..01523d52 100644
--- a/src/assets/javascripts/services.js
+++ b/src/assets/javascripts/services.js
@@ -47,7 +47,9 @@ function all(service, frontend, options, config, redirects) {
 
 function regexArray(service, url, config, frontend) {
 	if (config.services[service].targets == "datajson") {
-		if (targets[service].startsWith(utils.protocolHost(url))) return true
+		for (const instance of targets[service]) {
+			if (instance.startsWith(utils.protocolHost(url))) return true
+		}
 	} else {
 		const targetList = config.services[service].targets
 		if (frontend && config.services[service].frontends[frontend].excludeTargets)
@@ -128,7 +130,8 @@ function redirect(url, type, initiator, forceRedirection) {
 		case "bibliogram":
 			const reservedPaths = ["u", "p", "privacy"]
 			if (url.pathname === "/" || reservedPaths.includes(url.pathname.split("/")[1])) return `${randomInstance}${url.pathname}${url.search}`
-			if (url.pathname.startsWith("/reel") || url.pathname.startsWith("/tv")) return `${randomInstance}/p${url.pathname.replace(/\/reel|\/tv/i, "")}${url.search}`
+			if (url.pathname.startsWith("/reel")) return `${randomInstance}${url.pathname}`
+			if (url.pathname.startsWith("/tv")) return `${randomInstance}/p${url.pathname.replace(/\/tv/i, "")}${url.search}`
 			else return `${randomInstance}/u${url.pathname}${url.search}` // Likely a user profile, redirect to '/u/...'
 		case "lbryDesktop":
 			return url.href.replace(/^https?:\/{2}odysee\.com\//, "lbry://").replace(/:(?=[a-zA-Z0-9])/g, "#")
@@ -138,11 +141,11 @@ function redirect(url, type, initiator, forceRedirection) {
 			else return `${randomInstance}${url.pathname}/`
 		case "searx":
 		case "searxng":
-			return `${randomInstance}/?q=${encodeURIComponent(url.searchParams.get("q"))}`
+			return `${randomInstance}/${url.search}`
 		case "whoogle":
-			return `${randomInstance}/search?q=${encodeURIComponent(url.searchParams.get("q"))}`
+			return `${randomInstance}/search${url.search}`
 		case "librex":
-			return `${randomInstance}/search.php?q=${encodeURIComponent(url.searchParams.get("q"))}`
+			return `${randomInstance}/search.php${url.search}`
 		case "send":
 			return randomInstance
 		case "nitter":
@@ -411,7 +414,7 @@ function redirect(url, type, initiator, forceRedirection) {
 			if (url.hostname.match(/^[a-zA-Z0-9-]+\.fandom\.com/)) {
 				wiki = url.hostname.match(/^[a-zA-Z0-9-]+(?=\.fandom\.com)/)
 				if (wiki == "www" || !wiki) wiki = ""
-				else wiki = "/" + wiki
+				else wiki = `/${wiki}`;
 				urlpath = url.pathname
 			} else {
 				wiki = url.pathname.match(/(?<=wiki\/w:c:)[a-zA-Z0-9-]+(?=:)/)
@@ -443,8 +446,10 @@ function redirect(url, type, initiator, forceRedirection) {
 				else return `${randomInstance}${url.pathname}${url.search}&teddit_proxy=${url.hostname}`
 			}
 			return `${randomInstance}${url.pathname}${url.search}`
+		case "simpleertube":
+			return `${randomInstance}/${url.hostname}${url.pathname}${url.search}`
 		default:
-			return `${randomInstance}${url.pathname}${url.search}`
+			return `${randomInstance}${url.pathname}${url.search} `
 	}
 }
 
@@ -506,7 +511,7 @@ function switchInstance(url) {
 				return
 			}
 			const randomInstance = utils.getRandomInstance(instancesList)
-			const oldUrl = `${oldInstance}${url.pathname}${url.search}`
+			const oldUrl = `${oldInstance}${url.pathname}${url.search} `
 			// This is to make instance switching work when the instance depends on the pathname, eg https://darmarit.org/searx
 			// Doesn't work because of .includes array method, not a top priotiry atm
 			resolve(oldUrl.replace(oldInstance, randomInstance))
@@ -541,6 +546,14 @@ function reverse(url, urlString) {
 					if (!urlString) resolve(config.services[service].url + url.pathname + url.search)
 					else resolve(url.replace(/https?:\/{2}(?:[^\s\/]+\.)+[a-zA-Z0-9]+/, config.services[service].url))
 					return
+				case "fandom":
+					let regex = url.pathname.match(/^\/([a-zA-Z0-9-]+)\/wiki\/([a-zA-Z0-9-]+)/)
+					if (regex) {
+						resolve(`https://${regex[1]}.fandom.com/wiki/${regex[2]}`)
+						return
+					}
+					resolve()
+					return
 				default:
 					resolve()
 					return
@@ -550,50 +563,6 @@ function reverse(url, urlString) {
 	})
 }
 
-function unifyPreferences(url, tabId) {
-	return new Promise(async resolve => {
-		await init()
-		const protocolHost = utils.protocolHost(url)
-		for (const service in config.services) {
-			for (const frontend in config.services[service].frontends) {
-				if (all(service, frontend, options, config, redirects).includes(protocolHost)) {
-					let instancesList = [...options[frontend][options.network].enabled, ...options[frontend][options.network].custom]
-					if (options.networkFallback && options.network != "clearnet") instancesList.push(...options[frontend].clearnet.enabled, ...options[frontend].clearnet.custom)
-
-					const frontendObject = config.services[service].frontends[frontend]
-					if ("cookies" in frontendObject.preferences) {
-						for (const cookie of frontendObject.preferences.cookies) {
-							await utils.copyCookie(url, instancesList, cookie)
-						}
-					}
-					if ("localstorage" in frontendObject.preferences) {
-						browser.storage.local.set({ tmp: [frontend, frontendObject.preferences.localstorage] })
-						browser.tabs.executeScript(tabId, {
-							file: "/assets/javascripts/get-localstorage.js",
-							runAt: "document_start",
-						})
-						for (const instance of instancesList)
-							browser.tabs.create({ url: instance }, tab =>
-								browser.tabs.executeScript(tab.id, {
-									file: "/assets/javascripts/set-localstorage.js",
-									runAt: "document_start",
-								})
-							)
-					}
-					/*
-					if ("indexeddb" in frontendObject.preferences) {
-					}
-					if ("token" in frontendObject.preferences) {
-					}
-					*/
-					resolve(true)
-					return
-				}
-			}
-		}
-	})
-}
-
 function setRedirects(passedRedirects) {
 	return new Promise(resolve => {
 		fetch("/config/config.json")
@@ -662,7 +631,6 @@ function initDefaults() {
 							let targets = {}
 							let config = JSON.parse(configData)
 							const localstorage = {}
-							const latency = {}
 							for (const service in config.services) {
 								options[service] = {}
 								if (config.services[service].targets == "datajson") {
@@ -687,7 +655,7 @@ function initDefaults() {
 									}
 								}
 							}
-							browser.storage.local.set({ redirects, options, targets, latency, localstorage })
+							browser.storage.local.set({ redirects, options, targets, localstorage })
 							resolve()
 						})
 					})
@@ -702,7 +670,6 @@ function upgradeOptions() {
 			.then(configData => {
 				browser.storage.local.get(null, r => {
 					let options = r.options
-					let latency = {}
 					const config = JSON.parse(configData)
 					options.exceptions = r.exceptions
 					if (r.theme != "DEFAULT") options.theme = r.theme
@@ -717,7 +684,6 @@ function upgradeOptions() {
 						options.popupServices.splice(tmp, 1)
 						options.popupServices.push("sendFiles")
 					}
-					options.autoRedirect = r.autoRedirect
 					switch (r.onlyEmbeddedVideo) {
 						case "onlyNotEmbedded":
 							options.youtube.redirectType = "main_frame"
@@ -747,7 +713,6 @@ function upgradeOptions() {
 						if (r[oldService + "EmbedFrontend"] && (service != "youtube" || r[oldService + "EmbedFrontend"] == "invidious" || r[oldService + "EmbedFrontend"] == "piped"))
 							options[service].embedFrontend = r[oldService + "EmbedFrontend"]
 						for (const frontend in config.services[service].frontends) {
-							if (r[frontend + "Latency"]) latency[frontend] = r[frontend + "Latency"]
 							for (const network in config.networks) {
 								let protocol
 								if (network == "clearnet") protocol = "normal"
@@ -763,7 +728,7 @@ function upgradeOptions() {
 							}
 						}
 					}
-					browser.storage.local.set({ options, latency }, () => resolve())
+					browser.storage.local.set({ options }, () => resolve())
 				})
 			})
 	})
@@ -870,7 +835,6 @@ export default {
 	computeService,
 	switchInstance,
 	reverse,
-	unifyPreferences,
 	setRedirects,
 	initDefaults,
 	upgradeOptions,
diff --git a/src/assets/javascripts/utils.js b/src/assets/javascripts/utils.js
index b176967b..b38277ad 100644
--- a/src/assets/javascripts/utils.js
+++ b/src/assets/javascripts/utils.js
@@ -13,7 +13,6 @@ function camelCase(str) {
 
 let cloudflareBlackList = []
 let authenticateBlackList = []
-let offlineBlackList = []
 async function initBlackList() {
 	return new Promise(resolve => {
 		fetch("/instances/blacklist.json")
@@ -21,7 +20,6 @@ async function initBlackList() {
 			.then(data => {
 				cloudflareBlackList = JSON.parse(data).cloudflare
 				authenticateBlackList = JSON.parse(data).authenticate
-				offlineBlackList = JSON.parse(data).offline
 				resolve()
 			})
 	})
@@ -60,7 +58,6 @@ function protocolHost(url) {
 }
 
 async function processDefaultCustomInstances(service, frontend, network, document) {
-	let instancesLatency
 	let frontendNetworkElement = document.getElementById(frontend).getElementsByClassName(network)[0]
 
 	let frontendCustomInstances = []
@@ -74,11 +71,10 @@ async function processDefaultCustomInstances(service, frontend, network, documen
 
 	async function getFromStorage() {
 		return new Promise(async resolve =>
-			browser.storage.local.get(["options", "redirects", "latency"], r => {
+			browser.storage.local.get(["options", "redirects",], r => {
 				frontendDefaultRedirects = r.options[frontend][network].enabled
 				frontendCustomInstances = r.options[frontend][network].custom
 				options = r.options
-				instancesLatency = r.latency[frontend] ?? []
 				redirects = r.redirects
 				resolve()
 			})
@@ -106,27 +102,22 @@ async function processDefaultCustomInstances(service, frontend, network, documen
         <x data-localise="__MSG_toggleAll__">Toggle All</x>
         <input type="checkbox" class="toggle-all"/>
       </div>`,
-		...redirects[frontend][network].map(x => {
-			const cloudflare = cloudflareBlackList.includes(x) ? ' <span style="color:red;">cloudflare</span>' : ""
-			const authenticate = authenticateBlackList.includes(x) ? ' <span style="color:orange;">authenticate</span>' : ""
-			const offline = offlineBlackList.includes(x) ? ' <span style="color:grey;">offline</span>' : ""
-
-			let ms = instancesLatency[x]
-			let latencyColor = ms == -1 ? "red" : ms <= 1000 ? "green" : ms <= 2000 ? "orange" : "red"
-			let latencyLimit
-			if (ms == 5000) latencyLimit = "5000ms+"
-			else if (ms > 5000) latencyLimit = `ERROR: ${ms - 5000}`
-			else if (ms == -1) latencyLimit = "Server not found"
-			else latencyLimit = ms + "ms"
-
-			const latency = x in instancesLatency ? '<span style="color:' + latencyColor + ';">' + latencyLimit + "</span>" : ""
+		...redirects[frontend][network]
+			.sort((a, b) =>
+				(cloudflareBlackList.includes(a) && !cloudflareBlackList.includes(b))
+				||
+				(authenticateBlackList.includes(a) && !authenticateBlackList.includes(b))
+			)
+			.map(x => {
+				const cloudflare = cloudflareBlackList.includes(x) ? ' <span style="color:red;">cloudflare</span>' : ""
+				const authenticate = authenticateBlackList.includes(x) ? ' <span style="color:orange;">authenticate</span>' : ""
 
-			let warnings = [cloudflare, authenticate, offline, latency].join(" ")
-			return `<div>
+				let warnings = [cloudflare, authenticate].join(" ")
+				return `<div>
                     <x><a href="${x}" target="_blank">${x}</a>${warnings}</x>
                     <input type="checkbox" class="${x}"/>
                   </div>`
-		}),
+			}),
 	].join("\n<hr>\n")
 
 	localise.localisePage()
@@ -168,7 +159,7 @@ async function processDefaultCustomInstances(service, frontend, network, documen
 				x => `<div>
                 ${x}
                 <button class="add clear-${x}">
-                  <svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+                  <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
                     <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z" />
                   </svg>
                 </button>
@@ -211,133 +202,6 @@ async function processDefaultCustomInstances(service, frontend, network, documen
 	})
 }
 
-function ping(href) {
-	return new Promise(async resolve => {
-		let average = 0
-		let time
-		for (let i = 0; i < 3; i++) {
-			time = await pingOnce(href)
-			if (i == 0) continue
-			if (time >= 5000) {
-				resolve(time)
-				return
-			}
-			average += time
-		}
-		average = parseInt(average / 3)
-		resolve(average)
-	})
-}
-
-function pingOnce(href) {
-	return new Promise(async resolve => {
-		let started
-		let http = new XMLHttpRequest()
-		http.timeout = 5000
-		http.ontimeout = () => resolve(5000)
-		http.onerror = () => resolve()
-		http.onreadystatechange = () => {
-			if (http.readyState == 2) {
-				if (http.status == 200) {
-					let ended = new Date().getTime()
-					http.abort()
-					resolve(ended - started)
-				} else {
-					resolve(5000 + http.status)
-				}
-			}
-		}
-		http.open("GET", `${href}?_=${new Date().getTime()}`, true)
-		started = new Date().getTime()
-		http.send(null)
-	})
-}
-
-async function testLatency(element, instances, frontend) {
-	return new Promise(async resolve => {
-		let myList = {}
-		let latencyThreshold, options
-		browser.storage.local.get(["options"], r => {
-			latencyThreshold = r.options.latencyThreshold
-			options = r.options
-		})
-		for (const href of instances) {
-			await ping(href).then(time => {
-				let color
-				if (time) {
-					myList[href] = time
-					if (time <= 1000) color = "green"
-					else if (time <= 2000) color = "orange"
-					else color = "red"
-
-					if (time > latencyThreshold && options[frontend].clearnet.enabled.includes(href)) {
-						options[frontend].clearnet.enabled.splice(options[frontend].clearnet.enabled.indexOf(href), 1)
-					}
-
-					let text
-					if (time == 5000) text = "5000ms+"
-					else if (time > 5000) text = `ERROR: ${time - 5000}`
-					else text = `${time}ms`
-					element.innerHTML = `${href}:&nbsp;<span style="color:${color};">${text}</span>`
-				} else {
-					myList[href] = -1
-					color = "red"
-					element.innerHTML = `${href}:&nbsp;<span style="color:${color};">Server not found</span>`
-					if (options[frontend].clearnet.enabled.includes(href)) options[frontend].clearnet.enabled.splice(options[frontend].clearnet.enabled.indexOf(href), 1)
-				}
-			})
-		}
-		browser.storage.local.set({ options })
-		resolve(myList)
-	})
-}
-
-function copyCookie(targetUrl, urls, name) {
-	return new Promise(resolve => {
-		const query = {
-			url: protocolHost(targetUrl),
-			name: name,
-		}
-		browser.cookies.getAll(query, async cookies => {
-			for (const cookie of cookies)
-				if (cookie.name == name) {
-					for (const url of urls) {
-						const setQuery = {
-							url: url,
-							name: name,
-							value: cookie.value,
-							secure: true,
-							expirationDate: cookie.expirationDate,
-						}
-						browser.cookies.set(setQuery)
-					}
-					break
-				}
-			resolve()
-		})
-	})
-}
-
-function getPreferencesFromToken(frontend, targetUrl, urls, name, endpoint) {
-	return new Promise(resolve => {
-		const http = new XMLHttpRequest()
-		const url = `${targetUrl}${endpoint}`
-		http.open("GET", url, false)
-		//http.setRequestHeader("Cookie", `${name}=${cookie.value}`)
-		http.send(null)
-		const preferences = JSON.parse(http.responseText)
-		let formdata = new FormData()
-		for (var key in preferences) formdata.append(key, preferences[key])
-		for (const url of urls) {
-			const http = new XMLHttpRequest()
-			http.open("POST", `${url}/settings/stay`, false)
-			http.send(null)
-		}
-		resolve()
-		return
-	})
-}
-
 function copyRaw(test, copyRawElement) {
 	return new Promise(resolve => {
 		browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
@@ -370,25 +234,6 @@ function copyRaw(test, copyRawElement) {
 	})
 }
 
-function unify() {
-	return new Promise(resolve => {
-		browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
-			let currTab = tabs[0]
-			if (currTab) {
-				let url
-				try {
-					url = new URL(currTab.url)
-				} catch {
-					resolve()
-					return
-				}
-
-				resolve(await servicesHelper.unifyPreferences(url, currTab.id))
-			}
-		})
-	})
-}
-
 function switchInstance(test) {
 	return new Promise(resolve => {
 		browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
@@ -412,41 +257,12 @@ function switchInstance(test) {
 	})
 }
 
-function latency(service, frontend, document, location) {
-	let latencyElement = document.getElementById(`latency-${frontend}`)
-	let latencyLabel = document.getElementById(`latency-${frontend}-label`)
-	latencyElement.addEventListener("click", async () => {
-		let reloadWindow = () => location.reload()
-		latencyElement.addEventListener("click", reloadWindow)
-		browser.storage.local.get("redirects", r => {
-			let redirects = r.redirects
-			const oldHtml = latencyLabel.innerHTML
-			latencyLabel.innerHTML = "..."
-			testLatency(latencyLabel, redirects[frontend].clearnet, frontend).then(r => {
-				const frontendLatency = r
-				browser.storage.local.get("latency", r => {
-					let latency = r.latency
-					latency[frontend] = frontendLatency
-					browser.storage.local.set({ latency })
-					latencyLabel.innerHTML = oldHtml
-					processDefaultCustomInstances(service, frontend, "clearnet", document)
-					latencyElement.removeEventListener("click", reloadWindow)
-				})
-			})
-		})
-	})
-}
-
 export default {
 	getRandomInstance,
 	updateInstances,
 	protocolHost,
 	processDefaultCustomInstances,
-	latency,
-	copyCookie,
-	getPreferencesFromToken,
 	switchInstance,
 	copyRaw,
-	unify,
 	camelCase,
 }