diff --git a/src/renderer/src/components/browser-pane/assemble-chrome/browser-workspace-pane.tsx b/src/renderer/src/components/browser-pane/assemble-chrome/browser-workspace-pane.tsx index 7a883e3e162..e473f442a90 100644 --- a/src/renderer/src/components/browser-pane/assemble-chrome/browser-workspace-pane.tsx +++ b/src/renderer/src/components/browser-pane/assemble-chrome/browser-workspace-pane.tsx @@ -22,7 +22,10 @@ import { WorkspaceDocPagePane } from '../workspace-doc/workspace-doc-page-pane' import { DeferredBrowserContent } from './DeferredBrowserContent' import { isBrowserPagePanePaintable } from '../host-guest/browser-page-paintability' import { SshRoutedBrowserPageGate } from './ssh-routed-browser-page-gate' -import { useAnyBrowserPageMountAdmission } from '../host-guest/browser-page-mount-admission' +import { + isBrowserPageMountAdmitted, + useAnyBrowserPageMountAdmission +} from '../host-guest/browser-page-mount-admission' export default function BrowserPane({ browserTab, @@ -168,7 +171,9 @@ export default function BrowserPane({ key={page.id} retainMounted={isWorktreeActive} mountEligible={isBrowserPagePanePaintable({ - isActive: (isActive && page.id === activeBrowserPageId) || hasAdmittedPage, + isActive: + (isActive && page.id === activeBrowserPageId) || + (hasAdmittedPage && isBrowserPageMountAdmitted(page.id)), isAutomationVisible: automationVisiblePageIds.has(page.id), isMobileDriven: mobileDrivenPageIds.has(page.id), hasRemoteViewer: remotelyViewedPageIds.has(page.id) diff --git a/src/renderer/src/components/browser-pane/host-guest/browser-page-mount-admission.ts b/src/renderer/src/components/browser-pane/host-guest/browser-page-mount-admission.ts index ba0b994846c..3c2b1c8a706 100644 --- a/src/renderer/src/components/browser-pane/host-guest/browser-page-mount-admission.ts +++ b/src/renderer/src/components/browser-pane/host-guest/browser-page-mount-admission.ts @@ -6,6 +6,10 @@ const admittedPageIds = new Set() const listeners = new Set<() => void>() let version = 0 +export function isBrowserPageMountAdmitted(pageId: string): boolean { + return admittedPageIds.has(pageId) +} + function emit(): void { version += 1 for (const listener of listeners) { @@ -36,11 +40,11 @@ export function useBrowserPageMountAdmission(pageId: string): boolean { }, () => { void version - return admittedPageIds.has(pageId) + return isBrowserPageMountAdmitted(pageId) }, () => false ) - return admittedPageIds.has(pageId) + return isBrowserPageMountAdmitted(pageId) } export function useAnyBrowserPageMountAdmission(pageIds: readonly string[]): boolean { @@ -51,9 +55,9 @@ export function useAnyBrowserPageMountAdmission(pageIds: readonly string[]): boo }, () => { void version - return pageIds.some((pageId) => admittedPageIds.has(pageId)) + return pageIds.some(isBrowserPageMountAdmitted) }, () => false ) - return pageIds.some((pageId) => admittedPageIds.has(pageId)) + return pageIds.some(isBrowserPageMountAdmitted) } diff --git a/src/renderer/src/store/slices/browser/browser-close-actions.ts b/src/renderer/src/store/slices/browser/browser-close-actions.ts index 3aa77f9e46c..ad979dae145 100644 --- a/src/renderer/src/store/slices/browser/browser-close-actions.ts +++ b/src/renderer/src/store/slices/browser/browser-close-actions.ts @@ -13,6 +13,7 @@ import { closeRemoteBrowserPageInOwningEnvironment } from './browser-remote-clos import { releaseDocPreviewGrant } from '@/lib/doc-preview-grants' import { destroyWorkspaceWebviews } from '../browser-webview-cleanup' import { omitRecordKeys } from '../worktrees/teardown/record-key-omission' +import { releaseBrowserPageMount } from '@/components/browser-pane/host-guest/browser-page-mount-admission' export function createBrowserCloseActions( set: BrowserSliceSet, @@ -28,6 +29,7 @@ export function createBrowserCloseActions( // grant is the only authority the preview scheme honors — a closed document must stop being // readable, and it must stop being readable even if the reducer bails out below. let docPageIdsToRelease: string[] = [] + let closedPagesForMountRelease: string[] = [] let activeBrowserWorktreeIdToNotify: string | null = null set((s) => { let owningWorktreeId: string | null = null @@ -49,6 +51,7 @@ export function createBrowserCloseActions( } const closedPages = s.browserPagesByWorkspace[tabId] ?? [] + closedPagesForMountRelease = closedPages.map((page) => page.id) const nextBrowserPagesByWorkspace = { ...s.browserPagesByWorkspace } delete nextBrowserPagesByWorkspace[tabId] const nextBrowserAnnotationsByPageId = { ...s.browserAnnotationsByPageId } @@ -179,6 +182,9 @@ export function createBrowserCloseActions( for (const docPageId of docPageIdsToRelease) { releaseDocPreviewGrant(docPageId) } + for (const pageId of closedPagesForMountRelease) { + releaseBrowserPageMount(pageId) + } for (const tabs of Object.values(get().unifiedTabsByWorktree)) { const workspaceItem = tabs.find(