| <!DOCTYPE HTML> | |
| <!-- This test makes hundreds of sequential testdriver calls, | |
| which can take a long time in non-optimized builds. --> | |
| <meta name="timeout" content="long"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="/resources/testdriver.js"></script> | |
| <script src="/resources/testdriver-vendor.js"></script> | |
| <body> | |
| <table-element id="table-row-columnheader-test"> | |
| <row-element> | |
| <columnheader-element></columnheader-element> | |
| </row-element> | |
| </table-element> | |
| <grid-element id="grid-row-gridcell-test"> | |
| <row-element> | |
| <gridcell-element></gridcell-element> | |
| </row-element> | |
| </grid-element> | |
| <list-element id="list-listitem-test"> | |
| <listitem-element></listitem-element> | |
| </list-element> | |
| <menu-element id="menu-menuitem-test"> | |
| <menuitem-element></menuitem-element> | |
| </menu-element> | |
| <menu-element id="menu-menuitemcheckbox-test"> | |
| <menuitemcheckbox-element></menuitemcheckbox-element> | |
| </menu-element> | |
| <menu-element id="menu-menuitemradio-test"> | |
| <menuitemradio-element></menuitemradio-element> | |
| </menu-element> | |
| <listbox-element id="listbox-option-test"> | |
| <option-element></option-element> | |
| </listbox-element> | |
| <table-element id="table-row-test"> | |
| <row-element></row-element> | |
| </table-element> | |
| <table-element id="table-rowgroup-test"> | |
| <rowgroup-element></rowgroup-element> | |
| </table-element> | |
| <table-element id="table-row-rowheader-test"> | |
| <row-element> | |
| <rowheader-element></rowheader-element> | |
| </row-element> | |
| </table-element> | |
| <tablist-element id="tablist-tab-test"> | |
| <tab-element></tab-element> | |
| </tablist-element> | |
| <tree-element id="tree-treeitem-test"> | |
| <treeitem-element></treeitem-element> | |
| </tree-element> | |
| </body> | |
| <script> | |
| function conditionally_register_element(role) { | |
| if (!customElements.get(`${role}-element`)) { | |
| customElements.define(`${role}-element`, class extends HTMLElement { | |
| constructor() { | |
| super(); | |
| this.internals_ = this.attachInternals(); | |
| this.internals_.role = role; | |
| this.internals_.ariaLabel = `Test ${role} label`; | |
| } | |
| }); | |
| } | |
| } | |
| function generate_role_element(role) { | |
| conditionally_register_element(role); | |
| const el = document.createElement(`${role}-element`); | |
| document.body.append(el); | |
| return el; | |
| } | |
| function generate_child_role_element(role, parentElement) { | |
| conditionally_register_element(role); | |
| const el = document.createElement(`${role}-element`); | |
| parentElement.append(el); | |
| return el; | |
| } | |
| const test_roles = [ | |
| 'alert', | |
| 'alertdialog', | |
| 'application', | |
| 'article', | |
| 'banner', | |
| 'button', | |
| 'cell', | |
| 'checkbox', | |
| 'combobox', | |
| 'complementary', | |
| 'contentinfo', | |
| 'definition', | |
| 'dialog', | |
| ['directory', 'list'], // is this expected? | |
| 'document', | |
| 'figure', | |
| 'form', | |
| 'grid', | |
| 'group', | |
| 'heading', | |
| ['img', 'image'], | |
| 'feed', | |
| 'link', | |
| 'list', | |
| 'listbox', | |
| 'log', | |
| 'main', | |
| 'marquee', | |
| 'math', | |
| 'menu', | |
| 'menubar', | |
| 'meter', | |
| 'navigation', | |
| 'note', | |
| 'progressbar', | |
| 'radio', | |
| 'radiogroup', | |
| 'region', | |
| 'scrollbar', | |
| 'search', | |
| 'searchbox', | |
| 'separator', | |
| 'slider', | |
| 'spinbutton', | |
| 'status', | |
| 'switch', | |
| 'table', | |
| 'tablist', | |
| 'tabpanel', | |
| 'term', | |
| 'textbox', | |
| 'timer', | |
| 'toolbar', | |
| 'tooltip', | |
| 'tree', | |
| 'treegrid' | |
| ]; | |
| test_roles.map((testdata) => { | |
| let role; | |
| let roleName; | |
| if (Array.isArray(testdata)) { | |
| role = testdata[0]; | |
| roleName = testdata[1]; | |
| } else { | |
| role = testdata; | |
| roleName = testdata; | |
| } | |
| promise_test(async () => { | |
| const el = generate_role_element(role); | |
| const computed_role = await test_driver.get_computed_role(el); | |
| const computed_label = await test_driver.get_computed_label(el); | |
| assert_equals(computed_role, roleName, el); | |
| assert_equals(computed_label, `Test ${role} label`, el); | |
| el.remove(); | |
| }, `Applies "${role}" via Element Internals`); | |
| }); | |
| const child_test_roles = [ | |
| ['table', 'row', 'columnheader'], | |
| ['grid', 'row', 'gridcell'], | |
| ['list', 'listitem'], | |
| ['menu', 'menuitem'], | |
| ['menu', 'menuitemcheckbox'], | |
| ['menu', 'menuitemradio'], | |
| ['listbox', 'option'], | |
| ['table', 'row'], | |
| ['table', 'rowgroup'], | |
| ['table', 'row', 'rowheader'], | |
| ['tablist', 'tab'], | |
| ['tree', 'treeitem'], | |
| ]; | |
| child_test_roles.map((roles) => { | |
| promise_test(async () => { | |
| // Ensure role applied elements are registered. | |
| roles.forEach((role) => { | |
| conditionally_register_element(role); | |
| }); | |
| // Gather test DOM and walk children to ensure parent/child relationships are correct. | |
| let testEl = document.getElementById([...roles, 'test'].join('-')); | |
| for (let i = 0; i < roles.length; i++) { | |
| const role = roles[i]; | |
| const computed_role = await test_driver.get_computed_role(testEl); | |
| const computed_label = await test_driver.get_computed_label(testEl); | |
| assert_equals(computed_role, role, testEl); | |
| assert_equals(computed_label, `Test ${role} label`, testEl); | |
| testEl = testEl.children[0]; | |
| } | |
| }, `Applies parent/child relationship of "${roles.join('"/"')}" via Element Internals`); | |
| }); | |
| </script> |