cb972004b900222e72213afbb744458ee1bbcdee
[WebKit-https.git] / LayoutTests / fast / custom-elements / parser / parser-fallsback-to-unknown-element.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <title>Custom Elements: Changes to the HTML parser</title>
5 <meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
6 <meta name="assert" content="HTML parser must fallback to creating a HTMLUnknownElement when a custom element construction fails">
7 <script src="../../../resources/testharness.js"></script>
8 <script src="../../../resources/testharnessreport.js"></script>
9 <link rel='stylesheet' href='../../../resources/testharness.css'>
10 </head>
11 <body>
12 <div id="log"></div>
13 <script>
14
15 class ReturnsTextNode extends HTMLElement {
16     constructor() {
17         super();
18         return document.createTextNode('some text');
19     }
20 };
21 document.defineElement('returns-text', ReturnsTextNode);
22
23 class ReturnsNonElementObject extends HTMLElement {
24     constructor() {
25         super();
26         return {};
27     }
28 };
29 document.defineElement('returns-non-element-object', ReturnsNonElementObject);
30
31 class LacksSuperCall extends HTMLElement {
32     constructor() { }
33 };
34 document.defineElement('lacks-super-call', LacksSuperCall);
35
36 class ThrowsException extends HTMLElement {
37     constructor() {
38         throw 'Bad';
39     }
40 };
41 document.defineElement('throws-exception', ThrowsException);
42
43 </script>
44 <returns-text></returns-text>
45 <returns-non-element-object></returns-non-element-object>
46 <lacks-super-call></lacks-super-call>
47 <throws-exception></throws-exception>
48 <script>
49
50 test(function () {
51     var instance = document.querySelector('returns-text');
52
53     assert_false(instance instanceof ReturnsTextNode, 'HTML parser must NOT instantiate a custom element when the constructor returns a Text node');
54     assert_true(instance instanceof HTMLElement, 'The fallback element created by HTML parser must be an instance of HTMLElement');
55     assert_true(instance instanceof HTMLUnknownElement, 'The fallback element created by HTML parser must be an instance of HTMLUnknownElement');
56
57 }, 'HTML parser must create a fallback HTMLUnknownElement when a custom element constructor returns a Text node');
58
59 test(function () {
60     var instance = document.querySelector('returns-non-element-object');
61
62     assert_false(instance instanceof ReturnsNonElementObject, 'HTML parser must NOT instantiate a custom element when the constructor returns a non-Element object');
63     assert_true(instance instanceof HTMLElement, 'The fallback element created by HTML parser must be an instance of HTMLElement');
64     assert_true(instance instanceof HTMLUnknownElement, 'The fallback element created by HTML parser must be an instance of HTMLUnknownElement');
65
66 }, 'HTML parser must create a fallback HTMLUnknownElement when a custom element constructor returns non-Element object');
67
68 test(function () {
69     var instance = document.querySelector('lacks-super-call');
70
71     assert_false(instance instanceof LacksSuperCall, 'HTML parser must NOT instantiate a custom element when the constructor does not call super()');
72     assert_true(instance instanceof HTMLElement, 'The fallback element created by HTML parser must be an instance of HTMLElement');
73     assert_true(instance instanceof HTMLUnknownElement, 'The fallback element created by HTML parser must be an instance of HTMLUnknownElement');
74
75 }, 'HTML parser must create a fallback HTMLUnknownElement when a custom element constructor does not call super()');
76
77 test(function () {
78     var instance = document.querySelector('throws-exception');
79
80     assert_false(instance instanceof ThrowsException, 'HTML parser must NOT instantiate a custom element when the constructor throws an exception');
81     assert_true(instance instanceof HTMLElement, 'The fallback element created by HTML parser must be an instance of HTMLElement');
82     assert_true(instance instanceof HTMLUnknownElement, 'The fallback element created by HTML parser must be an instance of HTMLUnknownElement');
83
84 }, 'HTML parser must create a fallback HTMLUnknownElement when a custom element constructor throws an exception');
85
86 </script>
87 </body>
88 </html>