From 2a1783d26ef8689474241f8f4f95a878fe07f757 Mon Sep 17 00:00:00 2001 From: nikitalokhmachev-ai Date: Wed, 28 May 2025 08:30:59 -0400 Subject: [PATCH 01/10] feat: working settings + skip domains --- src/ext/bg.ts | 42 ++++---- src/recorder.ts | 22 +++-- src/settings-page.ts | 223 ++++++++++++++++++++++++++++++++++++++++++ src/sidepanel.ts | 23 ++++- src/utils.ts | 36 +++++++ static/sidepanel.html | 6 ++ 6 files changed, 324 insertions(+), 28 deletions(-) create mode 100644 src/settings-page.ts diff --git a/src/ext/bg.ts b/src/ext/bg.ts index 0d636b5..51d50c6 100644 --- a/src/ext/bg.ts +++ b/src/ext/bg.ts @@ -9,6 +9,7 @@ import { setLocalOption, getSharedArchives, } from "../localstorage"; +import { isValidUrl } from "../utils"; // =========================================================================== self.recorders = {}; self.newRecId = null; @@ -22,6 +23,7 @@ let newRecCollId = null; let defaultCollId = null; let autorun = false; let isRecordingEnabled = false; +let skipDomains = [] as string[]; const openWinMap = new Map(); @@ -32,6 +34,12 @@ const disabledCSPTabs = new Set(); // @ts-expect-error - TS7034 - Variable 'sidepanelPort' implicitly has type 'any' in some locations where its type cannot be determined. let sidepanelPort = null; +(async function loadSkipDomains() { + // @ts-expect-error + skipDomains = (await getLocalOption("skipDomains")) || []; + console.log("bg.skipDomains:", skipDomains); +})(); + // =========================================================================== function main() { @@ -136,7 +144,7 @@ function sidepanelHandler(port) { //@ts-expect-error tabs has any type async (tabs) => { for (const tab of tabs) { - if (!isValidUrl(tab.url)) continue; + if (!isValidUrl(tab.url, skipDomains)) continue; await startRecorder( tab.id, @@ -217,6 +225,13 @@ chrome.runtime.onMessage.addListener( (message /*sender, sendResponse*/) => { console.log("onMessage", message); switch (message.msg) { + case "optionsChanged": + for (const rec of Object.values(self.recorders)) { + rec.initOpts(); + rec.doUpdateStatus(); + } + break; + case "startNew": (async () => { newRecUrl = message.url; @@ -256,7 +271,7 @@ chrome.tabs.onActivated.addListener(async ({ tabId }) => { chrome.tabs.get(tabId, resolve), ); - if (!isValidUrl(tab.url)) return; + if (!isValidUrl(tab.url, skipDomains)) return; if (!self.recorders[tabId]) { await startRecorder( tabId, @@ -296,7 +311,7 @@ chrome.tabs.onCreated.addListener((tab) => { newRecCollId = null; } else if ( tab.openerTabId && - (!tab.pendingUrl || isValidUrl(tab.pendingUrl)) && + (!tab.pendingUrl || isValidUrl(tab.pendingUrl, skipDomains)) && // @ts-expect-error - TS2339 - Property 'running' does not exist on type 'BrowserRecorder'. self.recorders[tab.openerTabId]?.running ) { @@ -311,7 +326,7 @@ chrome.tabs.onCreated.addListener((tab) => { } if (start) { - if (openUrl && !isValidUrl(openUrl)) { + if (openUrl && !isValidUrl(openUrl, skipDomains)) { return; } startRecorder( @@ -339,7 +354,7 @@ chrome.tabs.onUpdated.addListener((tabId, changeInfo) => { // @ts-expect-error - TS2339 - Property 'waitForTabUpdate' does not exist on type 'BrowserRecorder'. if (recorder.waitForTabUpdate) { - if (isValidUrl(changeInfo.url)) { + if (isValidUrl(changeInfo.url, skipDomains)) { recorder.attach(); } else { // @ts-expect-error - TS2339 - Property 'waitForTabUpdate' does not exist on type 'BrowserRecorder'. @@ -351,7 +366,7 @@ chrome.tabs.onUpdated.addListener((tabId, changeInfo) => { } else if (changeInfo.url) { if ( isRecordingEnabled && - isValidUrl(changeInfo.url) && + isValidUrl(changeInfo.url, skipDomains) && !self.recorders[tabId] ) { // @ts-expect-error - TS2554 - Expected 2 arguments, but got 3. @@ -361,7 +376,7 @@ chrome.tabs.onUpdated.addListener((tabId, changeInfo) => { if (openWinMap.has(changeInfo.url)) { const collId = openWinMap.get(changeInfo.url); openWinMap.delete(changeInfo.url); - if (!tabId || !isValidUrl(changeInfo.url)) return; + if (!tabId || !isValidUrl(changeInfo.url, skipDomains)) return; // @ts-expect-error - TS2554 - Expected 2 arguments, but got 3. startRecorder(tabId, { collId, autorun }, changeInfo.url); @@ -386,7 +401,7 @@ chrome.contextMenus.onClicked.addListener((info, tab) => { case "toggle-rec": if (!isRecording(tab.id)) { - if (isValidUrl(tab.url)) { + if (isValidUrl(tab.url, skipDomains)) { // @ts-expect-error - TS2554 - Expected 2 arguments, but got 1. startRecorder(tab.id); } @@ -457,17 +472,6 @@ function isRecording(tabId) { return self.recorders[tabId]?.running; } -// =========================================================================== -// @ts-expect-error - TS7006 - Parameter 'url' implicitly has an 'any' type. -function isValidUrl(url) { - return ( - url && - (url === "about:blank" || - url.startsWith("https:") || - url.startsWith("http:")) - ); -} - // =========================================================================== // @ts-expect-error - TS7006 - Parameter 'tabId' implicitly has an 'any' type. async function disableCSPForTab(tabId) { diff --git a/src/recorder.ts b/src/recorder.ts index f6c0fb0..8803729 100644 --- a/src/recorder.ts +++ b/src/recorder.ts @@ -1,5 +1,5 @@ import { RequestResponseInfo } from "./requestresponseinfo"; - +import { isValidUrl, isUrlInSkipList } from "./utils"; import { getCustomRewriter, rewriteDASH, @@ -60,6 +60,7 @@ class Recorder { archiveFlash = false; archiveScreenshots = false; archivePDF = false; + skipDomains: string[] = []; _fetchQueue: FetchEntry[] = []; @@ -163,6 +164,9 @@ class Recorder { this.archiveScreenshots = (await getLocalOption("archiveScreenshots")) === "1"; this.archivePDF = (await getLocalOption("archivePDF")) === "1"; + // @ts-expect-error + this.skipDomains = (await getLocalOption("skipDomains")) || []; + console.log("recorder.skipDomains", this.skipDomains); } // @ts-expect-error - TS7006 - Parameter 'autorun' implicitly has an 'any' type. @@ -1111,6 +1115,9 @@ class Recorder { // @ts-expect-error - TS7006 - Parameter 'currPage' implicitly has an 'any' type. | TS7006 - Parameter 'domSnapshot' implicitly has an 'any' type. | TS7006 - Parameter 'finished' implicitly has an 'any' type. commitPage(currPage, domSnapshot, finished) { + if (isUrlInSkipList(currPage?.url, this.skipDomains)) { + return; + } if (!currPage?.url || !currPage.ts || currPage.url === "about:blank") { return; } @@ -1135,6 +1142,10 @@ class Recorder { // @ts-expect-error - TS7006 - Parameter 'data' implicitly has an 'any' type. | TS7006 - Parameter 'pageInfo' implicitly has an 'any' type. async commitResource(data, pageInfo) { + if (isUrlInSkipList(data.url, this.skipDomains)) { + return; + } + const payloadSize = data.payload.length; // @ts-expect-error - TS2339 - Property 'pageInfo' does not exist on type 'Recorder'. pageInfo = pageInfo || this.pageInfo; @@ -1552,11 +1563,6 @@ class Recorder { return !status || status === 204 || (status >= 300 && status < 400); } - // @ts-expect-error - TS7006 - Parameter 'url' implicitly has an 'any' type. - isValidUrl(url) { - return url && (url.startsWith("https:") || url.startsWith("http:")); - } - // @ts-expect-error - TS7006 - Parameter 'params' implicitly has an 'any' type. | TS7006 - Parameter 'sessions' implicitly has an 'any' type. async handleLoadingFinished(params, sessions) { const reqresp = this.removeReqResp(params.requestId); @@ -1566,7 +1572,7 @@ class Recorder { return; } - if (!this.isValidUrl(reqresp.url)) { + if (!isValidUrl(reqresp.url, this.skipDomains)) { return; } @@ -1830,7 +1836,7 @@ class Recorder { // @ts-expect-error - TS7006 - Parameter 'request' implicitly has an 'any' type. | TS7006 - Parameter 'sessions' implicitly has an 'any' type. doAsyncFetch(request: FetchEntry, sessions) { - if (!request || !this.isValidUrl(request.url)) { + if (!request || !isValidUrl(request.url, this.skipDomains)) { return; } diff --git a/src/settings-page.ts b/src/settings-page.ts new file mode 100644 index 0000000..4686803 --- /dev/null +++ b/src/settings-page.ts @@ -0,0 +1,223 @@ +// settings-page.ts +import { LitElement, html, css } from "lit"; +import { customElement } from "lit/decorators.js"; +import "@material/web/textfield/outlined-text-field.js"; +import "@material/web/switch/switch.js"; +import "@material/web/icon/icon.js"; +import "@material/web/iconbutton/icon-button.js"; +import { styles as typescaleStyles } from "@material/web/typography/md-typescale-styles.js"; +import { getLocalOption, setLocalOption } from "./localstorage"; +import { state } from "lit/decorators.js"; + +@customElement("settings-page") +export class SettingsPage extends LitElement { + // @ts-expect-error + static styles: CSSResultGroup = [ + // @ts-expect-error + typescaleStyles as unknown as CSSResultGroup, + css` + :host { + display: flex; + flex-direction: column; + height: 100%; + } + .header { + margin-bottom: 24px; + + & nav { + display: flex; + align-items: center; + margin: 0 16px; + } + } + .content { + box-sizing: border-box; /* include padding in width calculations */ + padding: 16px; /* existing top/bottom padding */ + padding-inline-start: 16px; /* horizontal padding */ + padding-inline-end: 16px; /* horizontal padding */ + overflow-y: auto; + flex: 1; + } + .section { + margin: 24px 16px 0; /* 24px top, 16px left/right, 0 bottom */ + } + .section-label { + display: flex; + justify-content: space-between; + align-items: center; + } + .section-desc { + margin: 4px 0 8px; + color: rgba(0, 0, 0, 0.6); + } + + md-outlined-text-field { + display: block; /* make it a block so margins apply symmetrically */ + box-sizing: border-box; /* include padding/border in its width calculation */ + /* override the inline width:100% you currently have on the element */ + width: auto !important; + /* fill the container minus your 2×16px margins */ + max-width: calc(100% - 32px); + margin: 0 16px; + } + `, + ]; + + @state() + private archiveCookies = false; + @state() + private archiveStorage = false; + @state() + private archiveScreenshots = false; + @state() + private skipDomains = ""; + + connectedCallback() { + super.connectedCallback(); + this.loadSettings(); + } + + private async loadSettings() { + try { + const cookies = await getLocalOption("archiveCookies"); + this.archiveCookies = cookies === "1"; + const storage = await getLocalOption("archiveStorage"); + this.archiveStorage = storage === "1"; + const screenshots = await getLocalOption("archiveScreenshots"); + this.archiveScreenshots = screenshots === "1"; + const domains = await getLocalOption("skipDomains"); + this.skipDomains = Array.isArray(domains) + ? domains.join("\n") + : typeof domains === "string" + ? domains + : ""; + } catch (e) { + console.error("Failed to load settings", e); + } + } + + private async _onSkipDomainsChange(e: Event) { + const textarea = e.currentTarget as HTMLInputElement; + const value = textarea.value; + this.skipDomains = value; // update lit-state so UI stays in sync + + // split into an array, trimming out blank lines + const list = value + .split("\n") + .map((d) => d.trim()) + .filter(Boolean); + + // persist and notify recorder + await setLocalOption("skipDomains", list); + chrome.runtime.sendMessage({ msg: "optionsChanged" }); + } + + private async _onArchiveCookiesChange(e: Event) { + // @ts-expect-error + const checked = (e.currentTarget as HTMLInputElement).selected; + + await setLocalOption("archiveCookies", checked ? "1" : "0"); + chrome.runtime.sendMessage({ msg: "optionsChanged" }); + } + + private async _onArchiveLocalstorageChange(e: Event) { + // @ts-expect-error + const checked = (e.currentTarget as HTMLInputElement).selected; + await setLocalOption("archiveStorage", checked ? "1" : "0"); + chrome.runtime.sendMessage({ msg: "optionsChanged" }); + } + + private async _onArchiveScreenshotsChange(e: Event) { + // @ts-expect-error + const checked = (e.currentTarget as HTMLInputElement).selected; + await setLocalOption("archiveScreenshots", checked ? "1" : "0"); + chrome.runtime.sendMessage({ msg: "optionsChanged" }); + } + + private _onBack() { + this.dispatchEvent( + new CustomEvent("back", { bubbles: true, composed: true }), + ); + } + + render() { + return html` +
+ + +
+ + +
+ +

+ Save screenshot + thumbnail of every page on load. Screenshot will be saved as soon as page is done loading. +

+
+ + +
+ +

+ Archiving cookies may expose private information that is normally + only shared with the site. When enabled, users should exercise + caution about sharing archived pages. +

+
+ +
+ +

+ Archiving local storage will archive information that is generally + always private. +

+ Sharing content created with this setting enabled may compromise your + login credentials. +

+
+ + + + `; + } +} diff --git a/src/sidepanel.ts b/src/sidepanel.ts index 2795982..5de1831 100644 --- a/src/sidepanel.ts +++ b/src/sidepanel.ts @@ -4,6 +4,7 @@ import { LitElement, html, css, CSSResultGroup } from "lit"; import { unsafeSVG } from "lit/directives/unsafe-svg.js"; import "./argo-archive-list"; import "./argo-shared-archive-list"; +import "./settings-page"; import "@material/web/textfield/outlined-text-field.js"; import "@material/web/icon/icon.js"; import { ArgoArchiveList } from "./argo-archive-list"; @@ -11,6 +12,8 @@ import { Downloader } from "./sw/downloader"; import type { SharedArchive } from "./types"; import { getSharedArchives, setSharedArchives } from "./localstorage"; import { webtorrentClient as client } from "./global-webtorrent"; +import { state } from "lit/decorators.js"; +import { isUrlInSkipList } from "./utils"; import { getLocalOption, @@ -180,6 +183,13 @@ class ArgoViewer extends LitElement { ]; private archiveList!: ArgoArchiveList; + + @state() private showingSettings = false; + @state() private skipDomains: string[] = []; + + private _toggleSettings() { + this.showingSettings = !this.showingSettings; + } constructor() { super(); // @ts-expect-error - TS2339 - Property 'activeTabIndex' does not exist on type 'ArgoViewer'. @@ -519,6 +529,10 @@ class ArgoViewer extends LitElement { console.log("Archive list:", this.archiveList); this.registerMessages(); + // @ts-expect-error + this.skipDomains = await getLocalOption("skipDomains"); + console.log("sidepanel.skipDomains:", this.skipDomains); + getSharedArchives().then((arr) => { // @ts-expect-error - this.sharedArchives does not exist this.sharedArchives = arr; @@ -720,6 +734,8 @@ class ArgoViewer extends LitElement { ) { // @ts-expect-error - TS2339 - Property 'canRecord' does not exist on type 'ArgoViewer'. this.canRecord = + // @ts-expect-error - TS2339 - Property 'pageUrl' does not exist on type 'ArgoViewer'. + !isUrlInSkipList(this.pageUrl, this.skipDomains) && // @ts-expect-error - TS2339 - Property 'pageUrl' does not exist on type 'ArgoViewer'. this.pageUrl && // @ts-expect-error - TS2339 - Property 'pageUrl' does not exist on type 'ArgoViewer'. @@ -1106,6 +1122,11 @@ class ArgoViewer extends LitElement { } render() { + if (this.showingSettings) { + return html``; + } return html` ${this.renderSearch()} ${this.renderTabs()}
@@ -1139,7 +1160,7 @@ class ArgoViewer extends LitElement { ` } - + settings
diff --git a/src/utils.ts b/src/utils.ts index 050b80d..fa9a02e 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,6 +1,42 @@ import { getCollData } from "@webrecorder/wabac"; import { getLocalOption, setLocalOption } from "./localstorage"; +export function isValidUrl(url: string, skipDomains: string[]): Boolean { + console.log("utils: Ignoring Urls:", skipDomains); + console.log("utils: current url:", url); + + if (!isSupportedScheme(url)) { + console.log("utils: Invalid URL:", url); + return false; + } + + if (isUrlInSkipList(url, skipDomains)) { + console.log(`utils: Skipping by policy: ${url}`); + return false; + } + + console.log("utils: Archiving URL:", url); + return true; +} + +function isSupportedScheme(url: string): boolean { + return ( + url === "about:blank" || url.startsWith("http:") || url.startsWith("https:") + ); +} + +export function isUrlInSkipList(url: string, skipDomains: string[]): boolean { + try { + const host = new URL(url).hostname.toLowerCase(); + return skipDomains.some( + (domain) => host === domain || host.endsWith(`.${domain}`), + ); + } catch (e) { + console.log("utils: Malformed URL in skip check:", e); + return false; + } +} + // =========================================================================== // @ts-expect-error - TS7006 - Parameter 'collLoader' implicitly has an 'any' type. export async function ensureDefaultColl(collLoader) { diff --git a/static/sidepanel.html b/static/sidepanel.html index d704aa8..3ede47b 100644 --- a/static/sidepanel.html +++ b/static/sidepanel.html @@ -24,6 +24,12 @@ --md-checkbox-container-size: 16px; --md-checkbox-icon-size: 16px; + --md-switch-selected-handle-color: var(--md-sys-color-on-primary); + --md-switch-selected-pressed-handle-color: var(--md-sys-color-on-primary); + --md-switch-selected-focus-handle-color: var(--md-sys-color-on-primary); + --md-switch-unselected-pressed-handle-color: var(--md-sys-color-on-primary); + --md-switch-selected-hover-handle-color: var(--md-sys-color-secondary-container); + --md-sys-color-primary: rgb(220, 101, 3); --md-sys-color-surface-tint: rgb(154 70 0); --md-sys-color-on-primary: rgb(255 255 255); From f8c960a99db9d543d45d00a069f45b95766830c2 Mon Sep 17 00:00:00 2001 From: nikitalokhmachev-ai Date: Wed, 28 May 2025 09:07:30 -0400 Subject: [PATCH 02/10] fix: stop recorder when switching from one page to another within same tab --- src/ext/bg.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/ext/bg.ts b/src/ext/bg.ts index 51d50c6..546103a 100644 --- a/src/ext/bg.ts +++ b/src/ext/bg.ts @@ -352,6 +352,17 @@ chrome.tabs.onUpdated.addListener((tabId, changeInfo) => { openWinMap.delete(changeInfo.url); } + if (changeInfo.url && !isValidUrl(changeInfo.url, skipDomains)) { + stopRecorder(tabId); + delete self.recorders[tabId]; + // let the side-panel know the ’canRecord’/UI state changed + // @ts-expect-error + if (sidepanelPort) { + sidepanelPort.postMessage({ type: "update" }); + } + return; + } + // @ts-expect-error - TS2339 - Property 'waitForTabUpdate' does not exist on type 'BrowserRecorder'. if (recorder.waitForTabUpdate) { if (isValidUrl(changeInfo.url, skipDomains)) { @@ -364,6 +375,10 @@ chrome.tabs.onUpdated.addListener((tabId, changeInfo) => { } } } else if (changeInfo.url) { + // @ts-expect-error - TS7034 - Variable 'err' implicitly has type 'any' in some locations where its type cannot be determined. + if (sidepanelPort) { + sidepanelPort.postMessage({ type: "update" }); + } if ( isRecordingEnabled && isValidUrl(changeInfo.url, skipDomains) && From 97e04cf83235595b6c003350f2a023cfe4929a7b Mon Sep 17 00:00:00 2001 From: nikitalokhmachev-ai Date: Wed, 28 May 2025 09:42:12 -0400 Subject: [PATCH 03/10] feat: fix record button state --- src/settings-page.ts | 2 +- src/sidepanel.ts | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/settings-page.ts b/src/settings-page.ts index 4686803..c68f311 100644 --- a/src/settings-page.ts +++ b/src/settings-page.ts @@ -175,7 +175,7 @@ export class SettingsPage extends LitElement { >

- Save screenshot + thumbnail of every page on load. Screenshot will be saved as soon as page is done loading. + Save a thumbnail screenshot of every page on load. Screenshot will be saved as soon as page is done loading.

diff --git a/src/sidepanel.ts b/src/sidepanel.ts index 5de1831..42b9553 100644 --- a/src/sidepanel.ts +++ b/src/sidepanel.ts @@ -533,6 +533,19 @@ class ArgoViewer extends LitElement { this.skipDomains = await getLocalOption("skipDomains"); console.log("sidepanel.skipDomains:", this.skipDomains); + // @ts-expect-error - TS2339 - Property 'canRecord' does not exist on type 'ArgoViewer'. + this.canRecord = + // @ts-expect-error - TS2339 - Property 'pageUrl' does not exist on type 'ArgoViewer'. + !isUrlInSkipList(this.pageUrl, this.skipDomains) && + // @ts-expect-error - TS2339 - Property 'pageUrl' does not exist on type 'ArgoViewer'. + this.pageUrl && + // @ts-expect-error - TS2339 - Property 'pageUrl' does not exist on type 'ArgoViewer'. + (this.pageUrl === "about:blank" || + // @ts-expect-error - TS2339 - Property 'pageUrl' does not exist on type 'ArgoViewer'. + this.pageUrl.startsWith("http:") || + // @ts-expect-error - TS2339 - Property 'pageUrl' does not exist on type 'ArgoViewer'. + this.pageUrl.startsWith("https:")); + getSharedArchives().then((arr) => { // @ts-expect-error - this.sharedArchives does not exist this.sharedArchives = arr; From 62aa2819fb5dfe2ba68cf4bdca37f60cbad8df5d Mon Sep 17 00:00:00 2001 From: nikitalokhmachev-ai Date: Wed, 28 May 2025 09:47:50 -0400 Subject: [PATCH 04/10] fix: leaving settings makes top bar stop working --- src/sidepanel.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/sidepanel.ts b/src/sidepanel.ts index 42b9553..5ed4d60 100644 --- a/src/sidepanel.ts +++ b/src/sidepanel.ts @@ -187,8 +187,14 @@ class ArgoViewer extends LitElement { @state() private showingSettings = false; @state() private skipDomains: string[] = []; - private _toggleSettings() { + private async _toggleSettings() { this.showingSettings = !this.showingSettings; + if (!this.showingSettings) { + await this.updateComplete; + this.archiveList = this.shadowRoot!.getElementById( + "archive-list", + ) as ArgoArchiveList; + } } constructor() { super(); From 121f9d9b17e1fdc7b473b820ae6cac098afc6f0c Mon Sep 17 00:00:00 2001 From: nikitalokhmachev-ai Date: Wed, 28 May 2025 10:11:42 -0400 Subject: [PATCH 05/10] fix: page gets stored when switching from recordable to unrecordable --- src/ext/bg.ts | 1 - src/ext/browser-recorder.ts | 16 ++++++++++++---- src/recorder.ts | 1 - src/sidepanel.ts | 4 +--- src/utils.ts | 6 ------ 5 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/ext/bg.ts b/src/ext/bg.ts index 546103a..8545d5d 100644 --- a/src/ext/bg.ts +++ b/src/ext/bg.ts @@ -37,7 +37,6 @@ let sidepanelPort = null; (async function loadSkipDomains() { // @ts-expect-error skipDomains = (await getLocalOption("skipDomains")) || []; - console.log("bg.skipDomains:", skipDomains); })(); // =========================================================================== diff --git a/src/ext/browser-recorder.ts b/src/ext/browser-recorder.ts index abaab74..a6ab854 100644 --- a/src/ext/browser-recorder.ts +++ b/src/ext/browser-recorder.ts @@ -2,6 +2,8 @@ import { BEHAVIOR_RUNNING } from "../consts"; import { Recorder } from "../recorder"; +import { isValidUrl } from "../utils"; +import { getLocalOption } from "../localstorage"; // =========================================================================== const DEBUG = false; @@ -333,18 +335,24 @@ class BrowserRecorder extends Recorder { return writtenSize; } - - // @ts-expect-error - TS7006 - Parameter 'pageInfo' implicitly has an 'any' type. - _doAddPage(pageInfo) { + async _doAddPage(pageInfo: { url?: string; [key: string]: any }) { if (!pageInfo.url) { console.warn("Empty Page, Skipping"); return; } + + // @ts-expect-error + const skipDomains: string[] = (await getLocalOption("skipDomains")) || []; + + if (!isValidUrl(pageInfo.url, skipDomains)) { + console.log("Skipping by policy:", pageInfo.url); + return; + } + // @ts-expect-error - TS2339 - Property 'db' does not exist on type 'BrowserRecorder'. if (this.db) { // @ts-expect-error - TS2339 - Property 'db' does not exist on type 'BrowserRecorder'. const result = this.db.addPage(pageInfo); - chrome.runtime.sendMessage({ type: "pageAdded" }); return result; } diff --git a/src/recorder.ts b/src/recorder.ts index 8803729..1955f3d 100644 --- a/src/recorder.ts +++ b/src/recorder.ts @@ -166,7 +166,6 @@ class Recorder { this.archivePDF = (await getLocalOption("archivePDF")) === "1"; // @ts-expect-error this.skipDomains = (await getLocalOption("skipDomains")) || []; - console.log("recorder.skipDomains", this.skipDomains); } // @ts-expect-error - TS7006 - Parameter 'autorun' implicitly has an 'any' type. diff --git a/src/sidepanel.ts b/src/sidepanel.ts index 5ed4d60..1bbe1df 100644 --- a/src/sidepanel.ts +++ b/src/sidepanel.ts @@ -532,12 +532,10 @@ class ArgoViewer extends LitElement { "archive-list", ) as ArgoArchiveList; - console.log("Archive list:", this.archiveList); this.registerMessages(); // @ts-expect-error this.skipDomains = await getLocalOption("skipDomains"); - console.log("sidepanel.skipDomains:", this.skipDomains); // @ts-expect-error - TS2339 - Property 'canRecord' does not exist on type 'ArgoViewer'. this.canRecord = @@ -561,7 +559,7 @@ class ArgoViewer extends LitElement { await this.reseedAll(); - console.log("Currently seeding (firstUpdated) torrents:", client.torrents); + console.log("Currently seeding torrents:", client.torrents); } updateTabInfo() { diff --git a/src/utils.ts b/src/utils.ts index fa9a02e..086240c 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -2,20 +2,14 @@ import { getCollData } from "@webrecorder/wabac"; import { getLocalOption, setLocalOption } from "./localstorage"; export function isValidUrl(url: string, skipDomains: string[]): Boolean { - console.log("utils: Ignoring Urls:", skipDomains); - console.log("utils: current url:", url); - if (!isSupportedScheme(url)) { - console.log("utils: Invalid URL:", url); return false; } if (isUrlInSkipList(url, skipDomains)) { - console.log(`utils: Skipping by policy: ${url}`); return false; } - console.log("utils: Archiving URL:", url); return true; } From 18262d4c59ddf85335ea5c38ce00f346df543626 Mon Sep 17 00:00:00 2001 From: Henry Wilkinson Date: Thu, 29 May 2025 12:26:03 -0400 Subject: [PATCH 06/10] Fix share icon color --- src/sidepanel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sidepanel.ts b/src/sidepanel.ts index 1bbe1df..cbe5b16 100644 --- a/src/sidepanel.ts +++ b/src/sidepanel.ts @@ -896,7 +896,7 @@ class ArgoViewer extends LitElement { style="color: white; border-radius: 9999px; align-self: flex-end;" @click=${this.onShareCurrent} > - share + share Share Current Page ` : "" From e5b54d898f119a931b5bfd2850ce17d45010023b Mon Sep 17 00:00:00 2001 From: Henry Wilkinson Date: Thu, 29 May 2025 12:28:38 -0400 Subject: [PATCH 07/10] Fix SVG favicon overflow --- src/argo-archive-list.ts | 2 +- src/argo-shared-archive-list.ts | 2 +- src/sidepanel.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/argo-archive-list.ts b/src/argo-archive-list.ts index 530c7da..6301e61 100644 --- a/src/argo-archive-list.ts +++ b/src/argo-archive-list.ts @@ -90,7 +90,7 @@ export class ArgoArchiveList extends LitElement { width: 20px !important; height: 20px !important; flex: 0 0 auto; - object-fit: cover; + object-fit: contain; border-radius: 4px; filter: drop-shadow(0 0 1px rgba(0, 0, 0, 0.6)); } diff --git a/src/argo-shared-archive-list.ts b/src/argo-shared-archive-list.ts index d205cae..95c3091 100644 --- a/src/argo-shared-archive-list.ts +++ b/src/argo-shared-archive-list.ts @@ -93,7 +93,7 @@ export class ArgoSharedArchiveList extends LitElement { width: 20px !important; height: 20px !important; flex: 0 0 auto; - object-fit: cover; + object-fit: contain; border-radius: 4px; filter: drop-shadow(0 0 1px rgba(0, 0, 0, 0.6)); } diff --git a/src/sidepanel.ts b/src/sidepanel.ts index cbe5b16..af2a91e 100644 --- a/src/sidepanel.ts +++ b/src/sidepanel.ts @@ -135,7 +135,7 @@ class ArgoViewer extends LitElement { width: var(--md-icon-size) !important; height: var(--md-icon-size) !important; flex: 0 0 auto; - object-fit: cover; + object-fit: contain; border-radius: 4px; filter: drop-shadow(0 0 1px rgba(0, 0, 0, 0.6)); } From 934371791b9bb6062e99904e74166b851f7522e7 Mon Sep 17 00:00:00 2001 From: Henry Wilkinson Date: Thu, 29 May 2025 12:33:52 -0400 Subject: [PATCH 08/10] Adjust favicon drop shadow --- src/argo-archive-list.ts | 2 +- src/argo-shared-archive-list.ts | 2 +- src/sidepanel.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/argo-archive-list.ts b/src/argo-archive-list.ts index 6301e61..9f66c25 100644 --- a/src/argo-archive-list.ts +++ b/src/argo-archive-list.ts @@ -92,7 +92,7 @@ export class ArgoArchiveList extends LitElement { flex: 0 0 auto; object-fit: contain; border-radius: 4px; - filter: drop-shadow(0 0 1px rgba(0, 0, 0, 0.6)); + filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.4)); } summary { diff --git a/src/argo-shared-archive-list.ts b/src/argo-shared-archive-list.ts index 95c3091..7b6cf84 100644 --- a/src/argo-shared-archive-list.ts +++ b/src/argo-shared-archive-list.ts @@ -95,7 +95,7 @@ export class ArgoSharedArchiveList extends LitElement { flex: 0 0 auto; object-fit: contain; border-radius: 4px; - filter: drop-shadow(0 0 1px rgba(0, 0, 0, 0.6)); + filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.4)); } .title-url { diff --git a/src/sidepanel.ts b/src/sidepanel.ts index af2a91e..efc2613 100644 --- a/src/sidepanel.ts +++ b/src/sidepanel.ts @@ -137,7 +137,7 @@ class ArgoViewer extends LitElement { flex: 0 0 auto; object-fit: contain; border-radius: 4px; - filter: drop-shadow(0 0 1px rgba(0, 0, 0, 0.6)); + filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.4)); } /* Fade overlay styles */ From b351e4d69c035f0c55569bd38d6e09a96005979f Mon Sep 17 00:00:00 2001 From: Henry Wilkinson Date: Thu, 29 May 2025 12:46:50 -0400 Subject: [PATCH 09/10] Fix URL word breaking --- src/sidepanel.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sidepanel.ts b/src/sidepanel.ts index efc2613..54047a4 100644 --- a/src/sidepanel.ts +++ b/src/sidepanel.ts @@ -122,6 +122,7 @@ class ArgoViewer extends LitElement { font-size: 14px; font-weight: 500; color: #000; + word-break: break-all; } .status-divider { From 3c227f195a35b17f87b03fc6db76f8f8c226aafb Mon Sep 17 00:00:00 2001 From: Henry Wilkinson Date: Thu, 29 May 2025 12:47:38 -0400 Subject: [PATCH 10/10] Add break word to improve word breaking --- src/sidepanel.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sidepanel.ts b/src/sidepanel.ts index 54047a4..35d10cb 100644 --- a/src/sidepanel.ts +++ b/src/sidepanel.ts @@ -122,6 +122,7 @@ class ArgoViewer extends LitElement { font-size: 14px; font-weight: 500; color: #000; + word-wrap: break-word; word-break: break-all; }