Repository navigation
Match live form-control pseudo-class state and bounded invalidation #257
Description
Active implementation checkpoint — 20 September 2026
Exact upstream heads are WebScene 3cc78ac28101e23f07ded947b44869277da6632d and AppScene acf42662309ea601720ed07c440cf183d7c73fe3; unchanged Code OSS is 645f29cc3176500b4b5762ba887cf2a7f0ffdf2c. Local vscode-demo is 06b5fa4328bae547e40462cbd049b6322f8e8d8e, clean, 294 commits ahead, and intentionally unpushed with Actions disabled.
Focused merge stacks
- Worker/resource stack — merged: WebScene Load dynamically inserted CSS imports asynchronously #702, Complete WorkerOptions and worker load policy #703, Enforce Worker policy across redirect hops #705 and Expose fetch request headers to resource hosts #707; AppScene Expose CSS retained-effect computed values #282; local vscode-demo Add native WebGPU runtime support #10. Dynamic CSS imports, Worker options/credentials/CORS, per-hop redirect validation, and request-header ABI v5 are on main.
- Interactive validation stack — merged: WebScene Present bounded interactive reportValidity feedback #709, Fix validation message text measurement #711, Dismiss stale validation feedback after mutations #712, Bound validation message wrapping and formatting #718, Add bounded validation message formatter ABI #721, Add bounded validation message timeout #723, Bound form ownership invalidation #724, Reflect form labels in semantic validity #725, Implement bounded custom element states #726, Implement live form control collections #727, Implement bounded form state restoration #728 and Wire Flutter validation localization #729; AppScene Wake native runtime for queued WebSocket events #284; local vscode-demo Broaden WebScene compatibility coverage and release gates #11. This includes focused invalid reporting, text-measurement repair, stale-feedback dismissal, bounded wrapping, localization ABI, optional timeout scheduling, and mutation-local form/fieldset ownership invalidation.
- Selector/pseudo stack — merged through scoped selection: WebScene Complete selector matching, specificity, and dependency invalidation coverage #237/Match live hyperlink selector state #730, Implement bounded local-link selector state #735, Implement bounded target-within selector state #736 and Implement functional local-link path depth #737 merged live location selectors; Paint Code OSS placeholder pseudo styles #738 merged paint-only Code OSS
::placeholder; Implement static Code OSS details content #739 merged the bounded static subset for the ten unchanged Code OSS::details-contentrules. Native GitHub stack #745 merged atomically as Implement live Range boundaries for Code OSS highlights #742 (live Range boundaries), Add Highlight and CSS.highlights registry for Code OSS #744 (bounded Highlight/CSS.highlights registry), and Paint CSS Custom Highlight ranges for Code OSS (#746) #747 (functional::highlight(name)theme cascade plus retained range paint), closing Implement CSS Custom Highlight API for Code OSS ranges #740/Implement live Range boundaries for Code OSS highlights #741/Add Highlight and CSS.highlights registry for Code OSS #743/Paint CSS Custom Highlight ranges for Code OSS #746 at main7a2d0f8d. PR Paint scoped selection ranges for Code OSS #751 then merged global/scoped::selectioncascade, theme colors, forward/backward range normalization, and retained background/foreground commands at main2c83b45f, closing Paint scoped ::selection ranges for Code OSS and xterm #750. Focused native/compiler run35469464706and precompiled contracts35469464714passed. Details animation/compositing, control-part/shadow-selector inventory, and remaining CSS work stay recorded in Complete selector matching, specificity, and dependency invalidation coverage #237/[Epic] CSS features, compatibility, validation, and performance #235. - Typed transition stack — merged: WebScene PR Implement typed registered custom-property animations #752 merged typed
<angle>/<percentage>@propertysupport. PR Implement Code OSS starting-style entry transitions #753 then merged Implement @starting-style entry transitions used by Code OSS #749 at main3cc78ac2, adding document-level@starting-style, precedence-correct starting cascades, first-render/display re-entry, opacity/2D transform/background-color admission,transition-behavior: allow-discrete, computed-versus-used display behavior,CSSStartingStyleRule, detached-state release, reinsertion, teardown, and a zero-allocation guard across 256 unrelated nodes. Focused precompiled JavaScript35473084845, Linux native SDK35473084825, and native Linux document contracts35473084848passed. - Consolidations — open and deliberately unmerged: WebScene Add Code OSS browser and native desktop compatibility #76 is refreshed to
ed2eb2c57ec6b1a8bda4bd75747379a7c19c86cf; AppScene Stream native application video directly from file and network URLs #65 is at2d2407f5e38c4cdd3d851394a5636cc0a8ce9064; vscode-demo Typescript #1 tracks the local unpushed integration branch.
One-agent mode is enforced. No subagent is active. Reusable runtime behavior continues to land in WebScene or AppScene; unchanged Code OSS remains pinned. The change-related #752 and #753 runs passed. Broad PR CI/NuGet plus consolidation, post-merge main and previous-main runs were canceled to release runners; no WebScene job is intentionally retained between focused PRs. Full package, performance, visual, physical-platform and VM qualification remains deferred under the fast implementation directive; focused parser/native correctness and allocation checks are complete locally.
Next: finish the remaining planned CSS and product features, then physical Linux pixels, synchronization/device-loss/resize/soak/performance, visual comparison, VM/computer-use, and unchanged Code OSS Release qualification. Rich clipboard MIME, MULTIPLE/SAVE_TARGETS, recorded desktop-service/cross-platform work, workspace/Explorer, file/save, terminal, Markdown preview, accessibility, lifecycle, package-size, and no-browser promotion gates remain tracked and incomplete.
Parent epic: #235. Owning workstreams: selector/invalidation #237, cascade/value resolution #238, and dynamic state/frame scheduling #242.
Proven gap
The character-data audit on draft #245 produced a product-neutral textarea candidate that fails before its mutation assertions: :invalid reads the authored value attribute instead of the live control value, and :placeholder-shown is not implemented. That draft deliberately added no competing fix. Existing #237/#238 acceptance names state mutations generally but has no focused form-state source-of-truth and invalidation matrix.
This issue does not own #245's structural child-list routes/checkpoints. Start implementation only after #245 is rebased or its relevant test is relocated without conflict.
Ordered work
- Inventory form-state pseudos used by current contracts and reachable desktop/webview inputs:
:valid/:invalid,:required/:optional,:placeholder-shown,:read-only/:read-write, range states, checked/indeterminate, disabled/enabled, and supported user-valid/user-invalid behavior. - Define the live IDL/content-attribute source for input, textarea, select, option, and form state.
- Add dependency metadata and one bounded invalidation checkpoint for value, selection, placeholder, required, pattern, range, checked, disabled, reset, and form-owner changes.
- Qualify search, Settings, quick-input, issue-reporter, and extension/webview form surfaces that reach the supported slice.
Acceptance and performance gates
- Chromium/native WPT-derived match and computed-style matrices agree before and after programmatic value writes, native input, attribute mutation, reset, reparenting, and detach/reattach.
- Selector APIs and stylesheet matching use the same state while preserving the specified distinction between live properties and content attributes.
- Initial and mutation scene/pixel checks prove focus, placeholder, validation, and disabled styling without stale retained nodes.
- A 4,096-control matrix records state probes, matched rules, recascade roots/nodes, layout/scene/publication counts, time, allocations, and peak RSS. Unrelated controls/rules do not force full-document work.
- No duplicate structural invalidation implementation is introduced alongside Optimize structural CSS invalidation and DOM mutation checkpoints #245.
Proposed PR stack
- live form-state model + matcher contracts;
- dependency invalidation + cascade/scene mutation;
- remaining pseudo-class slices and WPT promotion;
- bounded performance and unchanged-product acceptance.
Current implementation checkpoint — 20 September 2026
No form-state source worktree remains. The full listed implementation sequence is merged: live control state and validity, submission/FormData/files, form-associated custom elements, ElementInternals validity, interactive reportValidity() feedback, ownership invalidation, labels/ARIA validity reflection, CustomStateSet, live form.elements, and bounded history/autofill restoration through #708–#720 and #713–#717/#721–#729.
This issue remains open only for direct WPT/runtime/product/performance promotion: unchanged Settings/search/quick-input/webview forms, exact pixels, 4,096-control mutation bounds, lifecycle/memory, and cross-platform package evidence. No duplicate source implementation is scheduled. Exact heads are WebScene ef1fa16e100883857804f7b7811ceffbe1a29867, AppScene 762bc24c2fb450385d4e6f963ddf3638b3c258f8, unchanged Code OSS 645f29cc3176500b4b5762ba887cf2a7f0ffdf2c, and local vscode-demo 8e174f84 (clean, 318 commits ahead, intentionally unpushed); current evidence remains zero under the no-validation direction.
Activity
wieslawsoltes commentedon Sep 17, 2026
Wave 1 scheduling boundary: begin this issue only after capability-matrix PR #271 lands and draft structural PR #245 is reconciled/settled. Consume #271's exact CSS evidence format and preserve #245's ownership of child-list routes, mutation checkpoints, scaling counters, and its current WPT profile edits.
The first #257 stack remains: (1) live input/textarea/select state source plus matcher contracts, (2) state dependency metadata and bounded invalidation/cascade/scene mutation, (3) remaining pseudo-class/WPT slices, and (4) 4,096-control performance plus unchanged-product acceptance. No #245-owned source file should be edited until its merge boundary is known.
wieslawsoltes commentedon Sep 18, 2026
Taking the first bounded #257 slice from exact WebScene main
bea90e8edb14dcb5a4c8e0257117934c3d462ea0.Live overlap audit: the only open PR is docs-only #76. Prerequisites #245/#271 and the #338/#339 Spotify resize work are merged; this slice will not extend those resize paths or own #238 value-resolution work.
Owned boundary for this slice:
:valid,:invalid, and:placeholder-shownconsume the existing live input/textarea value state;required/value/placeholderdependencies;css-textarea-dynamic-state.htmlcontract only with direct Chromium parity;Excluded: remaining form pseudos, full constraint validation/pattern/range algorithms, reset/form-owner work, general cascade/value serialization (#238), animation/media scheduling (#242), and further #338/#339 resize optimization. I will re-audit live PR paths before commit and PR.
wieslawsoltes commentedon Sep 18, 2026
First bounded live form-control state slice merged via PR #342 as
348ea440501c4059da6f95d1fbd6f6159a5df47b(source0d6d95a8e3007b833cbfa289f413bc70218d2f2d).Landed behavior:
:valid/:invalidand:placeholder-shownconsume live input/textarea value state;Evidence:
css-textarea-dynamic-state.html6/6;The Linux package matrix compiled and executed the new gate, then its broad aggregate failed the same six unrelated tests as the preceding main package run. That baseline comparison is recorded on PR #342.
This issue remains open for the excluded follow-on pseudo-classes and full constraint-validation slices.
wieslawsoltes commentedon Sep 18, 2026
Focused child #446 is complete through PR #447 at merge
a263f4e084dd510d9397ba4c9c7c57d44cb255a8(source499246522fbb3c5af9d231e23fa211e07a06c4d7, exact base4ea2feebd0dd7f2f08dfa1a8bfbbe1ca5f3d6c3b).The next live form-state slice now matches
:requiredand:optionalfor applicableinput,select, andtextareacontrols. Missing and unknown input types use text applicability; hidden, range, color, button-like inputs, buttons, and unrelated elements match neither state. Existing boundedrequiredinvalidation now also trackstypetransitions that change applicability.Implementation-only debt remains explicit: browser/WPT/native correctness, build, performance, allocation, memory, lifecycle, scene/pixel, product, hosted checks, and CI monitoring were skipped. Only
git diff --checkwas run. #257 stays open for read-only/read-write, range, checked/indeterminate, disabled/enabled, supported user-valid/user-invalid behavior, broader constraint validation/form ownership/reset, and cumulative validation/product acceptance.Consolidation PR #76 was not changed or merged.
wieslawsoltes commentedon Sep 18, 2026
Focused child #452 is complete through PR #453 at merge
580f177c18b067bd6b11aef9d7b2b2e400804a0d(sourcee4ae4c0d30b5b8c7b7e006bc3b432fe0809b905f, rebased base3813a31772917655f71be8a15b04aeb096a049d8after #450/#451).Native selector matching now derives
:read-writefrom mutable text-capable input/textarea state and inheritedcontenteditable=true/empty/plaintext-onlyregions, withcontenteditable=falseboundaries. Readonly or disabled text controls, non-text controls, and other non-editable elements match:read-only. Dependency metadata coversreadonly,type, inheriteddisabled, inheritedcontenteditable, and the first-legend structural boundary.Implementation-only debt remains explicit: browser/WPT/native correctness, build, performance, allocation, memory, lifecycle, scene/pixel, product, hosted checks, and CI monitoring were skipped. Only
git diff --checkwas run. DocumentdesignModeand richer editing-host behavior remain outside this slice. #257 stays open for range, checked/indeterminate, disabled/enabled acceptance, supported user-valid/user-invalid behavior, broader constraint validation/form ownership/reset, and cumulative validation/product acceptance.Consolidation PR #76 was not changed or merged.
wieslawsoltes commentedon Sep 18, 2026
Focused child #457 is complete through PR #459 at merge
1d663aeb825fd12ac1f9c3822a65a4c53fd07b1f(source510b77e5cba0d6e5698778a0de9ea9d29d941553, exact basea9f309c8ff80d701ef34e66aece8441e0f8f7fb6).WebScene now owns live non-reflected
input.indeterminatestate in the cold form-control record and exposes it through both DOM binding lanes. Checkbox:indeterminateconsumes that state; click activation clears it and canceled activation restores it with checkedness. Radio:indeterminateis derived from the existing live checkedness group, and checked property/native activation changes recascade bounded group members. The native checkbox affordance paints an indeterminate dash, and dependency metadata covers the live state plus checked/type/name and child-list inputs.Implementation-only debt remains explicit: browser/WPT/native correctness, binding checks, build, performance, allocation, memory, lifecycle, scene/pixel, product, hosted checks, and CI monitoring were skipped. The generated binding artifact was refreshed from the pinned manifest and
git diff --checkpassed. Complete form-owner/reparenting semantics, shadow-tree edge cases, and<progress>:indeterminateremain outside this slice. #257 stays open for range states, supported user-valid/user-invalid behavior, broader constraint validation/form ownership/reset, and cumulative validation/product acceptance.Consolidation PR #76 was not changed or merged.
wieslawsoltes commentedon Sep 18, 2026
Focused child #462 is complete through PR #465 at merge
b383afc181e4794ef7b7f5266cb8f5d51c6c41b1(source231aaf6405a63a781fa708edc73f9cdb5e52b0f1, rebased based27290970ef4913b89a083da89a220726ee5e29b).WebScene now matches
:in-range/:out-of-rangefor finite liveinput[type=number|range]values against validmin/maxbounds. Range controls use 0/100 defaults and an implied midpoint for an empty live value; empty or invalid number values match neither state.min/maxare reflected through both DOM binding lanes. A dedicated$live-form-rangedependency extends the existing live-value checkpoint so nonempty-to-nonempty property writes, native edits, and resets recascade only when numeric classification changes; type/min/max mutations use the standard attribute path.Implementation-only debt remains explicit: browser/WPT/native correctness, binding checks, build, performance, allocation, memory, lifecycle, scene/pixel, product, hosted checks, and CI monitoring were skipped. The generated binding artifact was refreshed from the pinned manifest and
git diff --checkpassed. Date/time/month/week types, step mismatch, bad-input sanitization, full constraint-validation APIs, user-valid/user-invalid, and cumulative acceptance remain open.This ends the requested implementation wave. Consolidation PR #76 was not changed or merged.
wieslawsoltes commentedon Sep 18, 2026
Implementation-only follow-up merged through child #474 / PR #475 as
efe3f3e7bddb67a2a92a173264693a86c2cef4f8.This adds complete CSS
:defaultmatching for authored checked checkbox/radio inputs, authored selected options, and the first submit-capable control owned by a form, including explicitformownership and iframe/document isolation. Direct defaults use targetedchecked/selectedinvalidation; the rare submitter ownership/order mutations (type,form,id, child-list) conservatively recascade so the replacement default is never stale.Per the implementation-only directive, WPT/browser/native tests, builds, mutation/performance/lifecycle gates, package qualification, and CI monitoring remain explicit debt on #474.
7 remaining items