diff --git a/extension/src/background.ts b/extension/src/background.ts index 8e1eaa6..efcf9fe 100644 --- a/extension/src/background.ts +++ b/extension/src/background.ts @@ -6,10 +6,8 @@ import { UPDATE_INTERVAL_MS, } from "./config"; import validator_set from "./validator_set.json"; -import { isInPartition } from "./webcat/cache"; import { WebcatDatabase } from "./webcat/db"; import { WebcatRequestHandler } from "./webcat/handler"; -import { setErrorIcon } from "./webcat/ui"; import { EnrollmentUpdater } from "./webcat/updater"; import { clearBrowserCaches } from "./webcat/utils"; @@ -17,38 +15,6 @@ console.log("[webcat] Starting up background"); const db = new WebcatDatabase(); -// Not the best performance idea to act on all tab just for this -browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => { - const errorUrl = browser.runtime.getURL("pages/error.html"); - if (changeInfo.status === "complete" && tab.url?.startsWith(errorUrl)) { - setErrorIcon(tabId); - } -}); - -// Grey out and make page action unclickable unless a website is enrolled -browser.tabs.onCreated.addListener((tab) => { - if (tab.id !== undefined) { - browser.pageAction.hide(tab.id); - } -}); - -// Handle incognito sessions ending -browser.windows.onRemoved.addListener(async () => { - const windows = await browser.windows.getAll(); - if (windows.filter((win) => win.incognito).length === 0) { - for (const key of db.origins.keys()) { - if (isInPartition(key, { incognito: true })) { - db.origins.delete(key); - } - } - for (const value of db.nonOrigins.values()) { - if (isInPartition(value, { incognito: true })) { - db.nonOrigins.delete(value); - } - } - } -}); - const requestHandler = new WebcatRequestHandler(db); const updater = new EnrollmentUpdater({ endpoint: endpoint, diff --git a/extension/src/webcat/handler.ts b/extension/src/webcat/handler.ts index 76023ca..940686b 100644 --- a/extension/src/webcat/handler.ts +++ b/extension/src/webcat/handler.ts @@ -6,7 +6,7 @@ import { RequestHandler, } from "../browser/requests"; import { ContentScript } from "../browser/scripting"; -import { CacheKey } from "./cache"; +import { CacheKey, isInPartition } from "./cache"; import { HookBuilder } from "./hookbuilder"; import { Database } from "./interfaces/database"; import { WebcatError } from "./interfaces/errors"; @@ -17,7 +17,7 @@ import { OriginStateVerifiedManifest } from "./originstate"; import { validateOrigin } from "./request"; import { FRAME_TYPES } from "./resources"; import { ResponseValidator } from "./response"; -import { errorpage } from "./ui"; +import { errorpage, setErrorIcon } from "./ui"; import { getFQDN, isExtensionRequest, isNewerSemver } from "./utils"; // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging @@ -44,6 +44,17 @@ export class WebcatRequestHandler extends RequestHandler { this.#responseValidator = new ResponseValidator(this.#db, this.#hooks); this.addEventListener("beforerequest", this.#onRequest); this.addEventListener("headersreceived", this.#onHeaders); + browser.webNavigation.onCommitted.addListener( + this.#onErrorPageNavigation.bind(this), + { + url: [ + { + urlPrefix: browser.runtime.getURL("pages/error.html"), + }, + ], + }, + ); + browser.windows.onRemoved.addListener(this.#onWindowClosed.bind(this)); } override async bind(fqdns: string[]): Promise { @@ -298,4 +309,25 @@ export class WebcatRequestHandler extends RequestHandler { ); return details.requestId; } + + #onErrorPageNavigation(details: browser.webNavigation._OnCommittedDetails) { + setErrorIcon(details.tabId); + } + + async #onWindowClosed() { + // Handle incognito sessions ending + const windows = await browser.windows.getAll(); + if (windows.filter((win) => win.incognito).length === 0) { + for (const key of this.#db.origins.keys()) { + if (isInPartition(key, { incognito: true })) { + this.#db.origins.delete(key); + } + } + for (const value of this.#db.nonOrigins.values()) { + if (isInPartition(value, { incognito: true })) { + this.#db.nonOrigins.delete(value); + } + } + } + } }