Index: third_party/WebKit/LayoutTests/custom-elements/spec/create-element-defined-asynchronous.html |
diff --git a/third_party/WebKit/LayoutTests/custom-elements/spec/create-element-defined-asynchronous.html b/third_party/WebKit/LayoutTests/custom-elements/spec/create-element-defined-asynchronous.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c38b1a0ae0660c373401245e745856c95893390a |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/custom-elements/spec/create-element-defined-asynchronous.html |
@@ -0,0 +1,79 @@ |
+<!DOCTYPE html> |
+<title>Custom Elements: Create an element when definition is non-null and synchronous flag not set</title> |
+<script src="../../resources/testharness.js"></script> |
+<script src="../../resources/testharnessreport.js"></script> |
+<script src="resources/custom-elements-helpers.js"></script> |
+<body> |
+<script> |
+'use strict'; |
+ |
+// Create an element |
+// https://dom.spec.whatwg.org/#concept-create-element |
+// 6. If definition is non-null, then: |
+// 6.2. If the synchronous custom elements flag is not set: |
+ |
+(() => { |
+ // customElements.define() upgrades existing elements |
+ // with synchronous flag unset. |
+ test_with_window(w => { |
+ create_element_and_upgrade(w); |
+ }, 'define() should upgrade existing elements'); |
+ |
+ function create_element_and_upgrade(w) { |
+ let document = w.document; |
+ let element = document.createElement('a-a'); |
+ document.body.appendChild(element); |
+ assert_false('is_custom_constructed' in element, 'Constructor should not run before define()'); |
+ define(w); |
+ assert_true(element.is_custom_constructed, 'Constructor should run after define()'); |
+ return element; |
+ } |
+ |
+ function define(w) { |
+ w.customElements.define('a-a', class extends w.HTMLElement { |
+ constructor() { super(); this.is_custom_constructed = true; } |
+ }); |
+ } |
+ |
+ // The "clone a node" concept is async. |
+ // https://dom.spec.whatwg.org/#concept-node-clone |
+ test_with_window(w => { |
+ let element = create_element_and_upgrade(w); |
+ let clone = element.cloneNode(); |
+ assert_true(clone.is_custom_constructed); |
+ }, 'cloneNode() should run custom constructor'); |
+ |
+ // importNode() uses the same "clone a node" conecpt to clone the node. |
+ test_with_window(w => { |
+ define(w); |
+ let document = w.document; |
+ let another_document = document.implementation.createHTMLDocument(); |
+ let element_in_another_document = another_document.createElement('a-a'); |
+ let imported = document.importNode(element_in_another_document); |
+ assert_true(imported.is_custom_constructed); |
+ }, 'importNode() should run custom constructor'); |
+ |
+ // innerHTML/outerHTML setters use the fragment parser. |
+ // https://w3c.github.io/DOM-Parsing/#dom-element-innerhtml |
+ // Synchronous flag is unset if HTML fragment parsing algorithm. |
+ // https://html.spec.whatwg.org/multipage/syntax.html#create-an-element-for-the-token |
+ test_with_window(w => { |
+ define(w); |
+ let document = w.document; |
+ let fragment = document.createElement('div'); |
+ document.body.appendChild(fragment); |
+ fragment.innerHTML = '<a-a></a-a>'; |
+ assert_true(fragment.children[0].is_custom_constructed); |
+ }, 'innerHTML setter should run custom constructor'); |
+ |
+ test_with_window(w => { |
+ define(w); |
+ let document = w.document; |
+ let fragment = document.createElement('div'); |
+ document.body.appendChild(fragment); |
+ fragment.outerHTML = '<a-a></a-a>'; |
+ assert_true(document.body.children[0].is_custom_constructed); |
+ }, 'outerHTML setter should run custom constructor'); |
+})(); |
+</script> |
+</body> |