Skip to content

Commit 0778a2e

Browse files
Implement pointercancel event handling
Added pointercancel event handling to pointer widget.
1 parent 1a21063 commit 0778a2e

File tree

1 file changed

+37
-4
lines changed

1 file changed

+37
-4
lines changed

ui/widgets/pointer.js

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
"use strict";
3333

3434
var pointerHandled = false;
35-
$( document ).on( "pointerup", function() {
35+
$( document ).on( "pointerup pointercancel", function() {
3636
pointerHandled = false;
3737
} );
3838

@@ -66,7 +66,8 @@ return $.widget( "ui.pointer", {
6666
if ( this._pointerMoveDelegate ) {
6767
this.document
6868
.off( "pointermove." + this.widgetName, this._pointerMoveDelegate )
69-
.off( "pointerup." + this.widgetName, this._pointerUpDelegate );
69+
.off( "pointerup." + this.widgetName, this._pointerUpDelegate )
70+
.off( "pointercancel." + this.widgetName, this._pointerCancelDelegate );
7071
}
7172
},
7273

@@ -117,10 +118,14 @@ return $.widget( "ui.pointer", {
117118
this._pointerUpDelegate = function( event ) {
118119
return that._pointerUp( event );
119120
};
121+
this._pointerCancelDelegate = function( event ) {
122+
return that._pointerCancel( event );
123+
};
120124

121125
this.document
122126
.on( "pointermove." + this.widgetName, this._pointerMoveDelegate )
123-
.on( "pointerup." + this.widgetName, this._pointerUpDelegate );
127+
.on( "pointerup." + this.widgetName, this._pointerUpDelegate )
128+
.on( "pointercancel." + this.widgetName, this._pointerCancelDelegate );
124129

125130
event.preventDefault();
126131

@@ -158,7 +163,8 @@ return $.widget( "ui.pointer", {
158163
_pointerUp: function( event ) {
159164
this.document
160165
.off( "pointermove." + this.widgetName, this._pointerMoveDelegate )
161-
.off( "pointerup." + this.widgetName, this._pointerUpDelegate );
166+
.off( "pointerup." + this.widgetName, this._pointerUpDelegate )
167+
.off( "pointercancel." + this.widgetName, this._pointerCancelDelegate );
162168

163169
if ( this._pointerStarted ) {
164170
this._pointerStarted = false;
@@ -179,6 +185,29 @@ return $.widget( "ui.pointer", {
179185
event.preventDefault();
180186
},
181187

188+
// pointercancel fires when the browser takes over pointer control (e.g. scroll
189+
// gesture, orientation change, stylus palm rejection). Unlike pointerup, it is
190+
// not cancelable, so we skip preventDefault() and click-prevention data, but we
191+
// still need to tear down all listeners and stop any active drag.
192+
_pointerCancel: function( event ) {
193+
this.document
194+
.off( "pointermove." + this.widgetName, this._pointerMoveDelegate )
195+
.off( "pointerup." + this.widgetName, this._pointerUpDelegate )
196+
.off( "pointercancel." + this.widgetName, this._pointerCancelDelegate );
197+
198+
if ( this._pointerStarted ) {
199+
this._pointerStarted = false;
200+
this._pointerCancel( event );
201+
}
202+
203+
if ( this._pointerDelayTimer ) {
204+
clearTimeout( this._pointerDelayTimer );
205+
delete this._pointerDelayTimer;
206+
}
207+
208+
pointerHandled = false;
209+
},
210+
182211
_pointerDistanceMet: function( event ) {
183212
return ( Math.max(
184213
Math.abs( this._pointerDownEvent.pageX - event.pageX ),
@@ -195,6 +224,10 @@ return $.widget( "ui.pointer", {
195224
_pointerStart: function( /* event */ ) {},
196225
_pointerDrag: function( /* event */ ) {},
197226
_pointerStop: function( /* event */ ) {},
227+
// _pointerStop by default so existing subwidgets need no changes.
228+
_pointerCancel: function( event ) {
229+
this._pointerStop( event );
230+
},
198231
_pointerCapture: function( /* event */ ) {
199232
return true;
200233
}

0 commit comments

Comments
 (0)