| Index: third_party/WebKit/LayoutTests/custom-elements/constructor-may-poach-upgrading-element.html
|
| diff --git a/third_party/WebKit/LayoutTests/custom-elements/constructor-may-poach-upgrading-element.html b/third_party/WebKit/LayoutTests/custom-elements/constructor-may-poach-upgrading-element.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d69e429ff447f054da4868a789f4a3a2eb9d3a2c
|
| --- /dev/null
|
| +++ b/third_party/WebKit/LayoutTests/custom-elements/constructor-may-poach-upgrading-element.html
|
| @@ -0,0 +1,66 @@
|
| +<!DOCTYPE html>
|
| +<script src="../resources/testharness.js"></script>
|
| +<script src="../resources/testharness-helpers.js"></script>
|
| +<script src="../resources/testharnessreport.js"></script>
|
| +<script src="spec/resources/custom-elements-helpers.js"></script>
|
| +<body>
|
| +<script>
|
| +'use strict';
|
| +
|
| +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>
|
|
|