demo · v136

Wheel passthrough

The video-conferencing pattern that motivated the spec: a live "preview tile" of the captured tab where the user can wheel/scroll inside the tile and have those wheel deltas forwarded to the captured surface — without having to leave the call to do it.

Origin trial / flag Captured Surface Control shipped in Chrome 136 as an origin-trial and flag-gated API. To actually run the forwarding path, enable chrome://flags/#captured-surface-control or join the origin trial. The capability probe and wheel log below still show the graceful fallback when the API is unavailable.
Probing…
Permission On first forwardWheel() call, the captured tab's user must accept Chrome's "control capture" prompt. Self-capturing this tab is disallowed by Chrome — pick another open tab when the share dialog appears.
Tile is idle — press "Start capture" then wheel here.
capture stateidle
forwardWheel bindingnot bound
last wheel deltaY
forwarding path
cumulative px sent0

action log

the code

const tile = document.getElementById("tile");
const ctrl = new CaptureController();
const stream = await navigator.mediaDevices.getDisplayMedia({ controller: ctrl });
tile.querySelector("video").srcObject = stream;

// Current CSC binds a trusted wheel source element once.
await ctrl.forwardWheel(tile);

tile.addEventListener("wheel", (e) => {
  e.preventDefault(); // don't scroll the tile itself
  renderWheelTelemetry(e.deltaX, e.deltaY);
}, { passive: false });

why this angle

The sibling concept exposes the API surface — "press the up/down buttons, they call forwardWheel." Real VC products don't ship those buttons; users scroll the preview tile with their real trackpad or mouse wheel. The trusted wheel source → CSC binding is what the spec was designed for, and is what makes the difference between "demo" and "shippable feature." This page binds the actual preview tile and logs the live wheel stream.

see also