@@ -119,6 +119,8 @@ const Transitions = Object.freeze({
119
119
const isActiveSignal = signal =>
120
120
signal === RESPONDER_ACTIVE_PRESS_START || signal === RESPONDER_ACTIVE_LONG_PRESS_START ;
121
121
122
+ const isButtonRole = element => element . getAttribute ( 'role' ) === 'button' ;
123
+
122
124
const isPressStartSignal = signal =>
123
125
signal === RESPONDER_INACTIVE_PRESS_START ||
124
126
signal === RESPONDER_ACTIVE_PRESS_START ||
@@ -306,8 +308,11 @@ export default class PressResponder {
306
308
} ;
307
309
308
310
return {
309
- onStartShouldSetResponder : ( ) : boolean => {
311
+ onStartShouldSetResponder : ( event ) : boolean => {
310
312
const { disabled } = this . _config ;
313
+ if ( disabled && isButtonRole ( event . currentTarget ) ) {
314
+ event . stopPropagation ( ) ;
315
+ }
311
316
if ( disabled == null ) {
312
317
return true ;
313
318
}
@@ -383,23 +388,33 @@ export default class PressResponder {
383
388
// If long press dispatched, cancel default click behavior.
384
389
// If the responder terminated because text was selected during the gesture,
385
390
// cancel the default click behavior.
391
+ event . stopPropagation ( ) ;
386
392
if ( this . _longPressDispatched || this . _selectionTerminated ) {
387
393
event . preventDefault ( ) ;
388
394
} else if ( onPress != null && event . ctrlKey === false && event . altKey === false ) {
389
395
onPress ( event ) ;
390
396
}
397
+ } else {
398
+ if ( isButtonRole ( event . currentTarget ) ) {
399
+ event . stopPropagation ( ) ;
400
+ }
391
401
}
392
- event . stopPropagation ( ) ;
393
402
} ,
394
403
395
404
// If `onLongPress` is provided and a touch pointer is being used, prevent the
396
405
// default context menu from opening.
397
406
onContextMenu: ( event : any ) : void => {
398
407
const { disabled, onLongPress } = this . _config ;
399
- if ( ! disabled && onLongPress != null && this . _isPointerTouch && ! event . defaultPrevented ) {
400
- event . preventDefault ( ) ;
408
+ if ( ! disabled ) {
409
+ if ( onLongPress != null && this . _isPointerTouch && ! event . defaultPrevented ) {
410
+ event . preventDefault ( ) ;
411
+ event . stopPropagation ( ) ;
412
+ }
413
+ } else {
414
+ if ( isButtonRole ( event . currentTarget ) ) {
415
+ event . stopPropagation ( ) ;
416
+ }
401
417
}
402
- event . stopPropagation ( ) ;
403
418
}
404
419
} ;
405
420
}
0 commit comments