Go / no-go bench

Popover transport probe

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.

This page loads no Actual JavaScript.

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.

0/8 scenarios passed

Engine

Record this verbatim. A scenario score without the engine it was taken on proves nothing about a floor.

Required subset

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.

Scenarios

1 · Manual mode round trip

idle

showPopover() and hidePopover() on popover="manual", twice, with the closed state settling back each time.

    Panel 1 Round trip

    2 · Closed means invisible

    idle

    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.

      Panel 2

      3 · The DOM parent never changes

      idle

      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.

        Panel 3 Stays home

        4 · Inherited context survives opening

        idle

        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.

          Theme island
          Density scope
          App scope

          5 · Inside a dialog, modal included

          idle

          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.

            Non-modal dialog
            Panel 5a
            Modal dialog

            Opened and closed by the scenario.

            Panel 5b

            6 · Reopening during the exit

            idle

            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.

              Panel 6 Interrupted exit

              7 · Placed at pointer coordinates

              idle

              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.

              Right-click or long-press here
                Panel 7 At the pointer

                8 · The scrim absorbs the pointer

                idle

                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.

                  Panel 8 Sheet-style

                  Report

                  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.