Skip to content

Commit 6b2ce66

Browse files
vicrepph-fritsche
andauthored
fix: throw error when click/hover on pointer-events: none (#647)
When trying to use one of * `userEvent.click` * `userEvent.dblClick` * `userEvent.hover` * `userEvent.unhover` on an element with disabled pointer events, an error is thrown. Co-authored-by: Philipp Fritsche <ph.fritsche@gmail.com>
1 parent 0537940 commit 6b2ce66

File tree

7 files changed

+37
-41
lines changed

7 files changed

+37
-41
lines changed

README.md

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,8 @@ See the
135135
constructor documentation for more options.
136136

137137
Note that `click` will trigger hover events before clicking. To disable this,
138-
set the `skipHover` option to `true`.
138+
set the `skipHover` option to `true`. Also note that trying to click an element
139+
with `pointer-events` being set to `"none"` (i.e. unclickable) will throw an error.
139140

140141
### `dblClick(element, eventInit, options)`
141142

@@ -256,11 +257,8 @@ test('types into the input', () => {
256257
render(
257258
<>
258259
<label for="time">Enter a time</label>
259-
<input
260-
type="time"
261-
id="time"
262-
/>
263-
</>
260+
<input type="time" id="time" />
261+
</>,
264262
)
265263
const input = screen.getByLabelText(/enter a time/i)
266264
userEvent.type(input, '13:58')

src/__tests__/click.js

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -474,12 +474,7 @@ test('right click fires `contextmenu` instead of `click', () => {
474474
expect(getEvents('click')).toHaveLength(0)
475475
})
476476

477-
test('fires no events when clicking element with pointer-events set to none', () => {
478-
const {element, getEventSnapshot} = setup(
479-
`<div style="pointer-events: none"></div>`,
480-
)
481-
userEvent.click(element)
482-
expect(getEventSnapshot()).toMatchInlineSnapshot(
483-
`No events were fired on: div`,
484-
)
477+
test('throws when clicking element with pointer-events set to none', () => {
478+
const {element} = setup(`<div style="pointer-events: none"></div>`)
479+
expect(() => userEvent.click(element)).toThrowError(/unable to click/i)
485480
})

src/__tests__/dblclick.js

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -281,12 +281,9 @@ test('fires mouse events with custom buttons property', () => {
281281
`)
282282
})
283283

284-
test('fires no events when dblClick element with pointer-events set to none', () => {
285-
const {element, getEventSnapshot} = setup(
286-
`<div style="pointer-events: none"></div>`,
287-
)
288-
userEvent.dblClick(element)
289-
expect(getEventSnapshot()).toMatchInlineSnapshot(
290-
`No events were fired on: div`,
284+
test('throws an error when dblClick element with pointer-events set to none', () => {
285+
const {element} = setup(`<div style="pointer-events: none"></div>`)
286+
expect(() => userEvent.dblClick(element)).toThrowError(
287+
/unable to double-click/i,
291288
)
292289
})

src/__tests__/hover.js

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,7 @@ test('fires non-bubbling events on parents for unhover', () => {
123123
`)
124124
})
125125

126-
test('fires no events when hovering element with pointer-events set to none', () => {
127-
const {element, getEventSnapshot} = setup(
128-
`<div style="pointer-events: none"></div>`,
129-
)
130-
userEvent.hover(element)
131-
expect(getEventSnapshot()).toMatchInlineSnapshot(
132-
`No events were fired on: div`,
133-
)
126+
test('throws when hovering element with pointer-events set to none', () => {
127+
const {element} = setup(`<div style="pointer-events: none"></div>`)
128+
expect(() => userEvent.hover(element)).toThrowError(/unable to hover/i)
134129
})

src/__tests__/unhover.js

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,7 @@ test('no events fired on labels that contain disabled controls', () => {
3939
)
4040
})
4141

42-
test('fires no events when unhover element with pointer-events set to none', () => {
43-
const {element, getEventSnapshot} = setup(
44-
`<div style="pointer-events: none"></div>`,
45-
)
46-
userEvent.unhover(element)
47-
expect(getEventSnapshot()).toMatchInlineSnapshot(
48-
`No events were fired on: div`,
49-
)
42+
test('throws when unhover element with pointer-events set to none', () => {
43+
const {element} = setup(`<div style="pointer-events: none"></div>`)
44+
expect(() => userEvent.unhover(element)).toThrowError(/unable to unhover/i)
5045
})

src/click.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,11 @@ function click(
118118
init?: MouseEventInit,
119119
{skipHover = false, clickCount = 0}: clickOptions = {},
120120
) {
121-
if (!hasPointerEvents(element)) return
121+
if (!hasPointerEvents(element)) {
122+
throw new Error(
123+
'unable to click element as it has or inherits pointer-events set to "none".',
124+
)
125+
}
122126
if (!skipHover) hover(element, init)
123127

124128
if (isElementType(element, 'label')) {
@@ -143,7 +147,11 @@ function fireClick(element: Element, mouseEventOptions: MouseEventInit) {
143147
}
144148

145149
function dblClick(element: Element, init?: MouseEventInit) {
146-
if (!hasPointerEvents(element)) return
150+
if (!hasPointerEvents(element)) {
151+
throw new Error(
152+
'unable to double-click element as it has or inherits pointer-events set to "none".',
153+
)
154+
}
147155
hover(element, init)
148156
click(element, init, {skipHover: true, clickCount: 0})
149157
click(element, init, {skipHover: true, clickCount: 1})

src/hover.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ function getParentElements(element: Element) {
1717
}
1818

1919
function hover(element: Element, init?: MouseEventInit) {
20-
if (!hasPointerEvents(element)) return
20+
if (!hasPointerEvents(element)) {
21+
throw new Error(
22+
'unable to hover element as it has or inherits pointer-events set to "none".',
23+
)
24+
}
2125
if (isLabelWithInternallyDisabledControl(element)) return
2226

2327
const parentElements = getParentElements(element).reverse()
@@ -39,7 +43,11 @@ function hover(element: Element, init?: MouseEventInit) {
3943
}
4044

4145
function unhover(element: Element, init?: MouseEventInit) {
42-
if (!hasPointerEvents(element)) return
46+
if (!hasPointerEvents(element)) {
47+
throw new Error(
48+
'unable to unhover element as it has or inherits pointer-events set to "none".',
49+
)
50+
}
4351
if (isLabelWithInternallyDisabledControl(element)) return
4452

4553
const parentElements = getParentElements(element)

0 commit comments

Comments
 (0)