<!DOCTYPE html>
<html>
<head>
<title>Custom Elements: create an element for a token must perform a microtask checkpoint</title>
<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
<meta name="assert" content="When the HTML parser creates an element for a token, it must perform a microtask checkpoint before invoking the constructor">
<meta name="help" content="https://html.spec.whatwg.org/multipage/parsing.html#create-an-element-for-the-token">
<meta name="help" content="https://html.spec.whatwg.org/multipage/webappapis.html#perform-a-microtask-checkpoint">
<meta name="help" content="https://html.spec.whatwg.org/multipage/parsing.html#adoption-agency-algorithm">
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../../imported/w3c/web-platform-tests/custom-elements/resources/custom-elements-helpers.js"></script>
</head>
<body>
<div id="log"></div>
<script>

async function construct_custom_element_in_parser(test, markup)
{
    const window = await create_window_in_test(test, `
<!DOCTYPE html>
<html>
<body><script>
class SomeElement extends HTMLElement {
    constructor() {
        super();
        window.recordsListInConstructor = recordsList.map((records) => records.slice(0));
    }
}
customElements.define('some-element', SomeElement);

const recordsList = [];
const observer = new MutationObserver((records) => {
    recordsList.push(records);
});
observer.observe(document.body, {childList: true, subtree: true});

window.onload = () => {
    window.recordsListInDOMContentLoaded = recordsList.map((records) => records.slice(0));
}

</scr` + `ipt>${markup}</body></html>`);
    return window;
}

promise_test(async function () {
    const contentWindow = await construct_custom_element_in_parser(this, '<b><some-element></b>');
    const contentDocument = contentWindow.document;

    let recordsList = contentWindow.recordsListInConstructor;
    assert_true(Array.isArray(recordsList));
    assert_equals(recordsList.length, 1);
    assert_true(Array.isArray(recordsList[0]));
    assert_equals(recordsList[0].length, 1);
    let record = recordsList[0][0];
    assert_equals(record.type, 'childList');
    assert_equals(record.target, contentDocument.body);
    assert_equals(record.previousSibling, contentDocument.querySelector('script'));
    assert_equals(record.nextSibling, null);
    assert_equals(record.removedNodes.length, 0);
    assert_equals(record.addedNodes.length, 1);
    assert_equals(record.addedNodes[0], contentDocument.querySelector('b'));

    recordsList = contentWindow.recordsListInDOMContentLoaded;
    assert_true(Array.isArray(recordsList));
    assert_equals(recordsList.length, 2);
    assert_true(Array.isArray(recordsList[1]));
    assert_equals(recordsList[1].length, 1);
    record = recordsList[1][0];
    assert_equals(record.type, 'childList');
    assert_equals(record.target, contentDocument.querySelector('b'));
    assert_equals(record.previousSibling, null);
    assert_equals(record.nextSibling, null);
    assert_equals(record.removedNodes.length, 0);
    assert_equals(record.addedNodes.length, 1);
    assert_equals(record.addedNodes[0], contentDocument.querySelector('some-element'));
}, 'HTML parser must perform a microtask checkpoint before constructing a custom element');

promise_test(async function () {
    const contentWindow = await construct_custom_element_in_parser(this, '<b><i>hello</b><some-element>');
    const contentDocument = contentWindow.document;
    let recordsList = contentWindow.recordsListInConstructor;
    assert_true(Array.isArray(recordsList));
    assert_equals(recordsList.length, 1);
    assert_true(Array.isArray(recordsList[0]));
    assert_equals(recordsList[0].length, 4);

    let record = recordsList[0][0];
    assert_equals(record.type, 'childList');
    assert_equals(record.target, contentDocument.body);
    assert_equals(record.previousSibling, contentDocument.querySelector('script'));
    assert_equals(record.nextSibling, null);
    assert_equals(record.removedNodes.length, 0);
    assert_equals(record.addedNodes.length, 1);
    assert_equals(record.addedNodes[0], contentDocument.querySelector('b'));

    record = recordsList[0][1];
    assert_equals(record.type, 'childList');
    assert_equals(record.target, contentDocument.querySelector('b'));
    assert_equals(record.previousSibling, null);
    assert_equals(record.nextSibling, null);
    assert_equals(record.removedNodes.length, 0);
    assert_equals(record.addedNodes.length, 1);
    assert_equals(record.addedNodes[0], contentDocument.querySelector('i'));

    record = recordsList[0][2];
    assert_equals(record.type, 'childList');
    assert_equals(record.target, contentDocument.querySelector('i'));
    assert_equals(record.previousSibling, null);
    assert_equals(record.nextSibling, null);
    assert_equals(record.removedNodes.length, 0);
    assert_equals(record.addedNodes.length, 1);
    assert_equals(record.addedNodes[0].nodeType, Node.TEXT_NODE);
    assert_equals(record.addedNodes[0].data, "hello");

    record = recordsList[0][3];
    assert_equals(record.type, 'childList');
    assert_equals(record.target, contentDocument.body);
    assert_equals(record.previousSibling, contentDocument.querySelector('b'));
    assert_equals(record.nextSibling, null);
    assert_equals(record.removedNodes.length, 0);
    assert_equals(record.addedNodes.length, 1);
    assert_equals(record.addedNodes[0], contentDocument.querySelectorAll('i')[1]);

    recordsList = contentWindow.recordsListInDOMContentLoaded;
    assert_true(Array.isArray(recordsList));
    assert_equals(recordsList.length, 2);
    assert_true(Array.isArray(recordsList[1]));
    assert_equals(recordsList[1].length, 1);

    record = recordsList[1][0];
    assert_equals(record.type, 'childList');
    assert_equals(record.target, contentDocument.querySelectorAll('i')[1]);
    assert_equals(record.previousSibling, null);
    assert_equals(record.nextSibling, null);
    assert_equals(record.removedNodes.length, 0);
    assert_equals(record.addedNodes.length, 1);
    assert_equals(record.addedNodes[0], contentDocument.querySelector('some-element'));
}, 'HTML parser must perform a microtask checkpoint before constructing a custom element during the adoption agency algorithm');

</script>
</body>
</html>
