Skip to content

Commit 465fc7e

Browse files
hesxenonKatja Potenskyph-fritsche
authoredJan 21, 2025··
fix: prevent click event loop on form-associated custom element (#1238)
Co-authored-by: Katja Potensky <785327-hesxenon@users.noreply.gitlab.com> Co-authored-by: Philipp Fritsche <ph.fritsche@gmail.com>
1 parent 65c1f6c commit 465fc7e

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed
 

‎src/event/behavior/click.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {behavior} from './registry'
55
behavior.click = (event, target, instance) => {
66
const context = target.closest('button,input,label,select,textarea')
77
const control = context && isElementType(context, 'label') && context.control
8-
if (control) {
8+
if (control && control !== target) {
99
return () => {
1010
if (isFocusable(control)) {
1111
focusElement(control)

‎tests/pointer/click.ts

+31-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {setup} from '#testHelpers'
1+
import {isJsdomEnv, setup} from '#testHelpers'
22

33
test('click element', async () => {
44
const {element, getClickEventsSnapshot, getEvents, user} = setup('<div />')
@@ -236,6 +236,29 @@ describe('label', () => {
236236
expect(getEvents('click')).toHaveLength(2)
237237
})
238238

239+
test('click nested FACE per label', async () => {
240+
const {element, getEvents, user} = setup(`<label><fa-ce></fa-ce></label>`)
241+
242+
await user.pointer({
243+
keys: '[MouseLeft]',
244+
target: element,
245+
})
246+
247+
// JSDOM does not set `HTMLLabelElement.control` to the form-associated custom element
248+
expect(getEvents('click')).toHaveLength(isJsdomEnv() ? 1 : 2)
249+
})
250+
251+
test('click nested FACE', async () => {
252+
const {element, getEvents, user} = setup(`<label><fa-ce></fa-ce></label>`)
253+
254+
await user.pointer({
255+
keys: '[MouseLeft]',
256+
target: element.firstChild as Element,
257+
})
258+
259+
expect(getEvents('click')).toHaveLength(1)
260+
})
261+
239262
test('do not click associated non-focusable control per label', async () => {
240263
const {element, getEvents, user} = setup(
241264
`<label for="in">foo</label><input disabled id="in"/>`,
@@ -404,3 +427,10 @@ test('preventDefault on pointer down prevents compatibility events works with po
404427
`)
405428
expect(getEvents('click')).toHaveLength(1)
406429
})
430+
431+
customElements.define(
432+
'fa-ce',
433+
class FaCe extends globalThis.window.HTMLElement {
434+
static formAssociated = true
435+
},
436+
)

0 commit comments

Comments
 (0)
Please sign in to comment.