@@ -116,11 +116,15 @@ const Transitions = Object.freeze({
116116 }
117117} ) ;
118118
119+ const getElementRole = ( element ) = > element . getAttribute ( 'role' ) ;
120+
121+ const getElementType = ( element ) => element . tagName . toLowerCase ( ) ;
122+
119123const isActiveSignal = ( signal ) =>
120124 signal === RESPONDER_ACTIVE_PRESS_START ||
121125 signal === RESPONDER_ACTIVE_LONG_PRESS_START ;
122126
123- const isButtonRole = ( element ) => element . getAttribute ( 'role' ) === 'button' ;
127+ const isButtonRole = ( element ) => getElementRole ( element ) === 'button' ;
124128
125129const isPressStartSignal = ( signal ) =>
126130 signal === RESPONDER_INACTIVE_PRESS_START ||
@@ -132,10 +136,10 @@ const isTerminalSignal = (signal) =>
132136
133137const isValidKeyPress = ( event ) => {
134138 const { key, target } = event ;
135- const role = target . getAttribute ( 'role' ) ;
136139 const isSpacebar = key === ' ' || key === 'Spacebar' ;
137-
138- return key === 'Enter' || ( isSpacebar && role === 'button' ) ;
140+ const isButtonish =
141+ getElementType ( target ) === 'button' || isButtonRole ( target ) ;
142+ return key === 'Enter' || ( isSpacebar && isButtonish ) ;
139143} ;
140144
141145const DEFAULT_LONG_PRESS_DELAY_MS = 450 ; // 500 - 50
@@ -307,7 +311,7 @@ export default class PressResponder {
307311 document . removeEventListener ( 'keyup' , keyupHandler ) ;
308312
309313 const role = target . getAttribute ( 'role' ) ;
310- const elementType = target . tagName . toLowerCase ( ) ;
314+ const elementType = getElementType ( target ) ;
311315
312316 const isNativeInteractiveElement =
313317 role === 'link' ||
@@ -345,11 +349,15 @@ export default class PressResponder {
345349 // focus is moved to another element during 'keydown'.
346350 document . addEventListener ( 'keyup' , keyupHandler ) ;
347351 }
348- const role = target . getAttribute ( 'role' ) ;
349352 const isSpacebarKey = key === ' ' || key === 'Spacebar' ;
350- const isButtonRole = role === 'button' || role === 'menuitem' ;
351- if ( isSpacebarKey && isButtonRole ) {
352- // Prevent spacebar scrolling the window
353+ const role = getElementRole ( target ) ;
354+ const isButtonLikeRole = role === 'button' || role === 'menuitem' ;
355+ if (
356+ isSpacebarKey &&
357+ isButtonLikeRole &&
358+ getElementType ( target ) !== 'button'
359+ ) {
360+ // Prevent spacebar scrolling the window if using non-native button
353361 event . preventDefault ( ) ;
354362 }
355363 event . stopPropagation ( ) ;
0 commit comments