perf: isolate browser eviction veto from pure retention selectors (#29765)

This commit is contained in:
Neil
2026-10-16 09:54:58 -07:00
committed by GitHub
parent 5a72a206b7
commit aecffcc696
4 changed files with 17 additions and 17 deletions
@@ -1,9 +1,7 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'
import type { BrowserWorkspace } from '../../../../../shared/browser-workspace-types'
import {
browserTabsVetoGuestEviction,
selectBrowserGuestEvictionWorktreeIds
} from './browser-guest-worktree-retention'
import { browserTabsVetoGuestEviction } from './browser-guest-eviction-veto'
import { selectBrowserGuestEvictionWorktreeIds } from './browser-guest-worktree-retention'
import { hydrateBrowserDrivers } from '../../../lib/pane-manager/browser-mobile-driver-state'
import { hydrateBrowserRemoteViewerPages } from '../../../lib/pane-manager/browser-remote-viewer-state'
import {
@@ -0,0 +1,14 @@
import type { BrowserWorkspace } from '../../../../../shared/browser-workspace-types'
import { browserTabVisibilityPageIds } from './browser-guest-worktree-retention'
import { hasActiveBrowserPageDownload } from '../navigate/browser-page-download-activity'
import { browserPageNeedsPaintRetention } from './browser-guest-paint-retention'
// Why eviction needs more than the paint terms: eviction DESTROYS the guest rather than parking
// it, and main cancels a page's active downloads when its guest unregisters (tab-close semantics).
export function browserTabsVetoGuestEviction(tabs: readonly BrowserWorkspace[]): boolean {
return tabs.some((tab) =>
browserTabVisibilityPageIds(tab).some(
(pageId) => browserPageNeedsPaintRetention(pageId) || hasActiveBrowserPageDownload(pageId)
)
)
}
@@ -1,6 +1,4 @@
import type { BrowserPage, BrowserWorkspace } from '../../../../../shared/browser-workspace-types'
import { hasActiveBrowserPageDownload } from '../navigate/browser-page-download-activity'
import { browserPageNeedsPaintRetention } from './browser-guest-paint-retention'
// Why 4: every hidden worktree that retains browser guests keeps one Electron
// guest process per page alive purely for instant revisits, so guest memory
@@ -70,16 +68,6 @@ export function worktreeHoldsLiveBrowserGuests(
})
}
// Why eviction needs more than the paint terms: eviction DESTROYS the guest rather than parking
// it, and main cancels a page's active downloads when its guest unregisters (tab-close semantics).
export function browserTabsVetoGuestEviction(tabs: readonly BrowserWorkspace[]): boolean {
return tabs.some((tab) =>
browserTabVisibilityPageIds(tab).some(
(pageId) => browserPageNeedsPaintRetention(pageId) || hasActiveBrowserPageDownload(pageId)
)
)
}
// Mirrors BrowserOverlaySlot's page-id derivation so visibility pinning
// (automation-visible / mobile-driven) protects exactly the slots it paints.
export function browserTabVisibilityPageIds(tab: BrowserWorkspace): readonly string[] {
@@ -1,8 +1,8 @@
import { useEffect } from 'react'
import { useAppStore } from '../store'
import { onBrowserGuestPaintRetentionChange } from './browser-pane/host-guest/browser-guest-paint-retention'
import { browserTabsVetoGuestEviction } from './browser-pane/host-guest/browser-guest-eviction-veto'
import {
browserTabsVetoGuestEviction,
selectBrowserGuestEvictionWorktreeIds,
touchBrowserGuestWorktreeRecency,
worktreeHoldsLiveBrowserGuests