Let one pointer finish the drag it started
Analysis
By Juliet Ramos, Playable Production Editor — 2 min read
View author profile
Let one pointer finish the drag it started. A runnable teaching fixture with synthetic cases, a broken branch, and explicit untested cells.
A second touch should not steal an object already being dragged. This fixture makes pointer ownership explicit and checks that unrelated move events cannot alter the active interaction.
This edition is a laboratory fixture. Node and the companion HTML page execute the authored functions against synthetic cases. No physical device panel was run, no ad network reviewed the build, and no campaign result is inferred from a passing test.
What the documentation actually supplies
MDN: pointer owner is the governing reference for the browser primitive. MDN describes pointerId as the identifier for the pointer that generated an event, distinct from other active pointers. It cautions against interpreting that identifier as a permanent device identity. The fixture policy around that primitive is ours.
The failure the fixture isolates
The first input is the active pointer ID, followed by candidate move events. The corrected branch accepts moves only from that owner. The broken branch accepts the last movement from any pointer. The resulting coordinate reveals whether another finger can unexpectedly move the object.
The broken branch is retained so a producer can see the exact mistake, not only the repaired output.
| Case | Input | Expected (fixed) | Broken output |
|---|---|---|---|
| second finger cannot steal | `{"owner":1,"moves":[{"id":1,"x":20},{"id":2,"x":90}]}` | `20` | `90` |
| owner continues | `{"owner":4,"moves":[{"id":4,"x":10},{"id":4,"x":35}]}` | `35` | `35` |
| no owner movement | `{"owner":3,"moves":[{"id":9,"x":70}]}` | `0` | `70` |
All 3 fixed-branch cases matched the spec when executed in Node on 19 September 2026.
What a pass does not prove
The tests exercise event-selection logic using synthetic pointer records. They do not establish browser pointer capture, gesture arbitration or behaviour after a real pointer cancellation. A production handler still needs explicit release and cancellation paths so an interrupted drag cannot leave ownership permanently locked.
Untested cells in this edition: physical devices, host SDKs, network packaging limits, store-opening callbacks, and campaign performance. Those remain empty on purpose.
Next check on a real build
Integrate the owner check with the actual event lifecycle, then use a real touch-capable environment to start a drag and introduce another contact. Verify pointerup and pointercancel independently. Keep a keyboard path for essential controls rather than treating pointer IDs as the only possible source of activation.
Open the runnable fixture to re-execute the cases in a browser. Download the case record to keep inputs, expectations and limits with a QA ticket.
Background in the archive: Playable ad device testing matrix and Playable spec sheet before you build. Those guides describe practice; they are not a substitute for this fixture and this check does not recertify their every claim.
Featured
Related posts
measurement
playable ads
·1 min read
Playable completers vs video viewers: downstream payer quality
measurement
playable ads
·3 min read
Stop simulation time while the document is hidden
measurement
playable ads
·3 min read
Fit the whole playable stage inside a narrow viewport
measurement
playable ads
·2 min read
Require both intersection and document visibility before advancing
More from the Measurement desk
measurement
·2 min read
Airbridge adds Amazon Ads as an app measurement channel
measurement
·2 min read
When to freeze a cohort for payback review (and when not to)
measurement
media buying
·1 min read
Using predicted LTV in bids: disclosure checklist for the UA team
measurement
media buying
·1 min read