1 · Manual mode round trip
idle
showPopover() and hidePopover() on
popover="manual", twice, with the closed state settling
back each time.
Go / no-go bench
The eight scenarios that gate replacing surface reparenting with the native manual Popover transport, scored by the page itself. Open it on the browser at the bottom of the proposed floor, press Run all, complete the two scenarios that need a real gesture, then copy the report into the design note.
It measures the platform subset the transport needs, so it answers the
same on master and on
poc/popover-manual-surfaces. Probe panels avoid
.flyout and .tooltip, whose
[popover] rules would replace the platform behavior being
measured. Scenario 4 mirrors
tests/browser/surface-inherited-context.test.js.
Background: docs/design-notes/popover-manual-poc.md.
Record this verbatim. A scenario score without the engine it was taken on proves nothing about a floor.
Two contracts that fail differently. The JavaScript primitives gate the
runtime — without them the transport cannot work at all. The CSS
features are @supports-gated enhancements: without them the
exit is instant and correct.
| Capability | Tier | Present |
|---|
checkVisibility() is listed because the migration shifts
the closed-state guard onto it, with getClientRects()
behind it. Which branch runs at the bottom of the floor is exactly what
has never been exercised — an absent row here is information, not a
failure.
showPopover() and hidePopover() on
popover="manual", twice, with the closed state settling
back each time.
A closed panel must render nothing and take no focus. The old
transport used [hidden]; the new one relies on the UA's
closed-state display: none, and nothing has ever
checked that on this engine.
The defect in one line: the old transport moved the panel in order
to open it. Identity of parentElement is compared
before, during and after — the node itself, not its id.
Theme island, density scope, application custom property. Each panel
is read closed, then open; a difference is the defect. These are the
three test.failing assertions.
The scenario that decides the migration. A modal dialog inerts the rest of the document — the reason the old transport moved panels into the dialog. The panel must win the hit test, stay in the dialog subtree, and take focus.
Hide, wait a third of the exit, show again. The panel must end open
and painted — a stuck discrete display transition would
leave it invisible while reporting open.
Needs a real gesture: right-click the target, or long-press it on a
touch screen. The panel must land at the reported point. The
fallback places it at a synthetic point, which exercises top-layer
placement but not the contextmenu event.
Reproduces the ::backdrop refutation. The native
backdrop is painted, but the UA forces
pointer-events: none on it, so it cannot absorb a
click; an Actual scrim element can. The run ends with a five-second
window — click the dimmed area with a real pointer to confirm.
Paste this under Go / no-go: WebKit verification in
docs/design-notes/popover-manual-poc.md. Correct the engine
line by hand if the user-agent string lied about it — a browser stack
profile often does.