8000 Disconnected <fieldset> elements sometimes incorrectly match :valid /… · WebKit/WebKit@7c77ae8 · GitHub
[go: up one dir, main page]

Skip to content

Commit 7c77ae8

Browse files
author
Alexey Shvayka
committed
Disconnected <fieldset> elements sometimes incorrectly match :valid / :invalid selectors
https://bugs.webkit.org/show_bug.cgi?id=250936 Reviewed by Ryosuke Niwa. This change removes isConnected() checks from updateValidity() so that form controls in disconnected subtrees update validity status of their <fieldset> ancestors, like they do for form owners, aligning WebKit with the spec [1], Blink, and Gecko. [1] https://html.spec.whatwg.org/multipage/semantics-other.html#selector-valid (no connected-ness check) * LayoutTests/imported/w3c/web-platform-tests/html/semantics/selectors/pseudo-classes/valid-invalid-fieldset-disconnected-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/html/semantics/selectors/pseudo-classes/valid-invalid-fieldset-disconnected.html: Added. * Source/WebCore/html/ValidatedFormListedElement.cpp: (WebCore::ValidatedFormListedElement::updateValidity): Canonical link: https://commits.webkit.org/259422@main
1 parent 3e28bdb commit 7c77ae8

File tree

3 files changed

+63
-4
lines changed

3 files changed

+63
-4
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
PASS <input> element becomes invalid inside disconnected <fieldset>
3+
PASS <select> element becomes valid inside disconnected <fieldset>
4+
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<!DOCTYPE html>
2+
<meta charset=utf-8>
3+
<title>Selector: pseudo-classes (:valid, :invalid) on disconnected fieldset element</title>
4+
<link rel=help href="https://html.spec.whatwg.org/multipage/semantics-other.html#selector-valid">
5+
<script src="/resources/testharness.js"></script>
6+
<script src="/resources/testharnessreport.js"></script>
7+
8+
<fieldset id=fieldset1>
9+
<input id=input1>
10+
</fieldset>
11+
12+
<fieldset id=fieldset2>
13+
<select id=select1 required multiple>
14+
<option>foo
15+
</select>
16+
</fieldset>
17+
18+
<script>
19+
test(() => {
20+
const fieldset = document.querySelector("#fieldset1");
21+
const input = document.querySelector("#input1");
22+
23+
assert_true(fieldset.matches(":valid"));
24+
assert_false(fieldset.matches(":invalid"));
25+
26+
fieldset.remove();
27+
input.setCustomValidity("foo");
28+
29+
assert_false(fieldset.matches(":valid"));
30+
assert_true(fieldset.matches(":invalid"));
31+
32+
input.setCustomValidity("");
33+
34+
assert_true(fieldset.matches(":valid"));
35+
assert_false(fieldset.matches(":invalid"));
36+
}, "<input> element becomes invalid inside disconnected <fieldset>");
37+
38+
test(() => {
39+
const fieldset = document.querySelector("#fieldset2");
40+
const select = document.querySelector("#select1");
41+
42+
assert_false(fieldset.matches(":valid"));
43+
assert_true(fieldset.matches(":invalid"));
44+
45+
fieldset.remove();
46+
select.required = false;
47+
48+
assert_true(fieldset.matches(":valid"));
49+
assert_false(fieldset.matches(":invalid"));
50+
51+
select.required = true;
52+
select.firstElementChild.selected = true;
53+
54+
assert_true(fieldset.matches(":valid"));
55+
assert_false(fieldset.matches(":invalid"));
56+
}, "<select> element becomes valid inside disconnected <fieldset>");
57+
</script>

Source/WebCore/html/ValidatedFormListedElement.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -262,13 +262,11 @@ void ValidatedFormListedElement::updateValidity()
262262

263263
if (willValidate) {
264264
if (!newIsValid) {
265-
if (element.isConnected())
266-
addInvalidElementToAncestorFromInsertionPoint(element, element.parentNode());
265+
addInvalidElementToAncestorFromInsertionPoint(element, element.parentNode());
267266
if (auto* form = this->form())
268267
form->addInvalidFormControl(element);
269268
} else {
270-
if (element.isConnected())
271-
removeInvalidElementToAncestorFromInsertionPoint(element, element.parentNode());
269+
removeInvalidElementToAncestorFromInsertionPoint(element, element.parentNode());
272270
if (auto* form = this->form())
273271
form->removeInvalidFormControlIfNeeded(element);
274272
}

0 commit comments

Comments
 (0)
0