Skip to content

Match live form-control pseudo-class state and bounded invalidation #257

Description

@wieslawsoltes

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

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

  1. 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.
  2. Define the live IDL/content-attribute source for input, textarea, select, option, and form state.
  3. Add dependency metadata and one bounded invalidation checkpoint for value, selection, placeholder, required, pattern, range, checked, disabled, reset, and form-owner changes.
  4. 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

  1. live form-state model + matcher contracts;
  2. dependency invalidation + cascade/scene mutation;
  3. remaining pseudo-class slices and WPT promotion;
  4. 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    vscode-oss/plannedPlanned for the AppScene/WebScene VS Code OSS integration

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions