CDP / Playwright smoke
Run the rendered product smoke with:
mise install
just flutter-cdp-playwright-smoke
Cage launches the release Flutter executable in chrome-less CDP mode. That host
owns the sole BrowserCore, one vixen-cdp subscriber, and the same formatter and
commit painter used by the GUI. There is no native rendered Playwright smoke.
The smoke proves:
playwright-coreconnects throughchromium.connectOverCDP(...).- Target/page/runtime/network/DOM enable and navigation methods route to the selected BrowserCore context.
- Playwright obtains layout from an exact Flutter commit.
- One stable live
DOMStringMapwrite reflects todata-layout-mode, advances the normal mutation/cascade path, returns 140×32 synchronous page geometry, then matches CDP DOM attributes/geometry and a pinned distinct Flutter PNG. - One retained live
classListsurvives the pointer-drivenclassmutation, reflectsclicked, agrees with 140px synchronous/CDP geometry, and produces a second pinned exact Flutter PNG. - One retained live
relListsurvives external and list-drivenrelwrites on a real anchor, reflects ordered tokens, agrees with 120×32 synchronous/CDP geometry, and produces a third pinned exact Flutter PNG without changing the earlier hashes. - One retained iframe
sandboxlist survives external and list-driven writes, reflects valid ordered tokens, agrees with 120×32 synchronous/CDP geometry, and produces a fourth pinned exact Flutter PNG without changing earlier hashes. - One retained inline
CSSStyleDeclarationsurvives external and declaration API writes, reflects current serialized declarations, agrees with 120×32 synchronous/CDP geometry, and produces a fifth pinned exact Flutter PNG. - One retained
NamedNodeMapand attachedAttrsurvive external andAttr.valuewrites, preserve indexed/named identity, agree with 120×32 synchronous/CDP state, and produce a sixth pinned exact Flutter PNG. - Retained structural collections start empty, reflect the pointer-created
rendered
#dynamic.badgethrough indexed/named access, and agree with an authoritative CDP node while a preexisting selector-all list remains static. - One retained author
StyleSheetList/sheet/rule/declaration graph survives every earlier mutation, reflects a style-element rewrite, agrees with 120×32 synchronous/CDP state, and produces a seventh pinned exact Flutter PNG. - A detached Attr replaces, detaches from, and reattaches to one retained
NamedNodeMap; in-use rejection, 120×32 synchronous/CDP state, stable identity, and an eighth pinned exact Flutter PNG agree. - Parser classics, per-script microtasks, a deferred top-level-await module, one real static dependency, one real dynamic dependency, and a post-load document task execute in pinned order; the module-owned 120×32 target agrees with CDP and a ninth pinned exact Flutter PNG.
- Pointer input uses the displayed commit's Flutter hit-test handle and target; the C ABI has no raw coordinate command.
- Later DOM/style mutation produces a new source revision and distinct exact scene.
Page.captureScreenshotand high-level screenshot return direct Flutter scene PNGs without browser/compositor chrome.- Simultaneous 320×240 and 480×300 targets keep source, viewport, input, and scene state independent.
- Switching targets does not lose presentation state.
- Forced renderer reset requests a full snapshot and recovers a byte-identical scene.
- Runtime, network, permissions, tracing, history, dialog, form/text input, and stable protocol-error slices remain available through the shared CDP core.
Native vixen-headless --cdp is text/runtime-only. Screenshot, layout geometry,
and pointer hit testing fail closed there. Rust CDP tests cover dispatcher,
session, lifecycle, cancellation, network, profile, and runtime behavior without
inventing renderer output.
Add methods only when this smoke or the Flutter fixture manifest demonstrates a real product gap.