Fix #4469: wrap history events in try/catch

This commit is contained in:
Oliver Blanthorn 2022-11-23 12:39:12 +01:00
parent 923e5e9411
commit 78d0fa91df
No known key found for this signature in database
GPG key ID: 2BB8C36BB504BFF3

View file

@ -41,40 +41,46 @@ config.getAsync("superignore").then(async TRI_DISABLE => {
if (TRI_DISABLE === "true") return
// Add cheap location change event
// Adapted from: https://stackoverflow.com/questions/6390341/how-to-detect-if-url-has-changed-after-hash-in-javascript
//
// Broken atm - on https://github.com/tridactyl/tridactyl/pull/3938 clicking onto issues doesn't do anything and we get "permission denied to access object"
try {
const realwindow = (window as any).wrappedJSObject ?? window // wrappedJSObject not defined on extension pages
// Add cheap location change event
// Adapted from: https://stackoverflow.com/questions/6390341/how-to-detect-if-url-has-changed-after-hash-in-javascript
//
// Broken atm - on https://github.com/tridactyl/tridactyl/pull/3938 clicking onto issues doesn't do anything and we get "permission denied to access object"
const triPushState = (hist => (
(...args) => {
const ret = hist(...args)
realwindow.dispatchEvent(new Event("HistoryPushState"))
const realwindow = (window as any).wrappedJSObject ?? window // wrappedJSObject not defined on extension pages
const triPushState = (hist => (
(...args) => {
const ret = hist(...args)
realwindow.dispatchEvent(new Event("HistoryPushState"))
realwindow.dispatchEvent(new Event("HistoryState"))
return ret
})
)(realwindow.history.pushState.bind(realwindow.history))
const triReplaceState = (hist => (
(...args) => {
const ret = hist(...args)
realwindow.dispatchEvent(new Event("HistoryReplaceState"))
realwindow.dispatchEvent(new Event("HistoryState"))
return ret
})
)(realwindow.history.replaceState.bind(realwindow.history))
realwindow.addEventListener("popstate", () => {
realwindow.dispatchEvent(new Event("HistoryState"))
return ret
})
)(realwindow.history.pushState.bind(realwindow.history))
const triReplaceState = (hist => (
(...args) => {
const ret = hist(...args)
realwindow.dispatchEvent(new Event("HistoryReplaceState"))
realwindow.dispatchEvent(new Event("HistoryState"))
return ret
})
)(realwindow.history.replaceState.bind(realwindow.history))
history.replaceState = triReplaceState
history.pushState = triPushState
realwindow.addEventListener("popstate", () => {
realwindow.dispatchEvent(new Event("HistoryState"))
})
typeof(exportFunction) == "function" && exportFunction(triReplaceState, history, {defineAs: "replaceState"})
typeof(exportFunction) == "function" && exportFunction(triPushState, history, {defineAs: "pushState"})
history.replaceState = triReplaceState
history.pushState = triPushState
typeof(exportFunction) == "function" && exportFunction(triReplaceState, history, {defineAs: "replaceState"})
typeof(exportFunction) == "function" && exportFunction(triPushState, history, {defineAs: "pushState"})
} catch (e) {
console.error(e)
}
const controller = await import("@src/lib/controller")
const excmds_content = await import("@src/.excmds_content.generated")