mirror of
https://github.com/servo/servo.git
synced 2025-06-25 09:34:32 +01:00
81 lines
3.3 KiB
HTML
81 lines
3.3 KiB
HTML
<?xml version="1.0" encoding="utf-8"?>
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<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" />
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script src="resources/custom-elements-helpers.js"></script>
|
|
</head>
|
|
<body>
|
|
<div id="log"></div>
|
|
<script>
|
|
<![CDATA[
|
|
|
|
async function construct_custom_element_in_parser(test, markup)
|
|
{
|
|
const window = await create_window_in_test_async(test, 'application/xml', `<?xml version="1.0" encoding="utf-8"?>
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<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></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'));
|
|
}, 'XML parser must perform a microtask checkpoint before constructing a custom element');
|
|
|
|
]]>
|
|
</script>
|
|
</body>
|
|
</html>
|