Skip to content

Publish bounded focused text selection for X11 PRIMARY #657

Description

@wieslawsoltes

Active implementation checkpoint — 19 September 2026

Exact upstream heads are WebScene 91fa294f5616f94ba5a24b3b08cdf7307166fc6e and AppScene fe14e7b775d347693d6526b7c4d49c0dca082e52; unchanged Code OSS is 645f29cc3176500b4b5762ba887cf2a7f0ffdf2c. Local vscode-demo is c543d2ca9ff97f3c9e256c5eda4193fad5b53c13 and remains intentionally unpushed with Actions disabled.

Merged Linux exact-device work remains complete through WebScene #654 and AppScene #270. Linux CLIPBOARD/PRIMARY and inbound/outbound Xdnd are merged through WebScene #658 and AppScene #280. CSS animation direction #659/#660 and fill modes #661/#662 are merged. The current-main native compiler failure exposed by #662 is tracked and fixed by #663/#664; generated selectors now preserve compiled namespace-aware compound and attribute data. #666/#667 binds the remaining native test consumer to the namespace-aware compiler API, and #668/#669 restores complete structured selector parity comparisons. #665/#670 implements demand-free animation pause/resume, and #671/#673 enforces parser package size with both ratio and absolute byte budgets, and #672/#678 implements bounded eight-track animation-list coordination; #674/#681 implements zero-time/count semantics, #679/#680/#682 updates the native stale-track contract for inactive authored list slots, and #675/#683 adds bounded translate/scale keyframe sampling and retained paint composition. #684/#685 refreshes the generated Code OSS ledger and exact property identity count exposed by the post-merge main jobs. #676/#686 adds bounded retained ::before/::after animation lifecycle, scoped paint, owner events, cleanup, and demand-free settled state. Full-V8 package portability epic #687 is implemented by #688/#691 for GCC, #689/#692 for MSVC enum/ABI boundaries, #690/#693 for bounded embedded source literals, #694/#695 for const cascade roots, and #696/#697 for native test syntax. #677/#698 adds bounded retained WAAPI with document/element caps, lifecycle settlement, and demand-free inactive states. #699/#700 restores the 384-byte native document footprint by moving WAAPI-only maps and event state behind one lazy auxiliary allocation. #476/#702 adds bounded asynchronous document fetch and stale-generation suppression for dynamically inserted CSS imports, complementing #480/#484 authored-import reflection. #701/#703 adds browser-shaped Worker options, inherited credential policy, final response/CORS enforcement, generation-safe failure, and bounded slot retirement. #704/#705 adds an optional bounded redirect ledger and per-hop Worker status/scheme/loop/downgrade/origin/CORS/credential checks. #706/#707 extracts bounded request-header ABI v5 onto current main; AppScene #281/#282 and vscode-demo #10 populate the ledger in their host providers.

One-agent mode is enforced. The sole implementation agent is implementing bounded interactive reportValidity feedback under #708; no other implementation agent is active. Static fill does not sustain frame demand, and new animation work must preserve that bound without per-frame cascade, selector, or visual-tree churn.

Consolidations remain open and unmerged: WebScene #76 at b1f4977691938e636c1e16ac1c2f37c4d2128f4c, AppScene #65 at 0c018306458050a66a19d2c84abd3cf65a20832c, and vscode-demo #1. WebScene #662 and #681 portable V8 contracts passed. Focused #682 native document and Linux SDK runs 35448768204 and 35448768281 passed; #683 portable V8 contracts passed. The failed #683 current-main generated-ledger/property-count gates are repaired by #684/#685, and Linux CI job 105914816775 passed. Full-V8 Linux/Windows RID portability repairs are merged through #691-#697; current-main CI/NuGet runs 35454910272 and 35454910266 are retained; superseded PR, previous-main, and consolidation runs were cancellation-requested. AppScene #282 current-main companion run 35454940645 passed.

Ordered next work: #708 interactive validity feedback, then current-main CI/package triage and the remaining focused CSS and acceptance backlog, then physical Linux pixels, synchronization/device-loss/resize/soak/performance, VM/computer-use, and unchanged Code OSS Release qualification. Rich clipboard MIME, MULTIPLE/SAVE_TARGETS, and the recorded desktop-service/cross-platform backlog remain open.

Parent: #227. Related clipboard/selection context: #86, #268, #331 and #405. AppScene consumer: SceneTech/AppScene#275.

Problem

Unchanged browser-workbench Code OSS does not load Electron's Linux selection-clipboard contribution. AppScene can own X11 PRIMARY and WebScene can read it for middle-click paste, but WebScene never publishes the focused text selection to the host. Automatic PRIMARY ownership therefore remains stale or empty.

Scope

  • Reuse webscene_host_request_v1 for a private, product-neutral, one-way selected-text publication: kind CLIPBOARD_WRITE, request_id=0, content_type=text/plain, exact flags REPLACE|PRIMARY, and a nonempty UTF-8 payload.
  • Source only the currently focused, connected, writable input or textarea that supports text selection; exclude password controls. Readonly controls, contenteditable and document Selection remain outside this first slice.
  • Observe selection changes after a stable DOM/input mutation boundary so the payload reflects the settled selection.
  • Publish no more than 64 KiB; reject oversize rather than truncating.
  • Coalesce to at most one pending replacement publication so rapid pointer/key selection changes remain bounded and the newest eligible text wins.
  • Do not clear or replace PRIMARY when selection collapses, becomes empty, exceeds the cap, loses eligibility, navigates, or tears down.
  • Require no user activation and expose no JavaScript Clipboard API promise or public web API.
  • Preserve every existing completion-bearing clipboard request, 16-operation cap, host queue cap, navigation teardown, and CLIPBOARD behavior.
  • Keep payloads out of diagnostics and do not add X11, Electron, CEF, WebView, browser-process or VS Code-specific code.

Acceptance

  • Selecting nonempty text in a focused input/textarea emits the exact one-way request and UTF-8 bytes once after coalescing.
  • Password, detached, unfocused, collapsed, empty, oversize and stale-context selections emit nothing and retain the prior host PRIMARY value.
  • Normal navigator.clipboard, Ctrl+C/X/V and completion-bearing host requests remain unchanged.
  • Rapid selection changes keep at most one pending publication and have bounded CPU/allocation behavior.
  • Unchanged Code OSS short Monaco selections mirrored into its hidden textarea produce exact publication without source patches.
  • Large/multipage/multicursor Monaco model selections, readonly controls, contenteditable and document Selection remain explicit follow-up/acceptance work.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestvscode-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