| // 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()'); |