Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/nwsapi.mts
Original file line number Diff line number Diff line change
Expand Up @@ -2213,7 +2213,7 @@
'if(((' +
'(/^form$/i.test(e.localName)&&!e.noValidate)||' +
'(e.willValidate&&!e.formNoValidate))&&e.checkValidity())||' +
'(/^fieldset$/i.test(e.localName)&&s.first(":valid",e))' +
'(/^fieldset$/i.test(e.localName)&&!s.first(":invalid",e))' +
'){' +
source +
'}'
Expand Down
74 changes: 74 additions & 0 deletions test/repo/unit/fieldset-valid.test.mts
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import { expect, test } from 'vitest'
import { JSDOM } from 'jsdom'
import factory from '../../../src/nwsapi.js'

test.each([
['empty', '<fieldset id="subject"></fieldset>', true],
['valid control', '<fieldset id="subject"><input></fieldset>', true],
[
'invalid control',
'<fieldset id="subject"><input required></fieldset>',
false,
],
[
'disabled control',
'<fieldset id="subject"><input required disabled></fieldset>',
true,
],
[
'disabled ancestor',
'<fieldset disabled><fieldset id="subject"><input required></fieldset></fieldset>',
true,
],
[
'nested invalid control',
'<fieldset id="subject"><fieldset><input required></fieldset></fieldset>',
false,
],
])('fieldset validity: %s', (_name, html, valid) => {
const { window } = new JSDOM(html)
try {
const engine = factory(window)
const subject = window.document.getElementById('subject')!
for (let repeat = 0; repeat < 2; repeat += 1) {
expect(engine.match(':valid', subject)).toBe(valid)
expect(engine.match(':invalid', subject)).toBe(!valid)
expect(engine.select('#subject:valid', window.document)).toEqual(
valid ? [subject] : [],
)
expect(engine.select('#subject:invalid', window.document)).toEqual(
valid ? [] : [subject],
)
}
} finally {
window.close()
}
})

test('cached fieldset queries observe validation and tree changes', () => {
const { window } = new JSDOM('<fieldset><input required></fieldset>')
try {
const engine = factory(window)
const subject = window.document.querySelector('fieldset')!
const control = window.document.querySelector('input')!
const assertValid = (valid: boolean) => {
expect(engine.match(':valid', subject)).toBe(valid)
expect(engine.select('fieldset:valid', window.document)).toEqual(
valid ? [subject] : [],
)
}
assertValid(false)
control.value = 'complete'
assertValid(true)
control.setCustomValidity('invalid')
assertValid(false)
control.disabled = true
assertValid(true)
control.disabled = false
assertValid(false)
control.remove()
assertValid(true)
} finally {
window.close()
}
})