From 6565146ebf86dc92f04bd06cb424769ffbe86c74 Mon Sep 17 00:00:00 2001 From: Philipp Fritsche Date: Wed, 29 Dec 2021 16:47:46 +0000 Subject: [PATCH 1/2] fix(pointer): fire pointer events on disabled elements --- src/pointer/pointerPress.ts | 106 ++++++++++++++++++------------------ tests/pointer/index.ts | 19 ++++--- 2 files changed, 66 insertions(+), 59 deletions(-) diff --git a/src/pointer/pointerPress.ts b/src/pointer/pointerPress.ts index b887bbf1..d51f635d 100644 --- a/src/pointer/pointerPress.ts +++ b/src/pointer/pointerPress.ts @@ -102,39 +102,40 @@ function down( } pointerState.pressed.push(pressObj) - if (!targetIsDisabled) { - if (pointerType !== 'mouse') { - fire('pointerover') - fire('pointerenter') - } - if ( - pointerType !== 'mouse' || - !pointerState.pressed.some( - p => p.keyDef !== keyDef && p.keyDef.pointerType === pointerType, - ) - ) { - fire('pointerdown') - } - if (pointerType === 'mouse') { + if (pointerType !== 'mouse') { + fire('pointerover') + fire('pointerenter') + } + if ( + pointerType !== 'mouse' || + !pointerState.pressed.some( + p => p.keyDef !== keyDef && p.keyDef.pointerType === pointerType, + ) + ) { + fire('pointerdown') + } + + // TODO: touch... + + if (pointerType === 'mouse') { + if (!targetIsDisabled) { pressObj.unpreventedDefault = fire('mousedown') } - // TODO: touch... - } - - if (pointerType === 'mouse' && pressObj.unpreventedDefault) { - mousedownDefaultBehavior({ - target, - targetIsDisabled, - clickCount, - position: pointerState.position[pointerName], - node, - offset, - }) - } + if (pressObj.unpreventedDefault) { + mousedownDefaultBehavior({ + target, + targetIsDisabled, + clickCount, + position: pointerState.position[pointerName], + node, + offset, + }) + } - if (pointerType === 'mouse' && button === 'secondary') { - fire('contextmenu') + if (button === 'secondary') { + fire('contextmenu') + } } return pressObj @@ -179,19 +180,20 @@ function up( // TODO: pointerleave for touch device - if (!targetIsDisabled) { - if ( - pointerType !== 'mouse' || - !pointerState.pressed.filter(p => p.keyDef.pointerType === pointerType) - .length - ) { - fire('pointerup') - } - if (pointerType !== 'mouse') { - fire('pointerout') - fire('pointerleave') - } - if (pointerType !== 'mouse' && !isMultiTouch) { + if ( + pointerType !== 'mouse' || + !pointerState.pressed.filter(p => p.keyDef.pointerType === pointerType) + .length + ) { + fire('pointerup') + } + if (pointerType !== 'mouse') { + fire('pointerout') + fire('pointerleave') + } + + if (pointerType !== 'mouse' && !isMultiTouch) { + if (!targetIsDisabled) { if (clickCount === 1) { fire('mouseover') fire('mouseenter') @@ -199,17 +201,17 @@ function up( fire('mousemove') unpreventedDefault = fire('mousedown') && unpreventedDefault } - } - if (unpreventedDefault && pointerType !== 'mouse' && !isMultiTouch) { - mousedownDefaultBehavior({ - target, - targetIsDisabled, - clickCount, - position: pointerState.position[pointerName], - node, - offset, - }) + if (unpreventedDefault) { + mousedownDefaultBehavior({ + target, + targetIsDisabled, + clickCount, + position: pointerState.position[pointerName], + node, + offset, + }) + } } delete pointerState.position[pointerName].selectionRange diff --git a/tests/pointer/index.ts b/tests/pointer/index.ts index e1f16d28..0babe338 100644 --- a/tests/pointer/index.ts +++ b/tests/pointer/index.ts @@ -109,7 +109,9 @@ describe('delay', () => { }) test('only pointer events on disabled elements', async () => { - const {element, getEventSnapshot, getEvents} = setup('