Skip to content

Commit 36f4a33

Browse files
dbaronchromium-wpt-export-bot
authored andcommitted
Handle values of <fieldset checkable> attribute more consistently.
This tries to be more consistent at implementing the spec concepts that: * the missing value default is the None state * the empty value default is the Multiple state * the invalid value default is the Multiple state This aligns with how I specified the checkable attribute's reflection on the menu-elements branch in whatwg/html@3373ac0 The tests were initially AI-generated but I then duplicated them to test both empty string and invalid values. The empty string dynamic change tests fail without this CL. The others help to test the spec prose around missing value default and invalid value default. Bug: 406566432 Change-Id: I59ded48c8973e6337efc75e5743e711d1eeb58a2 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/8102282 Reviewed-by: Joey Arhar <jarhar@chromium.org> Commit-Queue: David Baron <dbaron@chromium.org> Cr-Commit-Position: refs/heads/main@{#1663573}
1 parent dc365f1 commit 36f4a33

1 file changed

Lines changed: 118 additions & 0 deletions

File tree

html/semantics/menu/tentative/checkable.html

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,124 @@
210210
}, "fieldset multiple => single; all but the first checked menuitem gets " +
211211
"reset");
212212

213+
test(() => {
214+
const menulist = document.createElement('menulist');
215+
const fieldset = menulist.appendChild(document.createElement('fieldset'));
216+
fieldset.setAttribute("checkable", "");
217+
const item1 = fieldset.appendChild(document.createElement('menuitem'));
218+
const item2 = fieldset.appendChild(document.createElement('menuitem'));
219+
220+
assert_false(item1.checked, "item1 is unchecked");
221+
assert_false(item2.checked, "item2 is unchecked");
222+
item1.checked = true;
223+
item2.checked = true;
224+
assert_true(item1.checked, "item1 is checked");
225+
assert_true(item2.checked, "item2 is checked");
226+
}, "fieldset with checkable=\"\" allows multiple menuitems to be checked");
227+
228+
test(() => {
229+
const menulist = document.createElement('menulist');
230+
const fieldset = menulist.appendChild(document.createElement('fieldset'));
231+
fieldset.setAttribute("checkable", "unknownvalue");
232+
const item1 = fieldset.appendChild(document.createElement('menuitem'));
233+
const item2 = fieldset.appendChild(document.createElement('menuitem'));
234+
235+
assert_false(item1.checked, "item1 is unchecked");
236+
assert_false(item2.checked, "item2 is unchecked");
237+
item1.checked = true;
238+
item2.checked = true;
239+
assert_true(item1.checked, "item1 is checked");
240+
assert_true(item2.checked, "item2 is checked");
241+
}, "fieldset with checkable=unknownvalue allows multiple menuitems to be checked");
242+
243+
test(() => {
244+
const menulist = document.createElement('menulist');
245+
const fieldset = menulist.appendChild(document.createElement('fieldset'));
246+
fieldset.setAttribute("checkable", "multiple");
247+
const item1 = fieldset.appendChild(document.createElement('menuitem'));
248+
const item2 = fieldset.appendChild(document.createElement('menuitem'));
249+
250+
item1.checked = true;
251+
item2.checked = true;
252+
fieldset.setAttribute("checkable", "");
253+
assert_true(item1.checked, "first menuitem stays checked");
254+
assert_true(item2.checked, "second menuitem stays checked");
255+
}, "fieldset multiple => ''; menuitems stay checked");
256+
257+
test(() => {
258+
const menulist = document.createElement('menulist');
259+
const fieldset = menulist.appendChild(document.createElement('fieldset'));
260+
fieldset.setAttribute("checkable", "multiple");
261+
const item1 = fieldset.appendChild(document.createElement('menuitem'));
262+
const item2 = fieldset.appendChild(document.createElement('menuitem'));
263+
264+
item1.checked = true;
265+
item2.checked = true;
266+
fieldset.setAttribute("checkable", "unknownvalue");
267+
assert_true(item1.checked, "first menuitem stays checked");
268+
assert_true(item2.checked, "second menuitem stays checked");
269+
}, "fieldset multiple => unknownvalue; menuitems stay checked");
270+
271+
test(() => {
272+
const menulist = document.createElement('menulist');
273+
const fieldset = menulist.appendChild(document.createElement('fieldset'));
274+
fieldset.setAttribute("checkable", "");
275+
const item1 = fieldset.appendChild(document.createElement('menuitem'));
276+
const item2 = fieldset.appendChild(document.createElement('menuitem'));
277+
278+
item1.checked = true;
279+
item2.checked = true;
280+
fieldset.setAttribute("checkable", "single");
281+
assert_true(item1.checked, "first menuitem stays checked");
282+
assert_false(item2.checked, "second menuitem becomes unchecked");
283+
}, "fieldset '' => single; all but the first checked menuitem gets reset");
284+
285+
test(() => {
286+
const menulist = document.createElement('menulist');
287+
const fieldset = menulist.appendChild(document.createElement('fieldset'));
288+
fieldset.setAttribute("checkable", "unknownvalue");
289+
const item1 = fieldset.appendChild(document.createElement('menuitem'));
290+
const item2 = fieldset.appendChild(document.createElement('menuitem'));
291+
292+
item1.checked = true;
293+
item2.checked = true;
294+
fieldset.setAttribute("checkable", "single");
295+
assert_true(item1.checked, "first menuitem stays checked");
296+
assert_false(item2.checked, "second menuitem becomes unchecked");
297+
}, "fieldset unknownvalue => single; all but the first checked menuitem gets reset");
298+
299+
test(() => {
300+
const menulist = document.createElement('menulist');
301+
const fieldset = menulist.appendChild(document.createElement('fieldset'));
302+
fieldset.setAttribute("checkable", "");
303+
const item1 = fieldset.appendChild(document.createElement('menuitem'));
304+
305+
item1.checked = true;
306+
assert_true(item1.checked, true);
307+
fieldset.removeAttribute("checkable");
308+
assert_false(item1.checked,
309+
"menuitem gets unchecked after fieldset becomes uncheckable");
310+
item1.checked = true;
311+
assert_false(item1.checked,
312+
"menuitem cannot become checked after fieldset becomes uncheckable");
313+
}, "when fieldset with checkable='' becomes uncheckable, so do its menuitems");
314+
315+
test(() => {
316+
const menulist = document.createElement('menulist');
317+
const fieldset = menulist.appendChild(document.createElement('fieldset'));
318+
fieldset.setAttribute("checkable", "unknownvalue");
319+
const item1 = fieldset.appendChild(document.createElement('menuitem'));
320+
321+
item1.checked = true;
322+
assert_true(item1.checked, true);
323+
fieldset.removeAttribute("checkable");
324+
assert_false(item1.checked,
325+
"menuitem gets unchecked after fieldset becomes uncheckable");
326+
item1.checked = true;
327+
assert_false(item1.checked,
328+
"menuitem cannot become checked after fieldset becomes uncheckable");
329+
}, "when fieldset with checkable=unknownvalue becomes uncheckable, so do its menuitems");
330+
213331
// Testing the `defaultchecked` content attribute and `defaultChecked` IDL
214332
// attribute.
215333
test(() => {

0 commit comments

Comments
 (0)