From d5055368c784191a8fd02592f9e8f17ae5f239d3 Mon Sep 17 00:00:00 2001 From: sawka Date: Mon, 29 Sep 2025 15:52:12 -0700 Subject: [PATCH] add clear history/storage for web widgets --- emain/emain.ts | 13 +++++++++ emain/preload.ts | 1 + frontend/app/view/webview/webview.tsx | 38 ++++++++++++++++++++++++--- frontend/types/custom.d.ts | 1 + package-lock.json | 4 +-- 5 files changed, 51 insertions(+), 6 deletions(-) diff --git a/emain/emain.ts b/emain/emain.ts index 1748d352b9..097c187e8e 100644 --- a/emain/emain.ts +++ b/emain/emain.ts @@ -369,6 +369,19 @@ electron.ipcMain.on("quicklook", (event, filePath: string) => { } }); +electron.ipcMain.handle("clear-webview-storage", async (event, webContentsId: number) => { + try { + const wc = electron.webContents.fromId(webContentsId); + if (wc && wc.session) { + await wc.session.clearStorageData(); + console.log("Cleared cookies and storage for webContentsId:", webContentsId); + } + } catch (e) { + console.error("Failed to clear cookies and storage:", e); + throw e; + } +}); + electron.ipcMain.on("open-native-path", (event, filePath: string) => { console.log("open-native-path", filePath); filePath = filePath.replace("~", electronApp.getPath("home")); diff --git a/emain/preload.ts b/emain/preload.ts index 0c0633fdfe..de0425fbdc 100644 --- a/emain/preload.ts +++ b/emain/preload.ts @@ -53,6 +53,7 @@ contextBridge.exposeInMainWorld("api", { openNativePath: (filePath: string) => ipcRenderer.send("open-native-path", filePath), captureScreenshot: (rect: Rectangle) => ipcRenderer.invoke("capture-screenshot", rect), setKeyboardChordMode: () => ipcRenderer.send("set-keyboard-chord-mode"), + clearWebviewStorage: (webContentsId: number) => ipcRenderer.invoke("clear-webview-storage", webContentsId), }); // Custom event for "new-window" diff --git a/frontend/app/view/webview/webview.tsx b/frontend/app/view/webview/webview.tsx index 546ad1fb10..0067ea863a 100644 --- a/frontend/app/view/webview/webview.tsx +++ b/frontend/app/view/webview/webview.tsx @@ -411,19 +411,19 @@ export class WebViewModel implements ViewModel { const searchTemplate = globalStore.get(defaultSearchAtom); const nextUrl = this.ensureUrlScheme(newUrl, searchTemplate); console.log("webview loadUrlPromise", reason, nextUrl, "cur=", this.webviewRef.current?.getURL()); - + if (!this.webviewRef.current) { return Promise.reject(new Error("WebView ref not available")); } - + if (newUrl != nextUrl) { globalStore.set(this.url, nextUrl); } - + if (this.webviewRef.current.getURL() != nextUrl) { return this.webviewRef.current.loadURL(nextUrl); } - + return Promise.resolve(); } @@ -495,6 +495,25 @@ export class WebViewModel implements ViewModel { } } + clearHistory() { + try { + this.webviewRef.current?.clearHistory(); + } catch (e) { + console.error("Failed to clear history", e); + } + } + + async clearCookiesAndStorage() { + try { + const webContentsId = this.webviewRef.current?.getWebContentsId(); + if (webContentsId) { + await getApi().clearWebviewStorage(webContentsId); + } + } catch (e) { + console.error("Failed to clear cookies and storage", e); + } + } + keyDownHandler(e: WaveKeyboardEvent): boolean { if (checkKeyPressed(e, "Cmd:l")) { this.urlInputRef?.current?.focus(); @@ -619,6 +638,17 @@ export class WebViewModel implements ViewModel { } }, }, + { + type: "separator", + }, + { + label: "Clear History", + click: () => this.clearHistory(), + }, + { + label: "Clear Cookies and Storage (All Web Widgets)", + click: () => fireAndForget(() => this.clearCookiesAndStorage()), + }, ]; } } diff --git a/frontend/types/custom.d.ts b/frontend/types/custom.d.ts index 62bd26a470..ee293c6115 100644 --- a/frontend/types/custom.d.ts +++ b/frontend/types/custom.d.ts @@ -103,6 +103,7 @@ declare global { openNativePath(filePath: string): void; captureScreenshot(rect: Electron.Rectangle): Promise; setKeyboardChordMode: () => void; + clearWebviewStorage: (webContentsId: number) => Promise; }; type ElectronContextMenuItem = { diff --git a/package-lock.json b/package-lock.json index 1ef2a34f9f..b50e84bad2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "waveterm", - "version": "0.11.6-beta.4", + "version": "0.11.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "waveterm", - "version": "0.11.6-beta.4", + "version": "0.11.6", "hasInstallScript": true, "license": "Apache-2.0", "workspaces": [