| <!DOCTYPE html> |
| <script src="../resources/testharness.js"></script> |
| <script src="../resources/testharnessreport.js"></script> |
| <script src="spec/resources/custom-elements-helpers.js"></script> |
| <body> |
| <script> |
| 'use strict'; |
| |
| setup({ |
| allow_uncaught_exception: true, |
| }); |
| |
| test_with_window((w) => { |
| let doc = w.document; |
| let e = doc.createElement('a-a'); |
| doc.body.appendChild(e); |
| var misbehave = true; |
| var invocations = []; |
| class X extends w.HTMLElement { |
| constructor() { |
| if (misbehave) { |
| misbehave = false; |
| invocations.push('misbehaving'); |
| return new X(); |
| } |
| super(); |
| invocations.push(this); |
| } |
| } |
| w.customElements.define('a-a', X); |
| assert_array_equals(invocations, ['misbehaving', e], |
| 'returning the existing element should have succeeded'); |
| }, 'HTMLElement constructor: poach but return upgrade candidate'); |
| |
| test_with_window((w) => { |
| let doc = w.document; |
| let e = doc.createElement('a-a'); |
| doc.body.appendChild(e); |
| var misbehave = true; |
| var invocations = []; |
| var poacher; |
| class X extends w.HTMLElement { |
| constructor() { |
| if (misbehave) { |
| misbehave = false; |
| poacher = new X(); |
| } |
| try { |
| super(); |
| invocations.push(this); |
| } catch (e) { |
| invocations.push(e); |
| } |
| } |
| } |
| w.customElements.define('a-a', X); |
| assert_equals(invocations.length, 2, |
| 'the constructor should have been invoked once for upgrade ' + |
| 'and once for the recursive call to "new"'); |
| assert_equals(poacher, e, |
| 'the recursive "new" should steal the upgrade candidate'); |
| assert_equals(poacher, invocations[0], |
| 'the recursize "new" should happen first'); |
| assert_true(invocations[1] instanceof w.DOMException, |
| 'the super call should have thrown a DOMException'); |
| assert_equals(invocations[1].name, 'InvalidStateError', |
| 'the exception should be an InvalidStateError'); |
| }, 'HTMLElement constructor: poach upgrade candidate'); |
| </script> |