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> |