Files
BrowserSkill/apps/extension/test-fixtures/rendered-surfaces

Rendered Surface browser fixtures

These pages exercise Canvas discovery through a real browser DOMSnapshot and AX tree. They are deliberately framework- and site-independent.

Serve

From the repository root:

python3 -m http.server 4173 --bind 127.0.0.1 \
  --directory apps/extension/test-fixtures/rendered-surfaces

Use an Agent Window large enough to keep the primary matrix visible:

bsk session start --width 1440 --height 1100
bsk navigate http://127.0.0.1:4173/index.html --session <id>
bsk observe --session <id>

Always stop the session after the run.

Pages

index.html

Expected individual Surface labels:

  • fixture-basic-large
  • fixture-tiny-8px
  • fixture-pointer-events-none
  • fixture-partial-ax
  • fixture-contained-outer
  • fixture-contained-inner
  • fixture-different-parent-a
  • fixture-different-parent-b

Expected one grouped Surface:

  • fixture-layered-group, with layers=2

Expected absent:

  • fixture-display-none
  • fixture-visibility-hidden
  • fixture-opacity-zero
  • fixture-parent-opacity-zero
  • fixture-hidden-attribute
  • fixture-inert-parent
  • fixture-aria-hidden-parent
  • fixture-zero-size
  • fixture-offscreen-right
  • fixture-fully-overflow-clipped

fixture-partially-overflow-clipped must remain present because part of it is visible. Its screenshot must contain only the browser's final composited view.

unlabeled.html

This page contains eight Canvas elements but must render seven generic Surface markers because the two coincident layers form one group.

  • Every marker uses the stable fallback label canvas visual surface.
  • Exactly one marker has layers=2.
  • The two contained canvases remain separate markers.
  • id, class, data-testid, nearby prose, and fallback AX content never become a Surface label.
  • Blank aria-label and title values behave as no label.
  • Fallback AX content does not suppress the corresponding Surface.

frames.html

Expected Surface labels:

  • fixture-same-origin-frame
  • fixture-cross-origin-frame
  • fixture-nested-frame

The cross-origin frame uses http://localhost:4173 while the parent uses http://127.0.0.1:4173. With Chromium site isolation this exercises the OOPIF path without an external service.

viewport.html

Run with a 900x700 Agent Window.

  • fixture-partial-viewport is partly visible and must be represented.
  • fixture-below-fold is absent initially.
  • After scrolling it into view and observing again, fixture-below-fold must be represented with a fresh ref.

dynamic.html

Use the normal DOM buttons and re-observe after each action:

  • Initial state: fixture-dynamic absent.
  • After Insert canvas: present.
  • After Resize to zero: absent.
  • After Restore size: present with a fresh ref.
  • After Remove canvas: absent.

sparklines.html

Expected Surface labels fixture-sparkline-01 through fixture-sparkline-20 must all be present. The adjacent, non-overlapping canvases remain twenty independent screenshot-only Surface refs.

Invariants

  • snapshot must not emit any of these Surface markers.
  • observe must emit only currently visible Canvas surfaces.
  • Existing DOM/AX controls remain readable alongside Surface markers.
  • Missing labels never prevent discovery; naming and discovery are independent.
  • A Surface ref allows screenshot --ref and rejects ordinary click/fill/hover/select.
  • No fixture URL, id, label, or layout constant may appear in production discovery code.