summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/html/semantics/forms/the-selectlist-element/selectlist-parts-structure.tentative.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/html/semantics/forms/the-selectlist-element/selectlist-parts-structure.tentative.html')
-rw-r--r--testing/web-platform/tests/html/semantics/forms/the-selectlist-element/selectlist-parts-structure.tentative.html495
1 files changed, 495 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/semantics/forms/the-selectlist-element/selectlist-parts-structure.tentative.html b/testing/web-platform/tests/html/semantics/forms/the-selectlist-element/selectlist-parts-structure.tentative.html
new file mode 100644
index 0000000000..104ae841f7
--- /dev/null
+++ b/testing/web-platform/tests/html/semantics/forms/the-selectlist-element/selectlist-parts-structure.tentative.html
@@ -0,0 +1,495 @@
+<!DOCTYPE html>
+<html lang="en">
+<title>HTMLSelectListElement Test: part structure</title>
+<link rel="author" title="Ionel Popescu" href="mailto:iopopesc@microsoft.com">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+
+<selectlist id="selectList0">
+ <div popover slot="listbox" behavior="listbox">
+ <option id="selectList0-child1">one</option>
+ <option id="selectList0-child2">two</option>
+ <div behavior="option" id="selectList0-child3">three</div>
+ </div>
+ <option id="selectList0-child4">four</option>
+</selectlist>
+
+<selectlist id="selectList1">
+ <listbox id="selectList1-popover">
+ <button type=selectlist id="selectList1-button">
+ Custom button
+ </button>
+ <option>one</option>
+ <option id="selectList1-child2">two</option>
+ </listbox>
+</selectlist>
+
+<selectlist id="selectList2">
+ <button type=selectlist id="selectList2-button">
+ Custom button
+ <listbox id="selectList2-popover">
+ Custom listbox
+ </listbox>
+ </button>
+ <option>three</option>
+ <div>
+ This is some text.
+ <option id="selectList2-child4">four</option>
+ More text.
+ </div>
+</selectlist>
+
+<selectlist id="selectList3">
+ <div slot="button" id="selectList3-button-slot">
+ <button type=selectlist id="selectList3-button0">button0</button>
+ </div>
+ <option>one</option>
+</selectlist>
+
+<selectlist id="selectList4">
+ <button type=selectlist id="selectList4-button0">button0</button>
+ <div slot="listbox" id="selectList4-listbox-slot">
+ <div popover behavior="listbox" id="selectList4-listbox0">
+ <option>one</option>
+ <option id="selectList4-option2">two</option>
+ </div>
+ </div>
+</selectlist>
+
+<selectlist id="selectList5">
+ <div slot="button" id="selectList5-button-slot">
+ <button type=selectlist id="selectList5-button0">button0</button>
+ <div behavior="selected-value" id="selectList5-selectedValue0"></div>
+ </div>
+ <option>one</option>
+ <option id="selectList5-option0">two</option>
+</selectlist>
+
+<!-- No associated JS test -- just don't crash when parsing! -->
+<selectlist id="selectList6">
+ <div slot="button"></div>
+ <div popover slot="listbox" behavior="listbox"></div>
+</selectlist>
+
+<!-- No associated JS test -- just don't crash when parsing! -->
+<selectlist id="selectList7">
+ <div slot="listbox"></div>
+ <button type=selectlist></button>
+</selectlist>
+
+<!-- No associated JS test -- just don't crash when parsing! -->
+<selectlist id="selectList8">
+ <div slot="listbox"></div>
+ <option>one</option>
+</selectlist>
+
+<selectlist id="selectList9">
+ <div slot="listbox" id="selectList9-listbox-slot">
+ <div popover behavior="listbox" id="selectList9-originalListbox">
+ <option>one</option>
+ <option id="selectList9-option2">two</option>
+ </div>
+ </div>
+</selectlist>
+
+<selectlist id="selectList11">
+ <div popover slot="listbox" behavior="listbox">
+ <option>one</option>
+ </div>
+ <div slot="button" behavior="listbox" id="selectList11-button">Test</div>
+</selectlist>
+
+<selectlist id="selectList12">
+ <button type=selectlist id="selectList12-button0">button0</button>
+ <listbox id="selectList12-listbox">
+ <option id="selectList12-option1">one</option>
+ <option>two</option>
+ </listbox>
+</selectlist>
+
+<selectlist id="selectList13">
+ <div slot="button" id="selectList12-button-slot">
+ <div id="selectList13-removeContent-button">
+ <button type=selectlist id="selectList13-button0">button0</button>
+ <button type=selectlist id="selectList13-button1">button1</button>
+ </div>
+ <button type=selectlist id="selectList13-button2">button2</button>
+ </div>
+ <div slot="listbox" id="selectList13-listbox-slot">
+ <div id="selectList13-removeContent-listbox">
+ <div popover behavior="listbox" id="selectList13-originalListbox">
+ <option id="selectList13-option1">one</option>
+ <option id="selectList13-option2">two</option>
+ </div>
+ </div>
+ <div popover behavior="listbox" id="selectList13-newListbox">
+ <option>three</option>
+ <option id="selectList13-option4">four</option>
+ </div>
+ </div>
+</selectlist>
+
+<selectlist id="selectList14">
+ <button type=selectlist id="selectList14-button0">button0</button>
+ <option>one</option>
+ <option id="selectList14-option2">two</option>
+</selectlist>
+
+<selectlist id="selectList15">
+ <div slot="button" id="selectList15-div0"></div>
+ <option>one</option>
+</selectlist>
+
+<selectlist id="selectList16">
+ <div slot="button">
+ <div id="selectList16-div0">
+ <button type=selectlist id="selectList16-button0">button</button>
+ </div>
+ </div>
+ <option>one</option>
+</selectlist>
+
+<script>
+ function clickOn(element) {
+ const actions = new test_driver.Actions();
+ return actions.pointerMove(0, 0, {origin: element})
+ .pointerDown({button: actions.ButtonType.LEFT})
+ .pointerUp({button: actions.ButtonType.LEFT})
+ .send();
+ }
+
+ promise_test(async () => {
+ const selectList0 = document.getElementById("selectList0");
+ const selectList0Child1 = document.getElementById("selectList0-child1");
+ const selectList0Child2 = document.getElementById("selectList0-child2");
+ const selectList0Child3 = document.getElementById("selectList0-child3");
+ assert_equals(selectList0.value, "one");
+ await clickOn(selectList0);
+ await clickOn(selectList0Child2);
+ assert_equals(selectList0.value, "two");
+
+ await clickOn(selectList0);
+ await clickOn(selectList0Child3);
+ assert_equals(selectList0.value, "two", "Clicking a non-HTMLOptionElement labeled as an option should do nothing");
+
+ await clickOn(selectList0Child1);
+ assert_equals(selectList0.value, "one");
+ assert_false(selectList0.open);
+ }, "HTMLOptionElements (and not other element types) should receive option controller code");
+
+
+ promise_test(async () => {
+ const selectList0 = document.getElementById("selectList0");
+ const selectList0Child4 = document.getElementById("selectList0-child4");
+
+ assert_equals(selectList0.value, "one");
+ await clickOn(selectList0);
+ assert_true(selectList0.open);
+ selectList0Child4.click();
+ assert_equals(selectList0.value, "one", "Clicking an option outside of the popover should not change the value");
+ }, "To receive option part controller code, an option must be a descendant of the listbox part in a flat tree traversal");
+
+ promise_test(async () => {
+ const selectList1 = document.getElementById("selectList1");
+ const selectList1Popover = document.getElementById("selectList1-popover");
+ const selectList1Button = document.getElementById("selectList1-button");
+ const selectList1Child2 = document.getElementById("selectList1-child2");
+ assert_false(selectList1Popover.matches(':popover-open'));
+ selectList1Button.click();
+ assert_false(selectList1Popover.matches(':popover-open'), "Clicking a button part that is a descendant of the listbox part should have no effect");
+
+ assert_equals(selectList1.value, "one");
+ await clickOn(selectList1);
+ assert_true(selectList1Popover.matches(':popover-open'));
+ await clickOn(selectList1Child2);
+ assert_equals(selectList1.value, "two", "Clicking an <option> should change the value");
+ }, "To receive button part controller code, an element labeled as a button must not be a descendant of the listbox part in a flat tree traversal");
+
+ promise_test(async () => {
+ const selectList2 = document.getElementById("selectList2");
+ const selectList2Popover = document.getElementById("selectList2-popover");
+ const selectList2Button = document.getElementById("selectList2-button");
+ const selectList2Child2 = document.getElementById("selectList2-child2");
+ const selectList2Child4 = document.getElementById("selectList2-child4");
+
+ assert_false(selectList2Popover.matches(':popover-open'));
+ await clickOn(selectList2Button);
+ assert_false(selectList2Popover.matches(':popover-open'), "Clicking a button part should not show an invalid listbox part");
+
+ assert_equals(selectList2.value, "three");
+ await clickOn(selectList2Child4);
+ assert_equals(selectList2.value, "four", "Clicking an <option> that is a descendant of a valid listbox part should update the value");
+ }, "To receive listbox part controller code, an element labeled as a listbox must not be a descendant of the button part in a flat tree traversal");
+
+ promise_test(async () => {
+ const selectList3 = document.getElementById("selectList3");
+ const selectList3ButtonSlot = document.getElementById("selectList3-button-slot");
+ const selectList3Button0 = document.getElementById("selectList3-button0");
+
+ assert_false(selectList3.open);
+
+ let button1 = document.createElement("div");
+ button1.innerText = "button1";
+ button1.setAttribute("behavior", "button");
+ selectList3ButtonSlot.appendChild(button1);
+
+ await clickOn(button1);
+ assert_false(selectList3.open, "A button part should only get controller code if it's first in document order, even if added dynamically");
+
+ await clickOn(selectList3Button0);
+ assert_true(selectList3.open, "A button part should get controller code if it's first in document order");
+ }, "Button controller code should be applied in flat tree traversal order regardless of dynamic insertion order");
+
+ promise_test(async () => {
+ const selectList4 = document.getElementById("selectList4");
+ const selectList4Button0 = document.getElementById("selectList4-button0");
+ const selectList4ListboxSlot = document.getElementById("selectList4-listbox-slot");
+ const selectList4Option2 = document.getElementById("selectList4-option2");
+
+ assert_false(selectList4.open);
+
+ let listbox2 = document.createElement("div");
+ listbox2.innerHTML = `
+ <option>three</option>
+ <option id="selectList4-option4">four</option>
+ `;
+ listbox2.setAttribute("behavior", "listbox");
+ selectList4ListboxSlot.appendChild(listbox2);
+
+ await clickOn(selectList4Button0);
+ assert_true(selectList4.open);
+
+ const selectList4Option4 = document.getElementById("selectList4-option4");
+ await clickOn(selectList4Option4);
+ assert_equals(selectList3.value, "one", "An option in a listbox should not get controller code if its listbox isn't first in document order, even if added dynamically");
+
+ await clickOn(selectList4Button0);
+ assert_true(selectList4.open);
+
+ await clickOn(selectList4Option2);
+ assert_equals(selectList4.value, "two", "An option in a listbox should get controller code if its listbox is first in document order, even if another listbox was added dynamically");
+}, "Listbox controller code should be applied in flat tree traversal order regardless of dynamic insertion order");
+
+promise_test(async () => {
+ const selectList5 = document.getElementById("selectList5");
+ const selectList5ButtonSlot = document.getElementById("selectList5-button-slot");
+ const selectList5Button0 = document.getElementById("selectList5-button0");
+ const selectList5SelectedValue0 = document.getElementById("selectList5-selectedValue0");
+
+ assert_false(selectList3.open);
+ assert_equals(selectList5SelectedValue0.innerText, "one");
+
+ let selectedValue1 = document.createElement("div");
+ selectList5ButtonSlot.appendChild(selectedValue1);
+
+ await clickOn(selectList5Button0);
+ assert_true(selectList5.open);
+
+ await clickOn(document.getElementById("selectList5-option0"));
+ assert_false(selectList5.open);
+ assert_equals(selectList5SelectedValue0.innerText, "two", "first selected-value part in flat tree order should get controller code");
+ assert_equals(selectedValue1.innerText, "", "Dynamically inserted selected-value part shouldn't get controller code if it's not first in flat tree order");
+ }, "selected-value controller code should be applied in flat tree traversal order regardless of dynamic insertion order");
+
+ promise_test(async () => {
+ const selectList = document.getElementById("selectList9");
+ const originalListbox = document.getElementById("selectList9-originalListbox");
+ const option2 = document.getElementById("selectList9-option2");
+ assert_equals(selectList.value, "one", "Initial value should be the first option");
+
+ let newListbox = document.createElement("div");
+ newListbox.setAttribute("popover", "auto");
+ newListbox.setAttribute("behavior", "listbox");
+ let newOption = document.createElement("option");
+ newOption.innerText = "three";
+ newListbox.appendChild(newOption);
+ let newOption2 = document.createElement("option");
+ newOption2.innerText = "four";
+ newListbox.appendChild(newOption2);
+ originalListbox.parentElement.insertBefore(newListbox, originalListbox);
+
+ await clickOn(selectList);
+ assert_true(selectList.open, "Menu should open when clicked");
+
+ option2.click(); // clickOn doesn't work because the old options are not displayed
+ assert_equals(selectList.value, "three", "Elements in second popover should no longer be option parts");
+ assert_true(selectList.open, "Clicking non-part options shouldn't close the popover");
+
+ await clickOn(newOption2);
+ assert_false(selectList.open);
+ assert_equals(selectList.value, "four", "New options should get controller code after listbox switch");
+ }, "Ensure that option controller code is updated when listbox changes");
+
+ promise_test(async () => {
+ const selectList = document.getElementById("selectList11");
+ const selectList11Button= document.getElementById("selectList11-button");
+
+ await clickOn(selectList11Button);
+ assert_false(selectList.open, "Controller code not applied due to part attribute not being button");
+ selectList11Button.remove();
+
+ await clickOn(selectList);
+ assert_true(selectList.open, "Default button part should be used");
+ }, "Ensure that controller code is applied when slot and part attributes are different");
+
+ promise_test(async () => {
+ const selectList = document.getElementById("selectList12");
+ const originalListbox = document.getElementById("selectList12-listbox");
+ assert_equals(selectList.value, "one", "Initial value should be the first option");
+
+ const selectListButton0 = document.getElementById("selectList12-button0");
+ const selectListOption1 = document.getElementById("selectList12-option1");
+
+ assert_false(selectList.open);
+ let button1 = document.createElement("button");
+ button1.innerText = "button1";
+ button1.setAttribute("type", "selectlist");
+ selectList.insertBefore(button1, selectListButton0);
+ button1.click();
+ assert_true(selectList.open, "Controller code should be applied to the new first button in document order");
+ await clickOn(selectListOption1);
+ assert_false(selectList.open, "listbox should close after clicking option1.");
+ selectListButton0.click();
+ assert_true(selectList.open, "listbox should open after clicking button0.");
+ selectListButton0.click();
+ assert_false(selectList.open, "listbox should close after clicking button0 again.");
+
+ let button2 = document.createElement("button");
+ button2.innerText = "button2";
+ selectList.insertBefore(button2, button1);
+ button2.click();
+ assert_false(selectList.open, "Controller code should not be applied to button2 since it doesn't have type=selectlist.");
+ button2.setAttribute("type", "selectlist");
+ button2.click();
+ assert_true(selectList.open, "Controller code should be applied to the new button part");
+ await clickOn(selectListOption1);
+ assert_false(selectList.open);
+
+ let newListbox = document.createElement("listbox");
+ let newOption = document.createElement("option");
+ newOption.innerText = "three";
+ newListbox.appendChild(newOption);
+ let newOption2 = document.createElement("option");
+ newOption2.innerText = "four";
+ newListbox.appendChild(newOption2);
+ originalListbox.parentElement.insertBefore(newListbox, originalListbox);
+ assert_equals(selectList.value, "three", "New value should be the first option");
+
+ newListbox.innerHTML = "<option>five</option><option>six</option>";
+ assert_equals(selectList.value, "five", "New value should be the first option");
+
+ selectList.innerHTML = "<option>seven</option><option id='selectList12-option2'>eight</option>";
+ assert_equals(selectList.value, "seven", "New value should be the first option");
+ const selectListOption2 = document.getElementById("selectList12-option2");
+ await clickOn(selectList);
+ assert_true(selectList.open);
+ await clickOn(selectListOption2);
+ assert_equals(selectList.value, "eight", "Controller code should be applied to new options");
+
+ selectListOption2.slot = "button";
+ assert_equals(selectList.value, "seven", "Previous selected option should become invalid");
+ }, "Ensure that controller code is synchronously applied");
+
+ promise_test(async () => {
+ const selectList = document.getElementById("selectList13");
+ assert_equals(selectList.value, "one");
+
+ const selectListButton0 = document.getElementById("selectList13-button0");
+ const selectListButton1 = document.getElementById("selectList13-button1");
+ selectListButton1.click();
+ assert_false(selectList.open);
+ selectListButton0.click();
+ assert_true(selectList.open, "First button should receive controller code");
+ await clickOn(document.getElementById("selectList13-option2"));
+ assert_equals(selectList.value, "two");
+ let divButtonToRemove = document.getElementById("selectList13-removeContent-button");
+ divButtonToRemove.innerHTML = "";
+ selectListButton0.click();
+ assert_false(selectList.open, "The first button is invalid");
+ const selectListButton2 = document.getElementById("selectList13-button2");
+ selectListButton2.click();
+ assert_true(selectList.open, "The button part should be updated")
+ await clickOn(document.getElementById("selectList13-option1"));
+ assert_equals(selectList.value, "one");
+
+ const selectListOption4 = document.getElementById("selectList13-option4");
+ selectListOption4.click();
+ assert_equals(selectList.value, "one");
+ let divListboxToRemove = document.getElementById("selectList13-removeContent-listbox");
+ divListboxToRemove.innerHTML = "";
+ assert_equals(selectList.value, "three", "The listbox part should be updated");
+ selectListOption4.click();
+ assert_equals(selectList.value, "four", "Controller code should be applied to the new options");
+
+ let selectListNewListbox = document.getElementById("selectList13-newListbox");
+ selectListNewListbox.innerHTML = "";
+ assert_equals(selectList.value, "");
+ selectListOption4.click();
+ assert_equals(selectList.value, "");
+ }, "Controller code should be updated when nested parts are removed");
+
+ promise_test(async () => {
+ let selectList = document.getElementById("selectList14");
+ assert_equals(selectList.value, "one");
+ const selectListButton0 = document.getElementById("selectList14-button0");
+ const selectListOption2 = document.getElementById("selectList14-option2");
+
+ selectListButton0.click();
+ assert_true(selectList.open);
+ await clickOn(selectListOption2);
+ assert_equals(selectList.value, "two");
+
+ document.body.removeChild(selectList);
+ selectList.removeChild(selectListOption2);
+ assert_equals(selectList.value, "one");
+ let newOption = document.createElement("option");
+ newOption.innerText = "three";
+ selectList.appendChild(newOption);
+ newOption.click();
+ assert_equals(selectList.value, "three", "New option should receive controller code");
+
+ let doc = document.implementation.createHTMLDocument('');
+ let selectList1 = doc.createElement('selectlist');
+ let firstOption = doc.createElement('option');
+ firstOption.innerText = 'one';
+ let secondOption = doc.createElement('option');
+ secondOption.innerText = 'two';
+ selectList1.appendChild(firstOption);
+ selectList1.appendChild(secondOption);
+ assert_equals(selectList1.value, "one");
+ secondOption.click();
+ assert_equals(selectList1.value, "two");
+ document.body.appendChild(selectList1);
+ selectList1.removeChild(secondOption);
+ assert_equals(selectList1.value, "one");
+ }, "Moving a selectlist between documents should keep controller code active");
+
+ promise_test(async () => {
+ const selectList = document.getElementById("selectList15");
+ const selectListButtonContainer = document.getElementById("selectList15-div0");
+
+ const outerDiv = document.createElement("div");
+ const button = document.createElement("input");
+ button.type = button.value = "button";
+ button.setAttribute("behavior", "button");
+ outerDiv.appendChild(button);
+ selectListButtonContainer.appendChild(outerDiv);
+
+ await clickOn(selectList);
+ assert_true(selectList.open, "New button should receive controller code");
+ }, "New parts should be detected even when in the subtree of an inserted node");
+
+ promise_test(async () => {
+ const selectList = document.getElementById("selectList16");
+ const selectListButtonContainer = document.getElementById("selectList16-div0");
+ const selectListButton = document.getElementById("selectList16-button0");
+
+ selectListButtonContainer.remove();
+
+ selectListButton.click();
+ assert_false(selectList.open, "Removed button should no longer have controller code");
+ }, "Part removals should be detected even when in the subtree of a removed node");
+</script>