Altinity / Altinity/altinity-sql-browser
Dashboard tile gestures: mixed drag/resize concurrency has no cross-gesture guard
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- TypeScript
- Sterne
- 8
- Forks
- 2
- Ø Merge
- 1 Std. 34 Min.
- Gemergte PRs (30 T.)
- 6
Beschreibung
src/ui/dashboard-tile-gestures.ts's createTileGestureController has no cross-gesture mutual exclusion, despite the natural reading of "one gesture at a time":
dragActive(declared line 191, guard at line 386if (dragActive) return;) blocks only a second concurrent drag — a resize (wireGridResize) never checks it, so a resize can start and run while a drag is active, and vice versa.- The single "currently cancellable gesture" slot,
installedGestureCancel(declared line 200), is last-writer-wins and self-clearing: whichever gesture (re)installs it last (drag at line 659, resize at line 307) owns it; each gesture's own cleanup only nulls the slot if it is still the one holding it (drag clears at line 623, resize at line 280) — so an older gesture's cleanup never stomps a newer one's slot, but adispose()/rerender only ever cancels whichever gesture currently holds the slot, leaving the other orphaned against soon-to-be-replaced DOM. - Neither gesture filters its window
pointermove/pointeruplisteners bypointerId(module doc comment, lines 42-44) — a pointer other than the one that started the gesture still moves/ends it, and two concurrent resizes both terminate off one sharedpointerup.
This is pinned by the "tile gesture concurrency characterization (#589 wave 2, CURRENT BEHAVIOR — not a guarantee, see inbox)" describe block in tests/unit/dashboard.test.ts and exercised at the controller-unit level across tests/unit/dashboard-tile-gestures.test.ts.
It is a pre-existing defect predating #589 (#593 refactor umbrella) — the extraction in wave 2 preserved it verbatim rather than introducing it. Fixing it is out of scope for a pure structural extraction; filing so a deliberate design decision (mutual exclusion vs. documented-intentional concurrency) can be made separately.
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit src/ui/dashboard-tile-gestures.ts, insbesondere mit createTileGestureController, dragActive, installedGestureCancel und den window-Pointer-Listenern. Lies die Charakterisierung der Nebenläufigkeit in tests/unit/dashboard.test.ts und die Controller-Tests in tests/unit/dashboard-tile-gestures.test.ts. Kläre zuerst, ob Gesten gegenseitig exklusiv sein sollten oder absichtlich gleichzeitig ausgeführt werden; abgeschlossen bedeutet, dass das gewählte Verhalten implementiert und durch Tests abgedeckt ist, einschließlich Entsorgung und Pointer-Behandlung.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- typescript
- Bereich
- frontend, testing
- Issue-Typ
- Bug
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Aktivitätsstatus
- Ruhig
- Klarheit
- Muss geklärt werden
- Anfängerfreundlichkeit
- 35/100