Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- This WPT test may be referenced by the following Test IDs:
- /custom-elements/createElement-reentrant-construction.window.html - WPT Dashboard Interop Dashboard
// create an element does not push onto the construction stack; the constructor
// creates the element. So a re-entrant createElement() for the same element
// yields two independent elements rather than hitting an "already constructed"
// marker.
// A failed construction is reported rather than rethrown by create an element.
setup({allow_uncaught_exception: true});
test(() => {
let nested;
let needsReentry = true;
class Reentrant extends HTMLElement {
constructor() {
if (needsReentry) {
needsReentry = false;
nested = document.createElement('reentrant-before-super');
}
super();
}
}
customElements.define('reentrant-before-super', Reentrant);
const outer = document.createElement('reentrant-before-super');
assert_true(nested instanceof Reentrant, 'the re-entrant createElement() constructs an element');
assert_equals(nested.localName, 'reentrant-before-super');
assert_true(outer instanceof Reentrant, 'the outer createElement() constructs an element');
assert_equals(outer.localName, 'reentrant-before-super');
assert_not_equals(outer, nested, 'the two createElement() calls construct distinct elements');
}, 'Re-entrant createElement() of the same element before super()');
test(() => {
let nested;
let needsReentry = true;
class Reentrant extends HTMLElement {
constructor() {
super();
if (needsReentry) {
needsReentry = false;
nested = document.createElement('reentrant-after-super');
}
}
}
customElements.define('reentrant-after-super', Reentrant);
const outer = document.createElement('reentrant-after-super');
assert_true(nested instanceof Reentrant, 'the re-entrant createElement() constructs an element');
assert_equals(nested.localName, 'reentrant-after-super');
assert_true(outer instanceof Reentrant, 'the outer createElement() constructs an element');
assert_equals(outer.localName, 'reentrant-after-super');
assert_not_equals(outer, nested, 'the two createElement() calls construct distinct elements');
}, 'Re-entrant createElement() of the same element after super()');