Removed LatencyTest, AutoRedirect, Unify, DisableInstance

This commit is contained in:
ManeraKai 2022-12-07 10:51:43 +03:00
parent 4625aa07fe
commit f454ced949
No known key found for this signature in database
GPG Key ID: 5ABC31FFD562E337
16 changed files with 62 additions and 800 deletions

View File

@ -6,7 +6,6 @@
OpenStreetMap (OSM) reverse geocoding, done via the [OSM Nomantim API](https://nominatim.org/release-docs/develop/api/Overview/), OpenStreetMap (OSM) reverse geocoding, done via the [OSM Nomantim API](https://nominatim.org/release-docs/develop/api/Overview/),
used as part of OSM redirects, which can be disabled by toggling the OSM redirects. used as part of OSM redirects, which can be disabled by toggling the OSM redirects.
- It also connects to [this url](https://raw.githubusercontent.com/libredirect/libredirect/master/src/instances/data.json) to update the Instances List. Though this only gets triggered when the user presses the `Update Instances` button. - It also connects to [this url](https://raw.githubusercontent.com/libredirect/libredirect/master/src/instances/data.json) to update the Instances List. Though this only gets triggered when the user presses the `Update Instances` button.
- For bibliogram instances. To set a cookie you should send an HTTP request to the server as the server stores settings values itself and gives you a token to access them.
## Future Changes ## Future Changes

View File

@ -32,10 +32,8 @@ async function initDefaults() {
}, },
theme: "detect", theme: "detect",
popupServices: ["youtube", "twitter", "instagram", "tiktok", "imgur", "reddit", "quora", "translate", "maps"], popupServices: ["youtube", "twitter", "instagram", "tiktok", "imgur", "reddit", "quora", "translate", "maps"],
autoRedirect: false,
network: "clearnet", network: "clearnet",
networkFallback: true, networkFallback: true,
latencyThreshold: 1000,
}, },
}, },
() => resolve() () => resolve()

View File

@ -550,50 +550,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) { function setRedirects(passedRedirects) {
return new Promise(resolve => { return new Promise(resolve => {
fetch("/config/config.json") fetch("/config/config.json")
@ -662,7 +618,6 @@ function initDefaults() {
let targets = {} let targets = {}
let config = JSON.parse(configData) let config = JSON.parse(configData)
const localstorage = {} const localstorage = {}
const latency = {}
for (const service in config.services) { for (const service in config.services) {
options[service] = {} options[service] = {}
if (config.services[service].targets == "datajson") { if (config.services[service].targets == "datajson") {
@ -687,7 +642,7 @@ function initDefaults() {
} }
} }
} }
browser.storage.local.set({ redirects, options, targets, latency, localstorage }) browser.storage.local.set({ redirects, options, targets, localstorage })
resolve() resolve()
}) })
}) })
@ -702,7 +657,6 @@ function upgradeOptions() {
.then(configData => { .then(configData => {
browser.storage.local.get(null, r => { browser.storage.local.get(null, r => {
let options = r.options let options = r.options
let latency = {}
const config = JSON.parse(configData) const config = JSON.parse(configData)
options.exceptions = r.exceptions options.exceptions = r.exceptions
if (r.theme != "DEFAULT") options.theme = r.theme if (r.theme != "DEFAULT") options.theme = r.theme
@ -717,7 +671,6 @@ function upgradeOptions() {
options.popupServices.splice(tmp, 1) options.popupServices.splice(tmp, 1)
options.popupServices.push("sendFiles") options.popupServices.push("sendFiles")
} }
options.autoRedirect = r.autoRedirect
switch (r.onlyEmbeddedVideo) { switch (r.onlyEmbeddedVideo) {
case "onlyNotEmbedded": case "onlyNotEmbedded":
options.youtube.redirectType = "main_frame" options.youtube.redirectType = "main_frame"
@ -747,7 +700,6 @@ function upgradeOptions() {
if (r[oldService + "EmbedFrontend"] && (service != "youtube" || r[oldService + "EmbedFrontend"] == "invidious" || r[oldService + "EmbedFrontend"] == "piped")) if (r[oldService + "EmbedFrontend"] && (service != "youtube" || r[oldService + "EmbedFrontend"] == "invidious" || r[oldService + "EmbedFrontend"] == "piped"))
options[service].embedFrontend = r[oldService + "EmbedFrontend"] options[service].embedFrontend = r[oldService + "EmbedFrontend"]
for (const frontend in config.services[service].frontends) { for (const frontend in config.services[service].frontends) {
if (r[frontend + "Latency"]) latency[frontend] = r[frontend + "Latency"]
for (const network in config.networks) { for (const network in config.networks) {
let protocol let protocol
if (network == "clearnet") protocol = "normal" if (network == "clearnet") protocol = "normal"
@ -763,7 +715,7 @@ function upgradeOptions() {
} }
} }
} }
browser.storage.local.set({ options, latency }, () => resolve()) browser.storage.local.set({ options }, () => resolve())
}) })
}) })
}) })
@ -870,7 +822,6 @@ export default {
computeService, computeService,
switchInstance, switchInstance,
reverse, reverse,
unifyPreferences,
setRedirects, setRedirects,
initDefaults, initDefaults,
upgradeOptions, upgradeOptions,

View File

@ -13,7 +13,6 @@ function camelCase(str) {
let cloudflareBlackList = [] let cloudflareBlackList = []
let authenticateBlackList = [] let authenticateBlackList = []
let offlineBlackList = []
async function initBlackList() { async function initBlackList() {
return new Promise(resolve => { return new Promise(resolve => {
fetch("/instances/blacklist.json") fetch("/instances/blacklist.json")
@ -21,7 +20,6 @@ async function initBlackList() {
.then(data => { .then(data => {
cloudflareBlackList = JSON.parse(data).cloudflare cloudflareBlackList = JSON.parse(data).cloudflare
authenticateBlackList = JSON.parse(data).authenticate authenticateBlackList = JSON.parse(data).authenticate
offlineBlackList = JSON.parse(data).offline
resolve() resolve()
}) })
}) })
@ -60,7 +58,6 @@ function protocolHost(url) {
} }
async function processDefaultCustomInstances(service, frontend, network, document) { async function processDefaultCustomInstances(service, frontend, network, document) {
let instancesLatency
let frontendNetworkElement = document.getElementById(frontend).getElementsByClassName(network)[0] let frontendNetworkElement = document.getElementById(frontend).getElementsByClassName(network)[0]
let frontendCustomInstances = [] let frontendCustomInstances = []
@ -74,11 +71,10 @@ async function processDefaultCustomInstances(service, frontend, network, documen
async function getFromStorage() { async function getFromStorage() {
return new Promise(async resolve => 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 frontendDefaultRedirects = r.options[frontend][network].enabled
frontendCustomInstances = r.options[frontend][network].custom frontendCustomInstances = r.options[frontend][network].custom
options = r.options options = r.options
instancesLatency = r.latency[frontend] ?? []
redirects = r.redirects redirects = r.redirects
resolve() resolve()
}) })
@ -106,27 +102,17 @@ async function processDefaultCustomInstances(service, frontend, network, documen
<x data-localise="__MSG_toggleAll__">Toggle All</x> <x data-localise="__MSG_toggleAll__">Toggle All</x>
<input type="checkbox" class="toggle-all"/> <input type="checkbox" class="toggle-all"/>
</div>`, </div>`,
...redirects[frontend][network].map(x => { ...redirects[frontend][network]
const cloudflare = cloudflareBlackList.includes(x) ? ' <span style="color:red;">cloudflare</span>' : "" .map(x => {
const authenticate = authenticateBlackList.includes(x) ? ' <span style="color:orange;">authenticate</span>' : "" const cloudflare = cloudflareBlackList.includes(x) ? ' <span style="color:red;">cloudflare</span>' : ""
const offline = offlineBlackList.includes(x) ? ' <span style="color:grey;">offline</span>' : "" const authenticate = authenticateBlackList.includes(x) ? ' <span style="color:orange;">authenticate</span>' : ""
let ms = instancesLatency[x] let warnings = [cloudflare, authenticate].join(" ")
let latencyColor = ms == -1 ? "red" : ms <= 1000 ? "green" : ms <= 2000 ? "orange" : "red" return `<div>
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>" : ""
let warnings = [cloudflare, authenticate, offline, latency].join(" ")
return `<div>
<x><a href="${x}" target="_blank">${x}</a>${warnings}</x> <x><a href="${x}" target="_blank">${x}</a>${warnings}</x>
<input type="checkbox" class="${x}"/> <input type="checkbox" class="${x}"/>
</div>` </div>`
}), }),
].join("\n<hr>\n") ].join("\n<hr>\n")
localise.localisePage() localise.localisePage()
@ -211,133 +197,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) { function copyRaw(test, copyRawElement) {
return new Promise(resolve => { return new Promise(resolve => {
browser.tabs.query({ active: true, currentWindow: true }, async tabs => { browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
@ -370,25 +229,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) { function switchInstance(test) {
return new Promise(resolve => { return new Promise(resolve => {
browser.tabs.query({ active: true, currentWindow: true }, async tabs => { browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
@ -412,41 +252,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 { export default {
getRandomInstance, getRandomInstance,
updateInstances, updateInstances,
protocolHost, protocolHost,
processDefaultCustomInstances, processDefaultCustomInstances,
latency,
copyCookie,
getPreferencesFromToken,
switchInstance, switchInstance,
copyRaw, copyRaw,
unify,
camelCase, camelCase,
} }

View File

@ -21,14 +21,6 @@
"youtube": { "youtube": {
"frontends": { "frontends": {
"invidious": { "invidious": {
"preferences": {
"cookies": [
"PREFS"
],
"localstorage": [
"dark_mode"
]
},
"name": "Invidious", "name": "Invidious",
"embeddable": true, "embeddable": true,
"instanceList": true "instanceList": true
@ -38,29 +30,6 @@
1, 1,
2 2
], ],
"preferences": {
"localstorage": [
"bufferGoal",
"comments",
"disableLBRY",
"enabledCodecs",
"hl",
"homepage",
"instance",
"listen",
"minimizeDescription",
"playerAutoPlay",
"proxyLBRY",
"quality",
"region",
"selectedSkip",
"sponsorblock",
"theme",
"volume",
"watchHistory",
"localSubscriptions"
]
},
"name": "Piped", "name": "Piped",
"embeddable": true, "embeddable": true,
"instanceList": true "instanceList": true
@ -70,21 +39,11 @@
1, 1,
2 2
], ],
"preferences": {
"localstorage": [
"PREFERENCES"
]
},
"name": "Piped-Material", "name": "Piped-Material",
"embeddable": false, "embeddable": false,
"instanceList": true "instanceList": true
}, },
"cloudtube": { "cloudtube": {
"preferences": {
"token": "token",
"fetchEndpoint": "/api/settings",
"setEndpoint": "/settings"
},
"name": "CloudTube", "name": "CloudTube",
"embeddable": false, "embeddable": false,
"instanceList": true "instanceList": true
@ -130,30 +89,10 @@
"youtubeMusic": { "youtubeMusic": {
"frontends": { "frontends": {
"beatbump": { "beatbump": {
"preferences": {
"localstorage": [
"settings"
],
"indexeddb": "beatbump"
},
"name": "Beatbump", "name": "Beatbump",
"instanceList": true "instanceList": true
}, },
"hyperpipe": { "hyperpipe": {
"preferences": {
"localstorage": [
"api",
"authapi",
"codec",
"locale",
"next",
"pipedapi",
"quality",
"theme",
"vol"
],
"indexeddb": "hyperpipedb"
},
"name": "Hyperpipe", "name": "Hyperpipe",
"instanceList": true "instanceList": true
} }
@ -173,27 +112,6 @@
"twitter": { "twitter": {
"frontends": { "frontends": {
"nitter": { "nitter": {
"preferences": {
"cookies": [
"autoplayGifs",
"bidiSupport",
"hideBanner",
"hidePins",
"hideReplies",
"hideTweetStats",
"hlsPlayback",
"infiniteScroll",
"mp4Playback",
"muteVideos",
"proxyVideos",
"replaceInstagram",
"replaceReddit",
"replaceTwitter",
"replaceYouTube",
"squareAvatars",
"theme"
]
},
"name": "Nitter", "name": "Nitter",
"embeddable": true, "embeddable": true,
"instanceList": true "instanceList": true
@ -217,11 +135,6 @@
"instagram": { "instagram": {
"frontends": { "frontends": {
"bibliogram": { "bibliogram": {
"preferences": {
"token": "token",
"fetchEndpoint": "/settings.json",
"setEndpoint": "/applysettings"
},
"name": "Bibliogram", "name": "Bibliogram",
"instanceList": true "instanceList": true
} }
@ -240,12 +153,6 @@
"tiktok": { "tiktok": {
"frontends": { "frontends": {
"proxiTok": { "proxiTok": {
"preferences": {
"cookies": [
"api-test_endpoints",
"theme"
]
},
"name": "ProxiTok", "name": "ProxiTok",
"instanceList": true "instanceList": true
} }
@ -264,46 +171,10 @@
"reddit": { "reddit": {
"frontends": { "frontends": {
"libreddit": { "libreddit": {
"preferences": {
"cookies": [
"theme",
"front_page",
"layout",
"wide",
"post_sort",
"comment_sort",
"show_nsfw",
"autoplay_videos",
"use_hls",
"hide_hls_notification",
"subscriptions",
"filters"
]
},
"name": "Libreddit", "name": "Libreddit",
"instanceList": true "instanceList": true
}, },
"teddit": { "teddit": {
"preferences": {
"cookies": [
"collapse_child_comments",
"default_comment_sort",
"domain_instagram",
"domain_twitter",
"domain_youtube",
"flairs",
"highlight_controversial",
"nsfw_enabled",
"post_media_max_height",
"prefer_frontpage",
"show_large_gallery_images",
"show_upvoted_percentage",
"show_upvotes",
"subbed_subreddits",
"theme",
"videos_muted"
]
},
"name": "Teddit", "name": "Teddit",
"instanceList": true "instanceList": true
} }
@ -343,12 +214,6 @@
"wikipedia": { "wikipedia": {
"frontends": { "frontends": {
"wikiless": { "wikiless": {
"preferences": {
"cookies": [
"theme",
"default_lang"
]
},
"name": "Wikiless", "name": "Wikiless",
"instanceList": true "instanceList": true
} }
@ -402,11 +267,6 @@
"quora": { "quora": {
"frontends": { "frontends": {
"quetre": { "quetre": {
"preferences": {
"localstorage": [
"theme"
]
},
"name": "Quetre", "name": "Quetre",
"instanceList": true "instanceList": true
} }
@ -425,11 +285,6 @@
"imdb": { "imdb": {
"frontends": { "frontends": {
"libremdb": { "libremdb": {
"preferences": {
"localstorage": [
"theme"
]
},
"name": "libremdb", "name": "libremdb",
"instanceList": true "instanceList": true
} }
@ -500,20 +355,6 @@
"lbry": { "lbry": {
"frontends": { "frontends": {
"librarian": { "librarian": {
"preferences": {
"cookies": [
"nsfw",
"theme"
],
"localstorage": [
"autoplay",
"autoplayNextVid",
"collapseComments",
"plyr",
"sb_categories",
"showRelated"
]
},
"name": "Librarian", "name": "Librarian",
"embeddable": true, "embeddable": true,
"instanceList": true "instanceList": true
@ -542,55 +383,10 @@
"search": { "search": {
"frontends": { "frontends": {
"searx": { "searx": {
"preferences": {
"cookies": [
"advanced_search",
"autocomplete",
"categories",
"disabled_engines",
"disabled_plugins",
"doi_resolver",
"enabled_engines",
"enabled_plugins",
"image_proxy",
"language",
"locale",
"method",
"oscar-style",
"results_on_new_tab",
"safesearch",
"theme",
"tokens"
]
},
"name": "SearX", "name": "SearX",
"instanceList": true "instanceList": true
}, },
"searxng": { "searxng": {
"preferences": {
"cookies": [
"autocomplete",
"categories",
"center_alignment",
"disabled_engines",
"disabled_plugins",
"doi_resolver",
"enabled_plugins",
"enabled_engines",
"image_proxy",
"infinite_scroll",
"language",
"locale",
"maintab",
"method",
"query_in_title",
"results_on_new_tab",
"safesearch",
"simple_style",
"theme",
"tokens"
]
},
"name": "SearXNG", "name": "SearXNG",
"instanceList": true "instanceList": true
}, },
@ -599,20 +395,6 @@
"instanceList": true "instanceList": true
}, },
"librex": { "librex": {
"preferences": {
"cookies": [
"bibliogram",
"disable_frontends",
" disable_special",
"invidious",
"libreddit",
"nitter",
"proxitok",
"save",
"theme",
"wikiless"
]
},
"name": "LibreX", "name": "LibreX",
"instanceList": true "instanceList": true
} }
@ -632,26 +414,10 @@
"translate": { "translate": {
"frontends": { "frontends": {
"simplyTranslate": { "simplyTranslate": {
"preferences": {
"cookies": [
"from_lang",
"to_lang",
"tts_enabled",
"use_text_fields"
]
},
"name": "SimplyTranslate", "name": "SimplyTranslate",
"instanceList": true "instanceList": true
}, },
"lingva": { "lingva": {
"preferences": {
"localstorage": [
"isauto",
"source",
"target",
"chakra-ui-color-mode"
]
},
"name": "Lingva Translate", "name": "Lingva Translate",
"instanceList": true "instanceList": true
}, },
@ -743,9 +509,6 @@
}, },
"authenticate": { "authenticate": {
"color": "orange" "color": "orange"
},
"offline": {
"color": "grey"
} }
} }
} }

View File

@ -117,21 +117,6 @@ def is_authenticate(url):
return False return False
return False return False
def is_offline(url):
try:
r = requests.get(url, timeout=5, headers=headers)
if r.status_code >= 400:
print(url + ' is ' + Fore.RED + 'offline' + Style.RESET_ALL)
print("Status code")
print(r.status_code)
return True
else:
return False
except Exception:
return False
def fetchCache(frontend, name): def fetchCache(frontend, name):
try: try:
with open('./src/instances/data.json') as file: with open('./src/instances/data.json') as file:
@ -524,7 +509,6 @@ mightyList = idnaEncode(mightyList)
cloudflare = [] cloudflare = []
authenticate = [] authenticate = []
offline = []
for k1, v1 in mightyList.items(): for k1, v1 in mightyList.items():
if type(mightyList[k1]) is dict: if type(mightyList[k1]) is dict:
for k2, v2 in mightyList[k1].items(): for k2, v2 in mightyList[k1].items():
@ -537,15 +521,12 @@ for k1, v1 in mightyList.items():
cloudflare.append(instance) cloudflare.append(instance)
if not instance.endswith('.onion') and not instance.endswith('.i2p') and not instance.endswith('.loki') and is_authenticate(instance): if not instance.endswith('.onion') and not instance.endswith('.i2p') and not instance.endswith('.loki') and is_authenticate(instance):
authenticate.append(instance) authenticate.append(instance)
elif not instance.endswith('.onion') and not instance.endswith('.i2p') and not instance.endswith('.loki') and is_offline(instance):
offline.append(instance)
peertube() peertube()
blacklist = { blacklist = {
'cloudflare': cloudflare, 'cloudflare': cloudflare,
'authenticate': authenticate, 'authenticate': authenticate,
'offline': offline
} }
# Writing to file # Writing to file

View File

@ -19,7 +19,7 @@
"48": "assets/images/libredirect-48.png", "48": "assets/images/libredirect-48.png",
"128": "assets/images/libredirect-128.png" "128": "assets/images/libredirect-128.png"
}, },
"permissions": ["webRequest", "webRequestBlocking", "storage", "unlimitedStorage", "cookies", "clipboardWrite", "contextMenus", "<all_urls>"], "permissions": ["webRequest", "webRequestBlocking", "storage", "unlimitedStorage", "clipboardWrite", "contextMenus", "<all_urls>"],
"browser_action": { "browser_action": {
"default_title": "__MSG_extensionName__", "default_title": "__MSG_extensionName__",
"browser_style": false, "browser_style": false,
@ -58,12 +58,6 @@
"default": "Alt+Shift+C" "default": "Alt+Shift+C"
}, },
"description": "Copies the original link. Ex: Copies the original twitter link while in the nitter website" "description": "Copies the original link. Ex: Copies the original twitter link while in the nitter website"
},
"unify": {
"suggested_key": {
"default": "Alt+Shift+U"
},
"description": "Copies the preferences (cookies, localStorage) from the current opened instance and copy them to all the other selected instances"
} }
}, },
"default_locale": "en", "default_locale": "en",

View File

@ -89,47 +89,9 @@ browser.tabs.onRemoved.addListener(tabId => {
} }
}) })
async function redirectOfflineInstance(url, tabId) {
let newUrl = await servicesHelper.switchInstance(url, true)
if (newUrl) {
if (counter >= 5) {
browser.tabs.update(tabId, {
url: `/pages/errors/instance_offline.html?url=${encodeURIComponent(newUrl)}`,
})
counter = 0
} else {
browser.tabs.update(tabId, { url: newUrl })
counter++
}
}
}
let counter = 0
function isAutoRedirect() {
return new Promise(resolve => browser.storage.local.get("options", r => resolve(r.options.autoRedirect == true)))
}
browser.webRequest.onResponseStarted.addListener(
async details => {
if (!(await isAutoRedirect())) return null
if (details.type == "main_frame" && details.statusCode >= 500) redirectOfflineInstance(new URL(details.url), details.tabId)
},
{ urls: ["<all_urls>"] }
)
browser.webRequest.onErrorOccurred.addListener(
async details => {
if (!(await isAutoRedirect())) return
if (details.type == "main_frame") redirectOfflineInstance(new URL(details.url), details.tabId)
},
{ urls: ["<all_urls>"] }
)
browser.commands.onCommand.addListener(command => { browser.commands.onCommand.addListener(command => {
if (command === "switchInstance") utils.switchInstance() if (command === "switchInstance") utils.switchInstance()
else if (command == "copyRaw") utils.copyRaw() else if (command == "copyRaw") utils.copyRaw()
else if (command == "unify") utils.unify()
}) })
browser.contextMenus.create({ browser.contextMenus.create({
@ -150,12 +112,6 @@ browser.contextMenus.create({
contexts: ["browser_action"], contexts: ["browser_action"],
}) })
browser.contextMenus.create({
id: "unify",
title: browser.i18n.getMessage("unifySettings"),
contexts: ["browser_action"],
})
try { try {
browser.contextMenus.create({ browser.contextMenus.create({
id: "toggleTab", id: "toggleTab",
@ -207,10 +163,6 @@ browser.contextMenus.onClicked.addListener((info, tab) => {
utils.copyRaw() utils.copyRaw()
resolve() resolve()
return return
case "unify":
utils.unify()
resolve()
return
case "toggleTab": case "toggleTab":
if (tabIdRedirects[tab.id] != undefined) { if (tabIdRedirects[tab.id] != undefined) {
tabIdRedirects[tab.id] = !tabIdRedirects[tab.id] tabIdRedirects[tab.id] = !tabIdRedirects[tab.id]
@ -253,9 +205,4 @@ browser.webRequest.onHeadersReceived.addListener(
}, },
{ urls: ["<all_urls>"] }, { urls: ["<all_urls>"] },
["blocking", "responseHeaders"] ["blocking", "responseHeaders"]
) )
browser.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.function === "unify") utils.unify(false).then(r => sendResponse({ response: r }))
return true
})

View File

@ -1,39 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title data-localise="__MSG_instanceIsOff__">Instance is offline</title>
<link href="../stylesheets/styles.css" rel="stylesheet" />
<style>
body {
margin: 0;
padding: 0;
height: 100vh;
width: 100vw;
flex-wrap: wrap;
justify-content: center;
align-items: center;
font-size: 30px;
display: flex;
}
div {
text-align: center;
}
</style>
</head>
<body>
<div>
<p id="message">
<span data-localise="__MSG_instanceOffline__">This instance is offline, you'll be redirected after</span>
<span id="number">2</span> <x data-localise="__MSG_sec__">seconds</x>
</p>
<button id="cancel" data-localise="__MSG_cancel__">Cancel</button>
</div>
<script src="instance_offline.js" type="module"></script>
</body>
</html>

View File

@ -1,20 +0,0 @@
import localise from "../../assets/javascripts/localise.js"
const params = new Proxy(new URLSearchParams(window.location.search), {
get: (searchParams, prop) => searchParams.get(prop),
})
let number = document.getElementById("number")
setTimeout(() => (number.innerHTML = "1"), 1000)
setTimeout(() => {
number.innerHTML = "0"
if (!isCanceled) window.location = params.url
}, 2000)
let isCanceled = false
document.getElementById("cancel").addEventListener("click", () => {
isCanceled = true
document.getElementById("message").innerHTML = browser.i18n.getMessage("redirectionCanceled")
})
localise.localisePage()

View File

@ -13,37 +13,6 @@
</select> </select>
</div> </div>
<div class="some-block option-block">
<h4 data-localise="__MSG_network__">Network</h4>
<select id="network">
<% for (const network in config.networks) { -%>
<option value="<%= network %>"><%= config.networks[network].name %></option>
<% }; %>
</select>
</div>
<div id="network-fallback">
<div class="some-block option-block">
<h4 data-localise="__MSG_networkFallback__">Fallback to clearnet if no instances are available for the current network</h4>
<input id="network-fallback-checkbox" type="checkbox" />
</div>
</div>
<div class="some-block option-block">
<h4 data-localise="__MSG_autoRedirect__"></h4>
<input id="auto-redirect" type="checkbox" />
</div>
<form>
<div class="some-block option-block">
<h4 data-localise="__MSG_latencyThreshold">Latency Threshold</h4>
<output id="latency-output" for="latencyInput" name="latencyOutput"></output>
<input id="latency-input" type="range" min="50" max="5000" value="1000" name="latencyInput" step="50" />
</div>
</form>
<hr>
<div class="some-block option-block"> <div class="some-block option-block">
<h4 data-localise="__MSG_exclude_from_redirecting_">Excluded from redirecting</h4> <h4 data-localise="__MSG_exclude_from_redirecting_">Excluded from redirecting</h4>
</div> </div>

View File

@ -121,37 +121,12 @@ resetSettings.addEventListener("click", async () => {
}) })
}) })
let autoRedirectElement = document.getElementById("auto-redirect")
autoRedirectElement.addEventListener("change", event => {
setOption("autoRedirect", "checkbox", event)
})
let themeElement = document.getElementById("theme") let themeElement = document.getElementById("theme")
themeElement.addEventListener("change", event => { themeElement.addEventListener("change", event => {
setOption("theme", "select", event) setOption("theme", "select", event)
location.reload() location.reload()
}) })
let networkElement = document.getElementById("network")
networkElement.addEventListener("change", event => {
setOption("network", "select", event)
location.reload()
})
let networkFallbackCheckbox = document.getElementById("network-fallback-checkbox")
networkFallbackCheckbox.addEventListener("change", event => {
setOption("networkFallback", "checkbox", event)
})
let latencyOutput = document.getElementById("latency-output")
let latencyInput = document.getElementById("latency-input")
latencyInput.addEventListener("change", event => {
setOption("latencyThreshold", "range", event)
})
latencyInput.addEventListener("input", event => {
latencyOutput.value = event.target.value
})
let nameCustomInstanceInput = document.getElementById("exceptions-custom-instance") let nameCustomInstanceInput = document.getElementById("exceptions-custom-instance")
let instanceTypeElement = document.getElementById("exceptions-custom-instance-type") let instanceTypeElement = document.getElementById("exceptions-custom-instance-type")
let instanceType = "url" let instanceType = "url"
@ -173,20 +148,9 @@ for (const service in config.services) {
} }
browser.storage.local.get("options", r => { browser.storage.local.get("options", r => {
autoRedirectElement.checked = r.options.autoRedirect
themeElement.value = r.options.theme themeElement.value = r.options.theme
networkElement.value = r.options.network
networkFallbackCheckbox.checked = r.options.networkFallback
latencyOutput.value = r.options.latencyThreshold
let options = r.options let options = r.options
//let networkFallbackElement = document.getElementById("network-fallback")
if (networkElement.value == "clearnet") {
networkFallbackCheckbox.disabled = true
} else {
networkFallbackCheckbox.disabled = false
}
instanceTypeElement.addEventListener("change", event => { instanceTypeElement.addEventListener("change", event => {
instanceType = event.target.options[instanceTypeElement.selectedIndex].value instanceType = event.target.options[instanceTypeElement.selectedIndex].value
if (instanceType == "url") { if (instanceType == "url") {

View File

@ -44,16 +44,6 @@
<% for (const frontend in config.services[service].frontends) { -%> <% if (config.services[service].frontends[frontend].instanceList) { _%> <% for (const frontend in config.services[service].frontends) { -%> <% if (config.services[service].frontends[frontend].instanceList) { _%>
<div id="<%= frontend %>"> <div id="<%= frontend %>">
<% for (const network in config.networks) { -%> <% for (const network in config.networks) { -%>
<div class="buttons buttons-inline">
<label class="button button-inline" id="latency-<%= frontend %>-label" for="latency-<%= frontend %>">
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
<path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
</svg>
&nbsp;
<x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
</label>
<input class="button button-inline" id="latency-<%= frontend %>" style="display: none" />
</div>
<div class="<%= network %>"> <div class="<%= network %>">
<div class="some-block option-block"> <div class="some-block option-block">
<h4 data-localise="__MSG_defaultInstances__">Default Instances</h4> <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>

View File

@ -108,7 +108,6 @@ for (const service in config.services) {
for (const network in config.networks) { for (const network in config.networks) {
utils.processDefaultCustomInstances(service, frontend, network, document) utils.processDefaultCustomInstances(service, frontend, network, document)
} }
utils.latency(service, frontend, document, location)
} }
} }
} }

View File

@ -1,55 +1,53 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head>
<meta charset="utf-8"> <head>
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta charset="utf-8">
<link href="../stylesheets/styles.css" rel="stylesheet"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link href="./style.css" rel="stylesheet"> <link href="../stylesheets/styles.css" rel="stylesheet">
</head> <link href="./style.css" rel="stylesheet">
<body dir="auto"> </head>
<div class="current_site">
<div class="some-block" id="instance-div"><a class="title prevent"> <body dir="auto">
<%- include('src/assets/images/instance-icon.svg', {services: services}) -%> <div class="current_site">
<h4 id="instance"></h4> <%- include('src/pages/widgets/switches', {services: services}) -%>
</a> <div id="current_site_divider">
<span id="end"><input type="checkbox" id="instance-enabled"/></span> <hr>
</div>
<%- include('src/pages/widgets/switches', {services: services}) -%>
<div id="current_site_divider">
<hr>
</div>
</div> </div>
<div class="all_sites"> </div>
<%- include('src/pages/widgets/switches', {services: services}) -%> <div class="all_sites">
</div> <%- include('src/pages/widgets/switches', {services: services}) -%>
<hr> </div>
<div class="some-block" id="change_instance_div"><a class="title button prevent" id="change_instance"> <hr>
<h4 data-localise="__MSG_switchInstance__">Change Instance</h4> <div class="some-block" id="change_instance_div">
<svg xmlns="http://www.w3.org/2000/svg" height="26px" viewBox="0 0 24 24" width="26px" fill="currentColor"> <a class="title button prevent" id="change_instance">
<path d="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z"></path> <h4 data-localise="__MSG_switchInstance__">Change Instance</h4>
</svg></a></div> <svg xmlns="http://www.w3.org/2000/svg" height="26px" viewBox="0 0 24 24" width="26px" fill="currentColor">
<div class="some-block" id="copy_raw_div" title="Copy the original redirected link"> <a class="title button prevent" id="copy_raw"> <path d="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z"></path>
<h4 data-localise="__MSG_copyRaw__">Copy Raw</h4> </svg>
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor"> </a>
<path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"></path> </div>
</svg></a></div> <div class="some-block" id="copy_raw_div" title="Copy the original redirected link"> <a class="title button prevent" id="copy_raw">
<div class="some-block" id="unify_div" title="Unify preferences across all selected instances"><a class="title button prevent" id="unify"> <h4 data-localise="__MSG_copyRaw__">Copy Raw</h4>
<h4 data-localise="__MSG_unifySettings__">Unify Settings</h4> <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor"> <path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"></path>
<path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"></path> </svg>
</svg></a></div> </a></div>
<div class="some-block"><a class="title button prevent" id="more-options"> <div class="some-block"><a class="title button prevent" id="more-options">
<h4 data-localise="__MSG_settings__">Settings</h4> <h4 data-localise="__MSG_settings__">Settings</h4>
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="26px" viewBox="0 0 24 24" width="26px" fill="currentColor"> <svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="26px" viewBox="0 0 24 24" width="26px" fill="currentColor">
<path d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z"></path> <path d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z"></path>
</svg></a></div> </svg>
<div class="some-block"><a class="title button" id="about" href="/pages/options/index.html#about"> </a></div>
<h4 data-localise="__MSG_about__">About</h4> <div class="some-block"><a class="title button" id="about" href="/pages/options/index.html#about">
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" fill="currentColor"> <h4 data-localise="__MSG_about__">About</h4>
<path d="M11 17h2v-6h-2Zm1-8q.425 0 .713-.288Q13 8.425 13 8t-.287-.713Q12.425 7 12 7t-.712.287Q11 7.575 11 8t.288.712Q11.575 9 12 9Zm0 13q-2.075 0-3.9-.788-1.825-.787-3.175-2.137-1.35-1.35-2.137-3.175Q2 14.075 2 12t.788-3.9q.787-1.825 2.137-3.175 1.35-1.35 3.175-2.138Q9.925 2 12 2t3.9.787q1.825.788 3.175 2.138 1.35 1.35 2.137 3.175Q22 9.925 22 12t-.788 3.9q-.787 1.825-2.137 3.175-1.35 1.35-3.175 2.137Q14.075 22 12 22Zm0-2q3.35 0 5.675-2.325Q20 15.35 20 12q0-3.35-2.325-5.675Q15.35 4 12 4 8.65 4 6.325 6.325 4 8.65 4 12q0 3a.35 2.325 5.675Q8.65 20 12 20Zm0-8Z"></path> <svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" fill="currentColor">
</svg></a></div> <path d="M11 17h2v-6h-2Zm1-8q.425 0 .713-.288Q13 8.425 13 8t-.287-.713Q12.425 7 12 7t-.712.287Q11 7.575 11 8t.288.712Q11.575 9 12 9Zm0 13q-2.075 0-3.9-.788-1.825-.787-3.175-2.137-1.35-1.35-2.137-3.175Q2 14.075 2 12t.788-3.9q.787-1.825 2.137-3.175 1.35-1.35 3.175-2.138Q9.925 2 12 2t3.9.787q1.825.788 3.175 2.138 1.35 1.35 2.137 3.175Q22 9.925 22 12t-.788 3.9q-.787 1.825-2.137 3.175-1.35 1.35-3.175 2.137Q14.075 22 12 22Zm0-2q3.35 0 5.675-2.325Q20 15.35 20 12q0-3.35-2.325-5.675Q15.35 4 12 4 8.65 4 6.325 6.325 4 8.65 4 12q0 3a.35 2.325 5.675Q8.65 20 12 20Zm0-8Z"></path>
<div class="space"></div> </svg>
<script type="module" src="../options/init.js"></script> </a></div>
<script type="module" src="./popup.js"></script> <div class="space"></div>
</body> <script type="module" src="../options/init.js"></script>
</html> <script type="module" src="./popup.js"></script>
</body>
</html>

View File

@ -39,7 +39,6 @@ const currSite = document.getElementsByClassName("current_site")[0]
function setDivs() { function setDivs() {
return new Promise(resolve => { return new Promise(resolve => {
divs.instance = document.getElementById("instance")
for (const service in config.services) { for (const service in config.services) {
divs[service] = {} divs[service] = {}
divs[service].toggle = {} divs[service].toggle = {}
@ -58,7 +57,6 @@ const currentSiteIsFrontend = document.getElementById("current_site_divider")
browser.storage.local.get(["options", "redirects"], r => { browser.storage.local.get(["options", "redirects"], r => {
browser.tabs.query({ active: true, currentWindow: true }, async tabs => { browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
document.getElementById("instance-div").classList.add("hide")
for (const service in config.services) { for (const service in config.services) {
if (!r.options.popupServices.includes(service)) allSites.getElementsByClassName(service)[0].classList.add("hide") if (!r.options.popupServices.includes(service)) allSites.getElementsByClassName(service)[0].classList.add("hide")
else allSites.getElementsByClassName(service)[0].classList.remove("hide") else allSites.getElementsByClassName(service)[0].classList.remove("hide")
@ -75,7 +73,6 @@ browser.storage.local.get(["options", "redirects"], r => {
url = new URL(tabs[0].url) url = new URL(tabs[0].url)
} catch { } catch {
currentSiteIsFrontend.classList.add("hide") currentSiteIsFrontend.classList.add("hide")
document.getElementById("unify_div").style.display = "none"
return return
} }
@ -89,51 +86,11 @@ browser.storage.local.get(["options", "redirects"], r => {
service = service[0] service = service[0]
let isCustom = false let isCustom = false
for (const network in config.networks) if (r.options[frontend][network].custom.indexOf(instance) > -1) isCustom = true for (const network in config.networks) if (r.options[frontend][network].custom.indexOf(instance) > -1) isCustom = true
if (!isCustom) {
divs.instance.innerHTML = instance.replace(/https?:\/{2}/, "")
let tmp
let instanceNetwork
for (const network in config.networks) {
tmp = r.redirects[frontend][network].indexOf(instance)
if (tmp > -1) {
const instanceDiv = document.getElementById("instance-enabled")
tmp = r.options[frontend][network].enabled.indexOf(instance)
if (tmp > -1) instanceDiv.checked = true
else instanceDiv.checked = false
instanceNetwork = network
instanceDiv.addEventListener("change", () => {
browser.storage.local.get("options", r => {
// Although options would be available in this context, it is fetched again to make sure it is up to date
let options = r.options
if (instanceDiv.checked) options[frontend][instanceNetwork].enabled.push(instance)
else options[frontend][instanceNetwork].enabled.splice(options[frontend][instanceNetwork].enabled.indexOf(instance), 1)
browser.storage.local.set({ options })
})
})
break
}
}
document.getElementById("instance-div").classList.remove("hide")
}
} }
divs[service].current.classList.remove("hide") divs[service].current.classList.remove("hide")
divs[service].all.classList.add("hide") divs[service].all.classList.add("hide")
if (frontend && config.services[service].frontends[frontend].preferences && !config.services[service].frontends[frontend].preferences.token) {
const unify = document.getElementById("unify")
const textElement = document.getElementById("unify").getElementsByTagName("h4")[0]
unify.addEventListener("click", () => {
const oldHtml = textElement.innerHTML
textElement.innerHTML = "..."
browser.runtime.sendMessage({ function: "unify" }, response => {
if (response && response.response) textElement.innerHTML = oldHtml
})
})
} else {
document.getElementById("unify_div").style.display = "none"
}
} else { } else {
currentSiteIsFrontend.classList.add("hide") currentSiteIsFrontend.classList.add("hide")
document.getElementById("unify_div").style.display = "none"
} }
}) })
}) })