fix(browser): close the round-three parked-page reporting and reuse gaps

- Reusing a page id while its close was still tearing down let the new
  renderer register and the old close then unregister it, leaving a page the
  runtime owned but no command could resolve. A create now waits out an
  in-flight release for that id, which orders the whole reuse.
- Closing a parked page told nobody: it has no WebContents teardown for the
  session-tabs publication to piggyback on, so a paired client kept showing a
  ghost tab until an operation against it failed.
- A page waiting on a certificate decision was parkable. Its challenge id dies
  with the renderer, so parking discarded both the warning and the ability to
  approve it. Such a page is work waiting on an answer and stays resident.
- The load helper resolves on its own 30s timeout, so `loading` stopped
  covering a navigation that was merely slow. The renderer is asked directly.
- An iframe changing its own hash fires did-navigate-in-page too, and its
  address was being recorded as the tab's — waking would have landed the page
  on the iframe's document. Only main-frame navigations move the record.
- `tab switch --index` reported the position the wake had renumbered the target
  to, which described neither the request nor the listing the caller read.

Each mutation-checked. An ownership guard added alongside the reuse fix turned
out to be unreachable once creates are ordered, so it is not here.
This commit is contained in:
Jinwoo-H
2026-08-19 19:07:12 -04:00
parent 107f0b957b
commit de4fef9c5a
7 changed files with 186 additions and 18 deletions
+2 -2
View File
@@ -289,8 +289,8 @@ targets it transparently rebuilds the renderer and reloads the address. What a
park does _not_ preserve is in-page JavaScript state — cookies and local
storage live in the profile partition and survive, but an unsubmitted form or
an SPA's in-memory state does not. A page is never parked while a paired
client is streaming it, while a command against it is in flight, or while its
navigation has not committed.
client is streaming it, while a command against it is in flight, while it is
still navigating, or while it is waiting on a certificate decision.
Two evictors decide what stays resident, mirroring terminal pane parking. The
cap is the primary one: