OLD | NEW |
1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
2 <title>Custom Elements: defineElement</title> | 2 <title>Custom Elements: defineElement</title> |
3 <link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#cus
tomelementsregistry"> | 3 <link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#cus
tomelementsregistry"> |
4 <meta name="author" title="Dominic Cooney" href="mailto:dominicc@chromium.org"> | 4 <meta name="author" title="Dominic Cooney" href="mailto:dominicc@chromium.org"> |
5 <script src="../../resources/testharness.js"></script> | 5 <script src="../../resources/testharness.js"></script> |
6 <script src="../../resources/testharness-helpers.js"></script> | 6 <script src="../../resources/testharness-helpers.js"></script> |
7 <script src="../../resources/testharnessreport.js"></script> | 7 <script src="../../resources/testharnessreport.js"></script> |
8 <script src="resources/custom-elements-helpers.js"></script> | 8 <script src="resources/custom-elements-helpers.js"></script> |
9 <body> | 9 <body> |
10 <script> | 10 <script> |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 w.customElements.define('a-a', F); | 80 w.customElements.define('a-a', F); |
81 }, 'defining an element with a constructor with a prototype that is not an ' + | 81 }, 'defining an element with a constructor with a prototype that is not an ' + |
82 'object should throw a TypeError'); | 82 'object should throw a TypeError'); |
83 }, 'Retrieved prototype is a non-object'); | 83 }, 'Retrieved prototype is a non-object'); |
84 | 84 |
85 test_with_window((w) => { | 85 test_with_window((w) => { |
86 assert_throws(TypeError.prototype, () => { | 86 assert_throws(TypeError.prototype, () => { |
87 let not_a_constructor = () => {}; | 87 let not_a_constructor = () => {}; |
88 let invalid_name = 'annotation-xml'; | 88 let invalid_name = 'annotation-xml'; |
89 w.customElements.define(invalid_name, not_a_constructor); | 89 w.customElements.define(invalid_name, not_a_constructor); |
90 }, 'defining an element with an invalid name and invalid constructor ' + | 90 }, 'Defining an element with an invalid name and invalid constructor ' + |
91 'should throw a TypeError for the constructor and not a SyntaxError'); | 91 'should throw a TypeError for the constructor and not a SyntaxError'); |
92 | 92 |
93 class C extends w.HTMLElement {} | 93 class C extends w.HTMLElement {} |
94 w.customElements.define('a-a', C); | 94 w.customElements.define('a-a', C); |
95 assert_throws('SYNTAX_ERR', () => { | 95 assert_throws('SYNTAX_ERR', () => { |
96 let invalid_name = 'annotation-xml'; | 96 let invalid_name = 'annotation-xml'; |
97 let reused_constructor = C; | 97 let reused_constructor = C; |
98 w.customElements.define(invalid_name, reused_constructor); | 98 w.customElements.define(invalid_name, reused_constructor); |
99 }, 'defining an element with an invalid name and a reused constructor ' + | 99 }, 'Defining an element with an invalid name and a reused constructor ' + |
100 'should throw a SyntaxError for the name and not a NotSupportedError'); | 100 'should throw a SyntaxError for the name and not a NotSupportedError'); |
101 }, 'Order of checks'); | 101 }, 'Order of checks'); |
102 | |
103 test_with_window((w) => { | |
104 let doc = w.document; | |
105 doc.body.innerHTML = ` | |
106 <a-a id="a"> | |
107 <p> | |
108 <a-a id="b"></a-a> | |
109 <a-a id="c"></a-a> | |
110 </p> | |
111 <a-a id="d"></a-a> | |
112 </a-a>`; | |
113 let invocations = []; | |
114 class C extends w.HTMLElement { | |
115 constructor() { | |
116 super(); | |
117 console.log(this.getAttribute('id')); | |
118 invocations.push(this); | |
119 } | |
120 } | |
121 w.customElements.define('a-a', C); | |
122 assert_array_equals(['a', 'b', 'c', 'd'], invocations.map((e) => e.id), | |
123 'four elements should have been upgraded in doc order'); | |
124 }, 'Upgrade: existing elements'); | |
125 | |
126 test_with_window((w) => { | |
127 let doc = w.document; | |
128 let a = doc.createElement('a-a'); | |
129 doc.body.appendChild(a); | |
130 assert_equals(w.HTMLElement.prototype, Object.getPrototypeOf(a), | |
131 'the undefined autonomous element should be a HTMLElement'); | |
132 let invocations = []; | |
133 class C extends w.HTMLElement { | |
134 constructor() { | |
135 super(); | |
136 assert_equals(C.prototype, Object.getPrototypeOf(a), | |
137 'the HTMLElement constructor should set the prototype ' + | |
138 'to the defined prototype'); | |
139 invocations.push(this); | |
140 } | |
141 } | |
142 w.customElements.define('a-a', C); | |
143 assert_array_equals([a], invocations, | |
144 'the constructor should have been invoked for the in-' + | |
145 'document element'); | |
146 }, 'Upgrade: sets prototype of existing elements'); | |
147 | |
148 test_with_window((w) => { | |
149 let doc = w.document; | |
150 var shadow = doc.body.attachShadow({mode: 'open'}); | |
151 let a = doc.createElement('a-a'); | |
152 shadow.appendChild(a); | |
153 let invocations = []; | |
154 class C extends w.HTMLElement { | |
155 constructor() { | |
156 super(); | |
157 invocations.push(this); | |
158 } | |
159 } | |
160 w.customElements.define('a-a', C); | |
161 assert_array_equals([a], invocations, | |
162 'the constructor should have been invoked once for the ' + | |
163 'elements in the shadow tree'); | |
164 }, 'Upgrade: shadow tree'); | |
165 </script> | 102 </script> |
OLD | NEW |