diff --git a/packages/app/src/components/browser-webview-resident.browser.test.ts b/packages/app/src/components/browser-webview-resident.browser.test.ts index 3935a3b28..d5be14d43 100644 --- a/packages/app/src/components/browser-webview-resident.browser.test.ts +++ b/packages/app/src/components/browser-webview-resident.browser.test.ts @@ -101,6 +101,39 @@ describe("resident browser webviews", () => { expectResidentWebviewParking(webview as HTMLElement); }); + it("normalizes an existing resident webview and its stale host before reusing them", () => { + const staleHost = document.createElement("div"); + staleHost.id = RESIDENT_HOST_ID; + staleHost.style.left = "-20000px"; + staleHost.style.width = "1280px"; + staleHost.style.height = "800px"; + staleHost.style.opacity = "0"; + staleHost.style.display = "none"; + + const staleWebview = document.createElement("webview"); + prepareBrowserWebview(staleWebview, { + browserId: "browser-stale-child", + initialUrl: "https://example.com", + }); + staleWebview.style.display = "none"; + staleWebview.style.width = "1px"; + staleWebview.style.height = "1px"; + staleWebview.style.position = "fixed"; + staleWebview.style.left = "-20000px"; + staleHost.appendChild(staleWebview); + document.body.appendChild(staleHost); + + const webview = ensureResidentBrowserWebview({ + browserId: "browser-stale-child", + url: "https://example.com/agent", + }); + + expect(webview).toBe(staleWebview); + expect(Array.from(staleHost.children)).toEqual([staleWebview]); + expectPermanentHostParking(staleHost); + expectResidentWebviewParking(staleWebview); + }); + it("parks resident webviews as an overlapping stack", () => { const firstWebview = ensureResidentBrowserWebview({ browserId: "browser-first", diff --git a/packages/app/src/components/browser-webview-resident.ts b/packages/app/src/components/browser-webview-resident.ts index 6b1ad0f60..ac752593f 100644 --- a/packages/app/src/components/browser-webview-resident.ts +++ b/packages/app/src/components/browser-webview-resident.ts @@ -117,13 +117,14 @@ export function ensureResidentBrowserWebview(input: { const resident = residentWebviewsByBrowserId.get(browserId) ?? null; if (resident?.isConnected) { + releaseResidentBrowserWebview(browserId, resident); return resident; } const existing = findBrowserWebview(browserId, ownerDocument); if (existing) { if (existing.parentElement?.id === RESIDENT_BROWSER_HOST_ID) { - residentWebviewsByBrowserId.set(browserId, existing); + releaseResidentBrowserWebview(browserId, existing); } return existing; }