<!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>
