Fixed bugs

This commit is contained in:
ManeraKai 2023-01-22 20:44:36 +03:00
parent e460261c67
commit 610d2da761
7 changed files with 181 additions and 175 deletions

View File

@ -67,7 +67,7 @@ npm update
npm install
```
Generate the HTML pages:
Generate the HTML pages (you should install [pug-cli](https://www.npmjs.com/package/pug-cli) first globally):
```
npm run pug
@ -87,24 +87,23 @@ npm run start
### Install temporarily
1. open `about:addons`
2. type in the address bar `about:debugging`
3. press `load temporarily addon`
1. Type in the address bar: `about:debugging#/runtime/this-firefox`
3. Press `Load Temporary Add-on...`
### Install in Firefox ESR, Developer Edition, Nightly
1. open `about:config`
2. set `xpinstall.signatures.required` to `false`
3. open `about:addons`
4. click on the gear shaped `settings` button and select `Install Add-on From File...`
5. select `libredirect-VERSION.zip` from `web-ext-artifacts` folder
1. Type in the address bar: `about:config`
2. Set `xpinstall.signatures.required` to `false`
3. Type in the address bar: `about:addons`
4. Click on the gear shaped `settings` button and select `Install Add-on From File...`
5. Select `libredirect-VERSION.zip` from `web-ext-artifacts` folder
### Install in Chromium browsers
1. open `chrome://extensions`
2. enable `dev mode`
3. select `load unpacked extension`
4. select `src` folder
1. Open `chrome://extensions`
2. Enable `dev mode`
3. Select `load unpacked extension`
4. Select `src` folder
---

View File

@ -7,7 +7,7 @@ window.browser = window.browser || window.chrome
let exceptions
function isException(url) {
for (const item of exceptions.url) if (item == `${url.protocol}//${url.host}`) return true
for (const item of exceptions.url) if (item == url.href) return true
for (const item of exceptions.regex) if (new RegExp(item).test(url.href)) return true
return false
}

View File

@ -31,10 +31,11 @@ function all(service, frontend, options, config) {
function regexArray(service, url, config, frontend) {
let targetList = config.services[service].targets
if (frontend && config.services[service].frontends[frontend].excludeTargets)
for (const i in config.services[service].frontends[frontend].excludeTargets) {
targetList = targetList.splice(i, 1)
}
if (frontend && config.services[service].frontends[frontend].excludeTargets) {
targetList = targetList.filter(val =>
!config.services[service].frontends[frontend].excludeTargets.includes(targetList.indexOf(val))
)
}
for (const targetString in targetList) {
const target = new RegExp(targetList[targetString])
if (target.test(url.href)) return true
@ -42,7 +43,7 @@ function regexArray(service, url, config, frontend) {
return false
}
function redirect(url, type, initiator, forceRedirection, tabId) {
function redirect(url, type, initiator, forceRedirection) {
if (type != "main_frame" && type != "sub_frame" && type != "image") return
let randomInstance
let frontend
@ -62,6 +63,8 @@ function redirect(url, type, initiator, forceRedirection, tabId) {
for (const network in options[frontend]) {
instanceList.push(...options[frontend])
}
console.log(frontend, instanceList)
if (instanceList.length === 0) return
randomInstance = utils.getRandomInstance(instanceList)
@ -396,9 +399,11 @@ function computeService(url, returnFrontend) {
return
} else {
for (const frontend in config.services[service].frontends) {
if (all(service, frontend, options, config).includes(utils.protocolHost(url))) {
if (returnFrontend) resolve([service, frontend, utils.protocolHost(url)])
else resolve(service)
if (all(service, frontend, options, config).some(val => val.includes(utils.protocolHost(url)))) {
if (returnFrontend)
resolve([service, frontend, utils.protocolHost(url)])
else
resolve(service)
return
}
}
@ -413,36 +418,30 @@ function _switchInstance(url) {
await init()
const protocolHost = utils.protocolHost(url)
for (const service in config.services) {
if (!all(service, null, options, config).includes(protocolHost)) continue
if (!all(service, undefined, options, config).some(val => val.includes(protocolHost))) continue
let instancesList = []
if (Object.keys(config.services[service].frontends).length == 1) {
const frontend = Object.keys(config.services[service].frontends)[0]
for (const network in options[frontend]) {
instancesList.push(...options[frontend])
}
} else {
const frontend = options[service].frontend
for (const network in options[frontend]) {
instancesList.push(...options[frontend])
}
}
let frontend
if (!options[service].frontend)
frontend = Object.keys(config.services[service].frontends)[0]
else
frontend = options[service].frontend
instancesList = [...options[frontend]]
let oldInstance
const i = instancesList.indexOf(protocolHost)
if (i > -1) {
oldInstance = instancesList[i]
instancesList.splice(i, 1)
}
if (instancesList.length === 0) {
resolve()
return
}
console.log(instancesList)
const randomInstance = utils.getRandomInstance(instancesList)
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))
const newUrl = `${randomInstance}${url.pathname}${url.search}`
resolve(newUrl)
return
}
resolve()
@ -452,11 +451,12 @@ function _switchInstance(url) {
function reverse(url, urlString) {
return new Promise(async resolve => {
await init()
url = new URL(url)
let protocolHost
if (!urlString) protocolHost = utils.protocolHost(url)
else protocolHost = url.match(/^https?:\/{2}/)[0]
protocolHost = utils.protocolHost(url)
for (const service in config.services) {
if (!all(service, null, options, config).includes(protocolHost)) continue
if (!all(service, undefined, options, config).some(val => val.includes(protocolHost))) continue
switch (service) {
case "youtube":
@ -468,6 +468,8 @@ function reverse(url, urlString) {
case "imdb":
case "quora":
case "medium":
resolve(config.services[service].url + url.pathname + url.search)
return
case "fandom":
let regex = url.pathname.match(/^\/([a-zA-Z0-9-]+)\/wiki\/([a-zA-Z0-9-]+)/)
if (regex) {
@ -482,6 +484,7 @@ function reverse(url, urlString) {
}
}
resolve()
return
})
}
@ -508,6 +511,30 @@ function initDefaults() {
options['theme'] = "detect"
options['popupServices'] = ["youtube", "twitter", "tiktok", "imgur", "reddit", "quora", "translate", "maps"]
options['invidious'] = ['https://inv.vern.cc/']
options['piped'] = ['https://piped.video']
options['pipedMaterial'] = ['https://piped-material.xn--17b.net']
options['cloudtube'] = ['https://tube.cadence.moe']
options['proxitok'] = ['https://proxitok.pabloferreiro.es']
options['send'] = ['https://send.vis.ee']
options['nitter'] = ['https://nitter.net']
options['libreddit'] = ['https://libreddit.spike.codes']
options['teddit'] = ['https://teddit.net']
options['scribe'] = ['https://scribe.rip']
options['quetre'] = ['https://quetre.iket.me']
options['libremdb'] = ['https://libremdb.iket.me']
options['simplytranslate'] = ['https://simplytranslate.org']
options['linvgatranslate'] = ['https://lingva.ml']
options['searxng'] = ['https://sx.vern.cc/']
options['rimgo'] = ['https://rimgo.vern.cc']
options['librarian'] = ['https://lbry.vern.cc']
options['beatbump'] = ['https://beatbump.ml']
options['hyperpipe'] = ['https://hyperpipe.surge.sh']
options['facil'] = [' https://facilmap.org ']
options['osm'] = ['https://www.openstreetmap.org']
options['breezeWiki'] = ['https://breezewiki.com']
browser.storage.local.set({ options },
() => resolve()
)
@ -663,7 +690,7 @@ function copyRaw(test, copyRawElement) {
})
}
function switchInstance(test) {
function switchInstance() {
return new Promise(resolve => {
browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
let currTab = tabs[0]
@ -676,11 +703,7 @@ function switchInstance(test) {
return
}
const newUrl = await _switchInstance(url)
if (newUrl) {
if (!test) browser.tabs.update({ url: newUrl })
resolve(true)
} else resolve()
resolve(newUrl)
}
})
})

View File

@ -28,8 +28,8 @@
},
"piped": {
"excludeTargets": [
1,
2
2,
3
],
"name": "Piped",
"embeddable": true,
@ -38,8 +38,8 @@
},
"pipedMaterial": {
"excludeTargets": [
1,
2
2,
3
],
"name": "Piped-Material",
"embeddable": false,
@ -54,8 +54,8 @@
},
"freetube": {
"excludeTargets": [
1,
2
2,
3
],
"name": "FreeTube",
"embeddable": false,
@ -64,8 +64,8 @@
},
"yattee": {
"excludeTargets": [
1,
2
2,
3
],
"name": "Yattee",
"embeddable": false,

View File

@ -18,8 +18,8 @@ browser.runtime.onInstalled.addListener(async details => {
await servicesHelper.upgradeOptions()
// await servicesHelper.processUpdate()
}
browser.runtime.openOptionsPage()
}
browser.runtime.openOptionsPage()
})
let tabIdRedirects = {}
@ -41,7 +41,12 @@ browser.webRequest.onBeforeRequest.addListener(
if (details.frameAncestors && details.frameAncestors.length > 0 && generalHelper.isException(new URL(details.frameAncestors[0].url))) newUrl = null
if (generalHelper.isException(url)) newUrl = "BYPASSTAB"
if (generalHelper.isException(url)) {
if (details.type == "main_frame")
newUrl = "BYPASSTAB"
else
return null
}
if (newUrl) {
if (newUrl === "CANCEL") {
@ -69,8 +74,11 @@ browser.tabs.onRemoved.addListener(tabId => {
}
})
browser.commands.onCommand.addListener(command => {
if (command === "switchInstance") servicesHelper.switchInstance()
browser.commands.onCommand.addListener(async command => {
if (command === "switchInstance") {
const newUrl = await servicesHelper.switchInstance()
if (newUrl) browser.tabs.update({ url: newUrl })
}
else if (command == "copyRaw") servicesHelper.copyRaw()
})
@ -92,72 +100,43 @@ browser.contextMenus.create({
contexts: ["browser_action"],
})
browser.contextMenus.create({
id: "redirectToOriginal",
title: 'Redirect to original',
contexts: ["browser_action"],
})
browser.contextMenus.create({
id: "redirectLink",
title: browser.i18n.getMessage("redirectLink"),
contexts: ["link"],
})
function handleToggleTab(tab) {
return new Promise(async resolve => {
switch (tabIdRedirects[tab.id]) {
case false:
const newUrl = await servicesHelper.reverse(tab.url, true)
if (newUrl) browser.tabs.update(tab.id, { url: newUrl })
resolve()
return
case true:
browser.tabs.reload(tab.id)
resolve()
return
}
})
}
browser.contextMenus.onClicked.addListener((info, tab) => {
return new Promise(async resolve => {
switch (info.menuItemId) {
case "switchInstance":
servicesHelper.switchInstance()
resolve()
return
case "settings":
browser.runtime.openOptionsPage()
resolve()
return
case "copyRaw":
servicesHelper.copyRaw()
resolve()
return
case "toggleTab":
if (tabIdRedirects[tab.id] != undefined) {
tabIdRedirects[tab.id] = !tabIdRedirects[tab.id]
await handleToggleTab(tab)
resolve()
return
} else {
const url = new URL(tab.url)
const service = await servicesHelper.computeService(url)
if (service) {
if ((await utils.getOptions())[service].enabled) tabIdRedirects[tab.id] = false
else tabIdRedirects[tab.id] = true
await handleToggleTab(tab)
resolve()
return
} else {
tabIdRedirects[tab.id] = false
await handleToggleTab(tab)
resolve()
return
}
}
case "redirectLink":
const tmpUrl = new URL(info.linkUrl)
const newUrl = servicesHelper.redirect(tmpUrl, "main_frame", null, true)
if (newUrl) browser.tabs.create({ url: newUrl })
resolve()
return
if (info.menuItemId == 'switchInstance') {
servicesHelper.switchInstance()
}
else if (info.menuItemId == 'settings') {
browser.runtime.openOptionsPage()
}
else if (info.menuItemId == 'copyRaw') {
servicesHelper.copyRaw()
}
else if (info.menuItemId == 'redirectToOriginal') {
const newUrl = await servicesHelper.reverse(tab.url)
if (newUrl) {
tabIdRedirects[tab.id] = false
browser.tabs.update(tab.id, { url: newUrl })
}
}
else if (info.menuItemId == 'redirectLink') {
const url = new URL(info.linkUrl)
const newUrl = servicesHelper.redirect(url, "main_frame", null, true)
if (newUrl) browser.tabs.create({ url: newUrl })
}
resolve()
return
})
})

View File

@ -95,25 +95,27 @@ for (const service in config.services) {
})
}
!async function () {
const options = await utils.getOptions()
themeElement.value = options.theme
instanceTypeElement.addEventListener("change", event => {
instanceType = event.target.options[instanceTypeElement.selectedIndex].value
if (instanceType == "url") {
nameCustomInstanceInput.setAttribute("type", "url")
nameCustomInstanceInput.setAttribute("placeholder", "https://www.google.com")
} else if (instanceType == "regex") {
nameCustomInstanceInput.setAttribute("type", "text")
nameCustomInstanceInput.setAttribute("placeholder", "https?://(www.|)youtube.com/")
}
})
let exceptionsCustomInstances = options.exceptions
function calcExceptionsCustomInstances() {
document.getElementById("exceptions-custom-checklist").innerHTML = [...exceptionsCustomInstances.url, ...exceptionsCustomInstances.regex]
.map(
x => `<div>
let options = await utils.getOptions()
themeElement.value = options.theme
for (const service in config.services) document.getElementById(service).checked = options.popupServices.includes(service)
instanceTypeElement.addEventListener("change", event => {
instanceType = event.target.options[instanceTypeElement.selectedIndex].value
if (instanceType == "url") {
nameCustomInstanceInput.setAttribute("type", "url")
nameCustomInstanceInput.setAttribute("placeholder", "https://www.google.com")
} else if (instanceType == "regex") {
nameCustomInstanceInput.setAttribute("type", "text")
nameCustomInstanceInput.setAttribute("placeholder", "https?://(www.|)youtube.com/")
}
})
let exceptionsCustomInstances = options.exceptions
function calcExceptionsCustomInstances() {
document.getElementById("exceptions-custom-checklist").innerHTML = [...exceptionsCustomInstances.url, ...exceptionsCustomInstances.regex]
.map(
x => `<div>
${x}
<button class="add" id="clear-${x}">
<svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px"
@ -123,46 +125,47 @@ for (const service in config.services) {
</button>
</div>
<hr>`
)
.join("\n")
)
.join("\n")
for (const x of [...exceptionsCustomInstances.url, ...exceptionsCustomInstances.regex]) {
document.getElementById(`clear-${x}`).addEventListener("click", () => {
let index
index = exceptionsCustomInstances.url.indexOf(x)
if (index > -1) exceptionsCustomInstances.url.splice(index, 1)
else {
index = exceptionsCustomInstances.regex.indexOf(x)
if (index > -1) exceptionsCustomInstances.regex.splice(index, 1)
}
options.exceptions = exceptionsCustomInstances
browser.storage.local.set({ options })
calcExceptionsCustomInstances()
})
}
}
calcExceptionsCustomInstances()
document.getElementById("custom-exceptions-instance-form").addEventListener("submit", event => {
event.preventDefault()
let val
if (instanceType == "url") {
if (nameCustomInstanceInput.validity.valid) {
let url = new URL(nameCustomInstanceInput.value)
val = `${url.protocol}//${url.host}`
if (!exceptionsCustomInstances.url.includes(val)) exceptionsCustomInstances.url.push(val)
for (const x of [...exceptionsCustomInstances.url, ...exceptionsCustomInstances.regex]) {
document.getElementById(`clear-${x}`).addEventListener("click", async () => {
let index
index = exceptionsCustomInstances.url.indexOf(x)
if (index > -1) exceptionsCustomInstances.url.splice(index, 1)
else {
index = exceptionsCustomInstances.regex.indexOf(x)
if (index > -1) exceptionsCustomInstances.regex.splice(index, 1)
}
} else if (instanceType == "regex") {
val = nameCustomInstanceInput.value
if (val.trim() != "" && !exceptionsCustomInstances.regex.includes(val)) exceptionsCustomInstances.regex.push(val)
}
if (val) {
options = await utils.getOptions()
options.exceptions = exceptionsCustomInstances
browser.storage.local.set({ options })
nameCustomInstanceInput.value = ""
}
calcExceptionsCustomInstances()
})
calcExceptionsCustomInstances()
})
}
}
calcExceptionsCustomInstances()
document.getElementById("custom-exceptions-instance-form").addEventListener("submit", async event => {
event.preventDefault()
for (const service in config.services) document.getElementById(service).checked = options.popupServices.includes(service)
}
let val
if (instanceType == "url") {
if (nameCustomInstanceInput.validity.valid) {
val = nameCustomInstanceInput.value
if (!exceptionsCustomInstances.url.includes(val)) exceptionsCustomInstances.url.push(val)
}
} else if (instanceType == "regex") {
val = nameCustomInstanceInput.value
if (val.trim() != "" && !exceptionsCustomInstances.regex.includes(val)) exceptionsCustomInstances.regex.push(val)
}
if (val) {
options = await utils.getOptions()
options.exceptions = exceptionsCustomInstances
console.log(options.exceptions)
browser.storage.local.set({ options }, () =>
nameCustomInstanceInput.value = ""
)
}
calcExceptionsCustomInstances()
})

View File

@ -9,9 +9,11 @@ let config,
config = await utils.getConfig()
servicesHelper.switchInstance(true).then(r => {
servicesHelper.switchInstance().then(r => {
if (!r) document.getElementById("change_instance_div").style.display = "none"
else document.getElementById("change_instance").addEventListener("click", () => servicesHelper.switchInstance(false))
else document.getElementById("change_instance").addEventListener("click", async () => {
browser.tabs.update({ url: await servicesHelper.switchInstance() })
})
})
servicesHelper.copyRaw(true).then(r => {