v147 · Demo 2
Before / After Comparison
The event sequence a drag source used to receive versus the corrected sequence in Chrome 147+. Know what changed so you can update — or confirm you don't need to.
Before Chrome 147
pre-147
Chrome 147+
✓ spec-compliant
What this means for your code
- If you track pointer state with a boolean (
isPointerDown), it now resets correctly when a drag starts — no separatedragstartguard needed. - CSS
:hoverand:activestates on the drag source are correctly cleared, matching Firefox behaviour. - Libraries that listen for
pointercancelto abort custom DnD gestures (dnd-kit, SortableJS) now receive it reliably. - No code changes needed if you already reset state on
dragstart— this is additive.
event sequence
// Chrome 147+ (spec-compliant):
// pointerdown ← user presses
// pointermove ← drag threshold crossed
// dragstart ← HTML drag starts
// pointercancel ← NEW: stream terminated, drag owns the pointer
// pointerout ← NEW: pointer left the element
// pointerleave ← NEW: pointer left element + ancestors
// … drag continues …
// dragend ← user releases
// (no pointerup — stream was cancelled)
// Before Chrome 147:
// pointerdown → pointermove → dragstart → dragend
// ↑ no cancellation = leaked state