f40bcd59a0727ee555d793104391d98d5b6ffe30
[WebKit-https.git] / LayoutTests / fast / dom / dom-constructors.html
1 <html>
2 <head>
3 <script src="../js/resources/js-test-pre.js"></script>
4 </head>
5 <body>
6 <div id="element" name="element_name"></div>
7 <script>
8 description('This test checks that all but a handful of dom constructors throw exceptions, and the rest return reasonable objects. It also tests that those constructors have higher precedence than a document element with the same ID or name.');
9
10 var element = document.getElementById("element");
11
12 // These objects should throw an exception when their constructor is called
13 // with no arguments. (Some of them may have working constructors that require
14 // arguments to be valid.)
15 var objects_exception = [
16     'Attr', 'CharacterData', 'CDATASection', 'Comment', 'Document',
17     'DocumentFragment', 'DocumentType', 'Element', 'Entity',
18     'EntityReference', 'HTMLDocument', 'Node', 'Notation',
19     'ProcessingInstruction', 'Text', 'HTMLAllCollection', 'HTMLAnchorElement',
20     'HTMLAppletElement', 'HTMLAreaElement', 'HTMLBaseElement',
21     'HTMLBaseFontElement', 'HTMLBodyElement',
22     'HTMLBRElement', 'HTMLButtonElement', 'HTMLCanvasElement',
23     'HTMLDirectoryElement', 'HTMLDivElement', 'HTMLDListElement',
24     'HTMLEmbedElement', 'HTMLFieldSetElement', 'HTMLFontElement',
25     'HTMLFormElement', 'HTMLFrameElement', 'HTMLFrameSetElement',
26     'HTMLHeadingElement', 'HTMLHeadElement', 'HTMLHRElement',
27     'HTMLHtmlElement', 'HTMLIFrameElement', 'HTMLImageElement',
28     'HTMLInputElement', 'HTMLLabelElement',
29     'HTMLLegendElement', 'HTMLLIElement', 'HTMLLinkElement',
30     'HTMLMapElement', 'HTMLMarqueeElement', 'HTMLMenuElement',
31     'HTMLMetaElement', 'HTMLModElement', 'HTMLObjectElement',
32     'HTMLOListElement', 'HTMLOptGroupElement', 'HTMLOptionElement',
33     'HTMLParagraphElement', 'HTMLParamElement', 'HTMLPreElement',
34     'HTMLQuoteElement', 'HTMLScriptElement', 'HTMLSelectElement',
35     'HTMLStyleElement', 'HTMLTableCaptionElement',
36     'HTMLTableColElement', 'HTMLTableElement',
37     'HTMLTableSectionElement', 'HTMLTableCellElement',
38     'HTMLTableRowElement', 'HTMLTextAreaElement', 'HTMLTitleElement',
39     'HTMLUListElement', 'HTMLElement', 'CanvasRenderingContext2D',
40     'Clipboard', 'Counter', 'CSSCharsetRule', 'CSSFontFaceRule',
41     'CSSImportRule', 'CSSMediaRule', 'CSSPageRule',
42     'CSSPrimitiveValue', 'CSSRule', 'CSSRuleList',
43     'CSSStyleDeclaration', 'CSSStyleRule', 'CSSStyleSheet',
44     'CSSValue', 'CSSValueList', 'DOMImplementation',
45     'HTMLCollection', 'KeyboardEvent', 'MediaList', 'MimeType',
46     'MimeTypeArray', 'MouseEvent', 'MutationEvent', 'NamedNodeMap',
47     'NodeFilter', 'NodeList', 'Plugin',
48     'PluginArray', 'Range', 'Rect', 'StyleSheet', 'StyleSheetList',
49     'TextEvent', 'WheelEvent', 'XPathResult', 'BarInfo',
50     'CanvasGradient', 'CanvasPattern', 'Console', 'Selection',
51     'Window', 'History', 'HTMLOptionsCollection', 'Location',
52     'Navigator', 'NodeIterator', 'RGBColor', 'Screen', 'TreeWalker',
53     'XPathExpression', 'Worker'
54 ];
55
56 // These objects should have a working constructor.
57 var objects_constructor = [
58     'DOMParser', 'XMLHttpRequest', 'XMLSerializer', 'XPathEvaluator',
59     'XSLTProcessor'
60 ];
61
62 // These objects should have no constructor.
63 var objects_no_constructor = [
64     'EventTargetNode', 'UndetectableHTMLCollection',
65     'XPathNSResolver', 'EventTarget', 'EventListener', 'NPObject'
66 ];
67
68 // These objects should have a working constructor, but their constructed
69 // object names differ. This is therefore a map from constructor name to
70 // constructed object.
71 var objects_different_constructor = {
72     'Audio': 'HTMLAudioElement',
73     'Option': 'HTMLOptionElement',
74     'Image': 'HTMLImageElement'
75 }
76
77 function TryAllocate(node) {
78     var Cons = this[node];
79     if (!Cons) return 'no constructor';
80     try { return new Cons() + ''; }
81     catch (e) { return 'exception'; }
82 }
83
84 function check(name, expected) {
85     actual = TryAllocate(node);
86     if (actual == expected) {
87       document.write("PASS: " + name + " '" + expected + "'<br>");
88     } else {
89       document.write("FAIL: " + name + " wanted '" + expected + "', got '" +
90           actual + "'<br>");
91     }
92 }
93
94 for (var i = 0; i < objects_exception.length; i++) {
95     var obj = objects_exception[i];
96     shouldBe("TryAllocate('" + obj + "')", "'exception'");
97 }
98
99 for (var i = 0; i < objects_no_constructor.length; i++) {
100     var obj = objects_no_constructor[i];
101     shouldBe("TryAllocate('" + obj + "')", "'no constructor'");
102 }
103
104 for (var i = 0; i < objects_constructor.length; i++) {
105     var obj = objects_constructor[i];
106     shouldBe("TryAllocate('" + obj + "')", "'[object " + obj + "]'");
107     element.id = obj;
108     shouldBe("TryAllocate('" + obj + "')", "'[object " + obj + "]'");
109     element.id = "element";
110     element.name = obj;
111     shouldBe("TryAllocate('" + obj + "')", "'[object " + obj + "]'");
112     element.name = "element_name";
113 }
114
115 for (var obj in objects_different_constructor) {
116     shouldBe("TryAllocate('" + obj + "')",
117              "'[object " + objects_different_constructor[obj] + "]'");
118     element.id = obj;
119     shouldBe("TryAllocate('" + obj + "')",
120              "'[object " + objects_different_constructor[obj] + "]'");
121     element.id = "element";
122     element.name = obj;
123     shouldBe("TryAllocate('" + obj + "')",
124              "'[object " + objects_different_constructor[obj] + "]'");
125     element.name = "element_name";
126 }
127 </script>
128 <script src="../js/resources/js-test-post.js"></script>
129 </body>
130 </html>