libredirect/src/assets/javascripts/wikipedia.js

248 lines
7.9 KiB
JavaScript

window.browser = window.browser || window.chrome
import utils from "./utils.js"
const targets = /^https?:\/{2}([a-z]+\.)*wikipedia\.org/
const frontends = new Array("wikiless")
const protocols = new Array("normal", "tor", "i2p", "loki")
let redirects = {}
for (let i = 0; i < frontends.length; i++) {
redirects[frontends[i]] = {}
for (let x = 0; x < protocols.length; x++) {
redirects[frontends[i]][protocols[x]] = []
}
}
function setRedirects(val) {
return new Promise(resolve =>
browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
redirects.wikiless = val
wikilessNormalRedirectsChecks = [...redirects.wikiless.normal]
for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
const a = wikilessNormalRedirectsChecks.indexOf(instance)
if (a > -1) wikilessNormalRedirectsChecks.splice(a, 1)
}
browser.storage.local.set(
{
wikipediaRedirects: redirects,
wikilessNormalRedirectsChecks,
wikilessTorRedirectsChecks: [...redirects.wikiless.tor],
wikilessI2pRedirectsChecks: [...redirects.wikiless.i2p],
wikilessLokiRedirectsChecks: [...redirects.wikiless.loki],
},
() => resolve()
)
})
)
}
let disableWikipedia,
wikipediaRedirects,
protocol,
protocolFallback,
wikilessNormalRedirectsChecks,
wikilessTorRedirectsChecks,
wikilessI2pRedirectsChecks,
wikilessNormalCustomRedirects,
wikilessTorCustomRedirects,
wikilessI2pCustomRedirects,
wikilessLokiCustomRedirects
function init() {
return new Promise(async resolve => {
browser.storage.local.get(
[
"disableWikipedia",
"wikipediaRedirects",
"protocol",
"protocolFallback",
"wikilessNormalRedirectsChecks",
"wikilessTorRedirectsChecks",
"wikilessI2pRedirectsChecks",
"wikilessNormalCustomRedirects",
"wikilessTorCustomRedirects",
"wikilessI2pCustomRedirects",
"wikilessLokiCustomRedirects",
],
r => {
disableWikipedia = r.disableWikipedia
wikipediaRedirects = r.wikipediaRedirects
protocol = r.protocol
protocolFallback = r.protocolFallback
wikilessNormalRedirectsChecks = r.wikilessNormalRedirectsChecks
wikilessTorRedirectsChecks = r.wikilessTorRedirectsChecks
wikilessI2pRedirectsChecks = r.wikilessI2pRedirectsChecks
wikilessNormalCustomRedirects = r.wikilessNormalCustomRedirects
wikilessTorCustomRedirects = r.wikilessTorCustomRedirects
wikilessI2pCustomRedirects = r.wikilessI2pCustomRedirects
wikilessLokiCustomRedirects = r.wikilessLokiCustomRedirects
resolve()
}
)
})
}
init()
browser.storage.onChanged.addListener(init)
function initWikilessCookies(test, from) {
return new Promise(async resolve => {
await init()
const protocolHost = utils.protocolHost(from)
const all = [
...wikilessNormalRedirectsChecks,
...wikilessNormalCustomRedirects,
...wikilessTorRedirectsChecks,
...wikilessTorCustomRedirects,
...wikilessI2pRedirectsChecks,
...wikilessI2pCustomRedirects,
...wikilessLokiCustomRedirects,
]
if (!all.includes(protocolHost)) {
resolve()
return
}
if (!test) {
let checkedInstances = []
if (protocol == "loki") checkedInstances = [...wikilessLokiCustomRedirects]
else if (protocol == "i2p") checkedInstances = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks]
else if (protocol == "tor") checkedInstances = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]
if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
checkedInstances = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]
}
await utils.copyCookie("wikiless", from, checkedInstances, "theme")
await utils.copyCookie("wikiless", from, checkedInstances, "default_lang")
}
resolve(true)
})
}
function redirect(url, disableOverride) {
if (disableWikipedia && !disableOverride) return
if (!targets.test(url.href)) return
let GETArguments = []
if (url.search.length > 0) {
let search = url.search.substring(1) //get rid of '?'
let argstrings = search.split("&")
for (let i = 0; i < argstrings.length; i++) {
let args = argstrings[i].split("=")
GETArguments.push([args[0], args[1]])
}
}
let instancesList = []
if (protocol == "loki") instancesList = [...wikilessLokiCustomRedirects]
else if (protocol == "i2p") instancesList = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks]
else if (protocol == "tor") instancesList = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]
if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
instancesList = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]
}
if (instancesList.length === 0) return
const randomInstance = utils.getRandomInstance(instancesList)
let link = `${randomInstance}${url.pathname}`
let urlSplit = url.host.split(".")
if (urlSplit[0] != "wikipedia" && urlSplit[0] != "www") {
if (urlSplit[0] == "m") GETArguments.push(["mobileaction", "toggle_view_mobile"])
else GETArguments.push(["lang", urlSplit[0]])
if (urlSplit[1] == "m") GETArguments.push(["mobileaction", "toggle_view_mobile"])
// wikiless doesn't have mobile view support yet
}
for (let i = 0; i < GETArguments.length; i++) link += (i == 0 ? "?" : "&") + GETArguments[i][0] + "=" + GETArguments[i][1]
return link
}
function switchInstance(url, disableOverride) {
return new Promise(async resolve => {
await init()
if (disableWikipedia && !disableOverride) {
resolve()
return
}
const protocolHost = utils.protocolHost(url)
const wikipediaList = [
...wikipediaRedirects.wikiless.normal,
...wikipediaRedirects.wikiless.tor,
...wikipediaRedirects.wikiless.i2p,
...wikilessNormalCustomRedirects,
...wikilessTorCustomRedirects,
...wikilessI2pCustomRedirects,
...wikilessLokiCustomRedirects,
]
if (!wikipediaList.includes(protocolHost)) {
resolve()
return
}
let instancesList = []
if (protocol == "loki") instancesList = [...wikilessLokiCustomRedirects]
else if (protocol == "i2p") instancesList = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks]
else if (protocol == "tor") instancesList = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]
if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
instancesList = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]
}
let index = instancesList.indexOf(protocolHost)
if (index > -1) instancesList.splice(index, 1)
if (instancesList.length === 0) {
resolve()
return
}
const randomInstance = utils.getRandomInstance(instancesList)
resolve(`${randomInstance}${url.pathname}${url.search}`)
})
}
function initDefaults() {
return new Promise(resolve => {
fetch("/instances/data.json")
.then(response => response.text())
.then(async data => {
let dataJson = JSON.parse(data)
for (let i = 0; i < frontends.length; i++) {
redirects[frontends[i]] = dataJson[frontends[i]]
}
browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
wikilessNormalRedirectsChecks = [...redirects.wikiless.normal]
for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
const a = wikilessNormalRedirectsChecks.indexOf(instance)
if (a > -1) wikilessNormalRedirectsChecks.splice(a, 1)
}
browser.storage.local.set(
{
disableWikipedia: true,
wikipediaRedirects: redirects,
wikilessNormalRedirectsChecks,
wikilessNormalCustomRedirects: [],
wikilessTorRedirectsChecks: [...redirects.wikiless.tor],
wikilessTorCustomRedirects: [],
wikilessI2pRedirectsChecks: [...redirects.wikiless.i2p],
wikilessI2pCustomRedirects: [],
wikilessLokiRedirectsChecks: [...redirects.wikiless.loki],
wikilessLokiCustomRedirects: [],
},
() => resolve()
)
})
})
})
}
export default {
setRedirects,
initWikilessCookies,
redirect,
initDefaults,
switchInstance,
}