Browser: keep drag input with its page and refuse lost-channel settlement

Abierto
#482 3 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
javascript, rust
Área
backend, testing

Línea de trabajo

Start with capsules/browser/browser/browser-input-surface.js:335-460, then trace the ownership capture at browser.js:1609 and the ordering barrier at browser.js:1670; compare the channel handling with browser-remote-display.js:1384 and the caller at browser.js:1735-1741. Add regression cases at the real callback boundaries for the listed ownership and disconnect/reconnect transitions. Done means those cases refuse or retire unsafe input, and the installed Mac journey passes on the signed candidate.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

User impact

An active mouse drag can continue on a replacement Browser page. A related ordering check can report success after the input channel disconnects, allowing a later Runtime input to proceed without proof that the earlier selection arrived.

Found in the latest local 0.8.0 train input changes during #93's audit. Proposed priority: P1 for page ownership, P2 for the lost-channel ordering case; triage before freezing the Browser candidate under #87.

Exact candidate and evidence

Candidate 460b1888d344f52cebd1c25866be88ff4085f035, tree 17aeaf23c640e2dec8f653fd16f3771f95a55b9c. It is local and unpublished. Two reviewers independently repeated deterministic in-memory fixtures against its actual JavaScript. These are source-level reproductions, not installed media proof.

Active drag changes owner

capsules/browser/browser/browser-input-surface.js:335-460 stores pointer and drag state without the originating page/generation. A queued animation-frame move and direct release use the page current when the callback runs. browser.js:1609 captures ownership at that later invocation.

Fixture: pointerdown at x=100 on old page; queue pointermove x=120; replace current page before the animation frame; flush frame; pointerup x=140.

Both runs produced:

[
  {"page":"old","type":"mouse","x":100,"y":100,"buttons":1},
  {"page":"replacement","type":"mouse","x":120,"y":100,"buttons":1},
  {"page":"replacement","type":"mouse","x":140,"y":100,"buttons":0}
]

Expected: later input stays bound to the original gesture owner or is retired. It cannot become a new page's gesture.

Disconnect is treated as completed drain

browser.js:1670 waits on buffer amount and elapsed time without binding the channel identity/open state. The real display getter returns zero when the channel is removed (browser-remote-display.js:1384, close at :281). The caller continues after its page check (browser.js:1735-1741); channel reconnect can occur without changing page identity.

Fixture: bufferedAmount=64; disconnect after 20 ms and return buffer=0. The helper resolved with the channel closed:

{"settled":true,"channelOpen":false,"elapsedMs":175}

The separate reviewer observed 180 ms. Elapsed time is incidental; successful settlement on a closed channel is the finding.

Acceptance

  • Capture gesture page/session/generation at pointerdown; retire queued callbacks when ownership ends.
  • Release the old gesture through its own valid owner, or terminate it without sending to a replacement.
  • Cover page replacement, close, navigation, blur, pointer capture loss and a fresh gesture after retirement.
  • Bind the input ordering barrier to the actual channel/generation and distinguish confirmed drain from disconnect/unknown delivery.
  • Cover pending bytes then disconnect/reconnect with the same page ID; later input must receive a clear refusal/recovery outcome.
  • Add regression cases using the real source callback boundaries, then run the installed Mac selection/paste/close/reconnect journey on the signed candidate.

Existing input/order tests and the overall 1,819-test behaviour suite pass; these transitions are absent from that evidence. Coordinate with draft PR #421 (deferred wheel/touch ownership), #439 (adapter uncertainty) and #87. This issue owns the new mouse-drag and datachannel-barrier slice; it does not duplicate those broader tasks. The exact no-file reproduction commands are retained in the audit's local evidence packet and can become the regression fixtures.

Lenguaje dominante
Rust
Estrellas
6
Forks
2
Merge medio
1 d 3 h
PR fusionados (30 d)
42

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de elastos/elastos-runtime

Todos los issues de elastos/elastos-runtime

Issues similares

Más issues de Rust

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.