Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Vixen compatibility target

This is the honest v1.0 target matrix. It is not a claim of full Firefox or full WPT compatibility. Vixen delegates CSS cascade/selectors, HTML parsing, JS execution, and paint where credible upstream Rust/Firefox-family components exist; layout is Vixen-owned Rust code per ADR-013 and therefore WPT-gated by feature.


Current measured committed fixture baseline

As of 2026-07-10, fixtures/manifest.json contains 70 local fixtures plus 199 imported smoke fixtures:

CategoryFixtures
css17
css-cascade/css-values50
dom25
dom-core50
events1
flexbox5
forms28
grid5
layout9
layout block/inline/position6
network2
paint4
paint/ref-equivalent8
security9
selectors50
Total269

Total manifest checks: 2015.

Current check mix:

Check typeCount
selector-count398
selectors-exact223
title268
js-eval587
computed-style170
element-attribute132
layout-box104
body-contains68
visual-hash25
no-critical-diagnostics21
ref-equivalent11
display-list-contains3
dom-nodes-range1
min-nodes1
selector-match3

This local fixture set is release-blocking and must remain 100 % green. The layout category currently includes normal-flow, inline-flow, positioned, flex row/column, grid, overflow coordinate/paint, and fragment-backed text paint fixtures with layout-box and display-list-contains assertions. The paint category includes three local ref-equivalent smoke fixtures against the stable display-list render projection. The harness now reports overall, per-category, and local/imported source×category pass rates. Its adapter now creates production BrowserCore contexts, so fixture snapshots/selectors/styles/evaluation/reference rendering/pixel capture share typed document/runtime generations and persistent per-context V8 realms rather than constructing harness-owned Pages or runtimes. Imported upstream WPT layout/paint coverage is still tracked separately below. Imported selector smoke has reached the 50-fixture target, including focused :has() child/descendant/adjacent-sibling/general-sibling and selector-list smoke plus attribute operators/flags, class/id matching, structural and typed structural pseudos, link/form/read-write/autofill/defined pseudos, negation/list pseudos, grouping de-duplication, and document-order coverage. Local CSS computed-style coverage now includes the Milestone 1 advanced cascade seam: @media, @supports, @layer, inherited custom properties, var() fallback, and CSS-wide keyword projection through Page. Imported css-cascade/css-values smoke has reached the 50-fixture target, including specificity/source order, important and inline precedence, combinator/attribute-operator matching, structural/link/form pseudo selectors in cascade, :is()/:where()/:not()/:has() selectors, selector-list splitting, custom properties, declaration recovery, comments, math/color/gradient/transform/shorthand values, and quoted/nested/function declaration values. Imported DOM-core smoke has reached the 50-fixture target, including query/getElementById/querySelectorAll, document/root/body access, tag/class/wildcard collections, attributes, reflected host properties, text aggregation, parent/child/sibling traversal, null relation checks, document URL, forms collection length, matches(), logical selectors, and :has()-backed matching. Imported forms smoke has reached the 25-fixture target across reflected/default form/control properties, labels, radio/checkbox/select states, textarea text, form tree traversal, repeated names, and :has() form selectors. Local Phase 6 fixtures now also assert runtime/Page-backed js-eval projections for getComputedStyle(), document/navigator state (documentURI/baseURI, focus, and active-element shape included), op-backed in-memory Web Storage mutation with key/value validation and quota errors, Event/CustomEvent/dispatchEvent() smoke, the pinned focusoutfocusinblurfocus transition with relatedTarget, Page-owned active-element restore, CSSOM CSS.supports() / document.styleSheets plus CSSStyleRule / CSSStyleDeclaration read-only shape, viewport/window state, DOMRect geometry via getBoundingClientRect() / getClientRects(), client/offset/scroll metrics, getBoxQuads(), Range rectangles, Geometry Interfaces value constructors (DOMPoint/DOMRect/DOMQuad/DOMMatrix), DOM ancestry/core-node projections (closest(), nodeName/nodeType, ownerDocument), anchor URL decomposition/reflection, DOMParser, atob/btoa, classList/ relList/sandbox, dataset, ValidityState/checkValidity(), FormData entry-list and iterator projection plus runtime/CDP form submission by page node id with successful submitter overrides, runtime form reset/default-state restore, meta/content reflection, innerHTML/outerHTML, URL.canParse(), data: URL parsing, new URL()/URLSearchParams constructor and iterator seams, TextEncoder/TextDecoder (encodeInto and constructor options included), <img>.currentSrc plus image alt/dimension/loading/decode reflection, inert media element state (HTMLMediaElement/audio/video constants included), resource element reflection (link/style/script/source), single-range Range/Selection state with Page-owned element-boundary restore, direction, point queries, same-container clone/extract/delete/insert/surround operations, and selectionchange delivery, read-only history accessors, details/dialog open-state reflection, miscellaneous HTML reflected attributes for lists, quotes, embedded content, and table cells, progress/meter numeric state, inert Canvas 2D context smoke, form-associated reflected attributes and editing helpers, read-only table collections/indexes, HTMLElement interaction/global reflected attributes, text track / track-element state, inert OffscreenCanvas/ImageData/ImageBitmap/Path2D APIs, minimal ShadowRoot/DocumentFragment smoke, template content and slot assignment shape, DOM construction/serialization helpers, structuredClone, CDP Runtime.awaitPromise over stored promise handles, MutationObserver lifecycle, TreeWalker/NodeIterator traversal, Headers iteration, Blob/File, read-only Request/Response state with forbidden header filtering, Response.error() / Response.redirect() / Response.json(), op-backed fetch() HTTP(S) status/header/body reads plus URL-policy/private-host rejection with CDP Network.loadingFailed diagnostics, credential-correct CORS, bounded origin/target/credentials-partitioned preflight caching (including effective CDP extra headers), strongest-algorithm Request SRI verification before exposure/cache insertion, AbortSignal, URLPattern, CDP lifecycle opt-in (init/commit/DOMContentLoaded/load), Performance timing shape, matchMedia(), Permissions API query state, Notification permission state, and StorageManager estimate/persisted state backed by profile/storage records before the remaining host-object swap; Encoding API constructors, Web Storage mutation, focused fetch() success/blocking checks, sequential global/storage persistence across Runtime.evaluate, focused document/Element snapshot host-object evals, and read-only DOMTokenList/DOMStringMap property reads are also exercised directly through the persistent deno_core runtime seam. Runtime platform smoke now additionally covers secure crypto.getRandomValues() / randomUUID(), async Clipboard text and ClipboardItem shape, MessageEvent, MessageChannel, BroadcastChannel, first-callback IntersectionObserver / ResizeObserver geometry, and a fail-closed WebSocket close path. Imported smoke fixtures now also seed block/inline/position layout, flexbox, grid, and display-list ref-equivalent paint; imported layout smoke covers auto margins, border-box sizing, inline flow, flex reverse/gaps, and grid minmax()/fractional row/gap cases. Imported paint smoke now covers currentcolor, overflow clipping, positioned boxes, flex/grid backgrounds, and nested background/text display-list equivalence.


Current automation smoke baseline

The external Playwright smoke covers connect/target/page/runtime/DOM/input/ network/dialog/screenshot/history/content/script/style/binding paths plus browser-context permission grant/reset, bounded Chromium JSON tracing through CDP IO streams, idle stop-loading behavior, and stable protocol errors. CDP permission overrides are exact-origin or wildcard scoped and do not mutate persisted user decisions. Trace records contain method/timing/session/success metadata only, not expressions, request headers, form values, or page text.

CDP targets now map to independent BrowserCore contexts/runtimes and share only profile-scoped state. BrowserCore source navigation is asynchronous, generation-checked, and directly cancellable; deterministic stop/supersede tests force late completions and prove no stale document/cookie commit. CDP currently waits synchronously for each matching terminal event, so active Page.stopLoading cannot yet race a Page.navigate on the same protocol connection. There is still no HTTP download manager or Playwright context-tracing archive implementation.


Current desktop shell smoke baseline

The GTK/libadwaita shell is not a WPT surface, but alpha daily-smoke builds now route one app-level worker and all tab ids through BrowserCore. Profile-session load/save and explicit clear-data selections use browser commands; empty or unavailable profiles fall back to the configured start page and records remain bounded by the profile store. Native gtk-shell checks may be host-package blocked; use the supported Flatpak build path for GUI verification.


WPT target profile

Full upstream WPT is too broad to summarize honestly with one percentage at v1.0. The release contract is a curated, imported WPT profile with measured pass counts by category. Small, Vixen-minimized upstream-derived smoke fixtures may live beside local fixtures and remain recorded in fixtures/manifest.json. Larger upstream slices should use committed WPT profile JSON plus an ignored, pinned upstream checkout (for example .tmp/wpt/) so review diffs contain only the selected paths/checks/provenance, not vendored WPT source files. Both paths feed the same vixen-wpt check types and reporting.

Areav1.0 targetExpected achievabilityNotes
HTML parsing/tree constructionBroad smoke subset greenHighhtml5ever carries parser behavior; Vixen must preserve node ids/tree shape.
SelectorsModern selector subset greenHighBacked by Stylo/selectors; include combinators, attributes, :is, :where, :has, form/link pseudos.
CSS cascade/computed valuesAuthor stylesheet + inline subset greenHigh after full Stylo sliceCompact cascade is temporary; full Stylo should unlock wider WPT coverage.
CSS layout: block/inlinev1 visual/ref subset greenMediumVixen-owned layout; start with normal flow, margin/border/padding, inline line boxes.
CSS layout: flex/gridUseful common-case subset greenMediumPure helpers exist; full WPT edge coverage is post-v1.
CSS layout: tables/floats/fragmentationNot v1 release-blockingLow for v1Document as unsupported/partial until implemented.
DOM CoreTraversal, attributes, token lists, ranges, mutation observer subset greenMediumVixen-owned Web APIs over deno_core host extensions after the ADR-014 migration.
Events/forms/history/storageSelected behavioral subset greenMediumGate by fixtures from SPEC invariants and imported WPT cases.
JS languageUse V8/deno_core language coverage, not WPT percentageHigh for languageWeb API exposure remains Vixen-owned and separately gated.
Paint/ref testsDisplay-list + WebRender visual subset greenMediumOne paint path; correctness depends on layout fragments and WebRender mapping.
Media/WebGPU/WebRTC/service workersOut of scope for v1Not targetedDeferred by ADRs / acceptance post-v1 scope.

Release-blocking WPT goals

For v1.0, Vixen should be able to claim:

  1. 100 % pass on local fixtures/manifest.json.
  2. Green imported WPT smoke profile for parser, selectors, cascade, DOM core, forms, and the v1 layout subset.
  3. Measured pass counts published here for every imported category.
  4. No global full-WPT percentage claim until the harness imports and runs a representative upstream WPT checkout.

Initial import targets before v1.0:

Imported WPT areaMinimum useful target
selectors/css-scoping/css-nesting selector behavior50 fixtures
css-cascade / css-values computed-value behavior50 fixtures
dom/nodes + traversal + ranges50 fixtures
html/semantics/forms basics25 fixtures
css/css-display + css-box + css-position normal-flow layout40 fixtures
css-flexbox common cases25 fixtures
css-grid common cases25 fixtures
paint/ref-equivalent smoke20 fixtures

These are minimum profile sizes, not final compatibility claims. The measured pass table below must be filled from vixen-wpt output as the fixtures land.

Imported WPT areaFixtures runChecks runPassedPass rateNotes
selectors50232232100.0%Target reached: :has() child/descendant/adjacent-sibling/general-sibling and selector-list smoke, attribute operators/flags, class/id matching, structural and typed structural pseudos, link/form/read-write/autofill/defined pseudos, negation/list pseudos, grouping de-duplication, and document-order coverage.
css-cascade/css-values50250250100.0%Target reached: specificity/source order, importance/inline, combinator/attribute operator matching, structural/link/form pseudo cascade, functional pseudo specificity, selector-list splitting, custom properties, declaration recovery, comments, math/color/gradient/transform/shorthand values, and quoted/nested/function declaration values.
dom-core50250250100.0%Target reached: query/getElementById/querySelectorAll, document/root/body access, tag/class/wildcard collections, attributes, reflected host properties, text aggregation, parent/child/sibling traversal, null relation checks, document URL, forms collection length, matches(), logical selectors, and :has()-backed matching.
forms25134134100.0%Required/optional/disabled/checked controls, labels/buttons/form attributes, reflected/default input/form/select/option properties, textarea text, tree traversal, repeated names, and :has() form selectors.
layout block/inline/position63030100.0%Block flow, margin/padding/border, auto margins, border-box sizing, inline flow, and relative/absolute positioned smoke.
flexbox52525100.0%Row/column grow-basis, gap/padding, and reverse-axis smoke.
grid52626100.0%Fixed, fractional, minmax(), row/column gap, and fixed-height fractional-row smoke.
paint/ref-equivalent82424100.0%Display-list reference-equivalent background/text, currentcolor, overflow clipping, positioned, flex/grid, and nested-background smoke.

Known v1.0 layout gaps

Expected unsupported or partial areas unless promoted by WPT/real-site evidence:

  • table layout
  • floats and float avoidance
  • full vertical writing modes / vertical text shaping
  • page fragmentation / pagination / print layout
  • advanced intrinsic sizing cycles (min-content / max-content edge cases)
  • complete absolute/fixed/sticky interaction matrix
  • full SVG layout integration

Each gap should fail closed where possible, emit diagnostics when visible to users/tests, and receive a WPT fixture before being marked supported.