| <html> |
| <head> |
| <script src="../../resources/js-test-pre.js"></script> |
| </head> |
| <body> |
| <div id="element" name="element_name"></div> |
| <script> |
| 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.'); |
| |
| var element = document.getElementById("element"); |
| |
| // These objects should throw an exception when their constructor is called |
| // with no arguments. (Some of them may have working constructors that require |
| // arguments to be valid.) |
| var objects_exception = [ |
| 'Attr', |
| 'CharacterData', |
| 'CDATASection', |
| 'DocumentType', |
| 'Element', |
| 'HTMLDocument', |
| 'Node', |
| 'ProcessingInstruction', |
| 'HTMLAllCollection', |
| 'HTMLAnchorElement', |
| 'HTMLAppletElement', |
| 'HTMLAreaElement', |
| 'HTMLBaseElement', |
| 'HTMLBodyElement', |
| 'HTMLBRElement', |
| 'HTMLButtonElement', |
| 'HTMLCanvasElement', |
| 'HTMLDirectoryElement', |
| 'HTMLDivElement', |
| 'HTMLDListElement', |
| 'HTMLEmbedElement', |
| 'HTMLFieldSetElement', |
| 'HTMLFontElement', |
| 'HTMLFormElement', |
| 'HTMLFrameElement', |
| 'HTMLFrameSetElement', |
| 'HTMLHeadingElement', |
| 'HTMLHeadElement', |
| 'HTMLHRElement', |
| 'HTMLHtmlElement', |
| 'HTMLIFrameElement', |
| 'HTMLImageElement', |
| 'HTMLInputElement', |
| 'HTMLLabelElement', |
| 'HTMLLegendElement', |
| 'HTMLLIElement', |
| 'HTMLLinkElement', |
| 'HTMLMapElement', |
| 'HTMLMarqueeElement', |
| 'HTMLMenuElement', |
| 'HTMLMetaElement', |
| 'HTMLModElement', |
| 'HTMLObjectElement', |
| 'HTMLOListElement', |
| 'HTMLOptGroupElement', |
| 'HTMLOptionElement', |
| 'HTMLParagraphElement', |
| 'HTMLParamElement', |
| 'HTMLPreElement', |
| 'HTMLQuoteElement', |
| 'HTMLScriptElement', |
| 'HTMLSelectElement', |
| 'HTMLStyleElement', |
| 'HTMLTableCaptionElement', |
| 'HTMLTableColElement', |
| 'HTMLTableElement', |
| 'HTMLTableSectionElement', |
| 'HTMLTableCellElement', |
| 'HTMLTableRowElement', |
| 'HTMLTextAreaElement', |
| 'HTMLTitleElement', |
| 'HTMLUListElement', |
| 'HTMLElement', |
| 'CanvasRenderingContext2D', |
| 'Counter', |
| 'CSSFontFaceRule', |
| 'CSSImportRule', |
| 'CSSMediaRule', |
| 'CSSPageRule', |
| 'CSSPrimitiveValue', |
| 'CSSRule', |
| 'CSSRuleList', |
| 'CSSStyleDeclaration', |
| 'CSSStyleRule', |
| 'CSSStyleSheet', |
| 'CSSValue', |
| 'CSSValueList', |
| 'DataTransfer', |
| 'DOMImplementation', |
| 'HTMLCollection', |
| 'MediaList', |
| 'MimeType', |
| 'MimeTypeArray', |
| 'MutationEvent', |
| 'NamedNodeMap', |
| 'NodeFilter', |
| 'NodeList', |
| 'Plugin', |
| 'PluginArray', |
| 'Rect', |
| 'StyleSheet', |
| 'StyleSheetList', |
| 'TextEvent', |
| 'XPathResult', |
| 'BarInfo', |
| 'CanvasGradient', |
| 'CanvasPattern', |
| 'Console', |
| 'Selection', |
| 'Window', |
| 'History', |
| 'HTMLOptionsCollection', |
| 'Location', |
| 'Navigator', |
| 'NodeIterator', |
| 'RGBColor', |
| 'Screen', |
| 'TreeWalker', |
| 'XPathExpression', |
| 'Worker' |
| ]; |
| |
| // These objects should have a working constructor. |
| var objects_constructor = [ |
| 'Comment', |
| 'DOMParser', |
| 'Document', |
| 'DocumentFragment', |
| 'EventTarget', |
| 'Range', |
| 'Text', |
| 'XMLHttpRequest', |
| 'XMLSerializer', |
| 'XPathEvaluator', |
| 'XSLTProcessor' |
| ]; |
| |
| // These objects should have no constructor. |
| var objects_no_constructor = [ |
| 'EventTargetNode', 'UndetectableHTMLCollection', |
| 'XPathNSResolver', 'EventListener', 'NPObject' |
| ]; |
| |
| // These objects should have a working constructor, but their constructed |
| // object names differ. This is therefore a map from constructor name to |
| // constructed object. |
| var objects_different_constructor = { |
| 'Audio': 'HTMLAudioElement', |
| 'Option': 'HTMLOptionElement', |
| 'Image': 'HTMLImageElement' |
| } |
| |
| function TryAllocate(node) { |
| var Cons = this[node]; |
| if (!Cons) return 'no constructor'; |
| try { return Object.prototype.toString.call(new Cons()); } |
| catch (e) { return 'exception'; } |
| } |
| |
| function check(name, expected) { |
| actual = TryAllocate(node); |
| if (actual == expected) { |
| document.write("PASS: " + name + " '" + expected + "'<br>"); |
| } else { |
| document.write("FAIL: " + name + " wanted '" + expected + "', got '" + |
| actual + "'<br>"); |
| } |
| } |
| |
| for (var i = 0; i < objects_exception.length; i++) { |
| var obj = objects_exception[i]; |
| shouldBe("TryAllocate('" + obj + "')", "'exception'"); |
| } |
| |
| for (var i = 0; i < objects_no_constructor.length; i++) { |
| var obj = objects_no_constructor[i]; |
| shouldBe("TryAllocate('" + obj + "')", "'no constructor'"); |
| } |
| |
| for (var i = 0; i < objects_constructor.length; i++) { |
| var obj = objects_constructor[i]; |
| shouldBe("TryAllocate('" + obj + "')", "'[object " + obj + "]'"); |
| element.id = obj; |
| shouldBe("TryAllocate('" + obj + "')", "'[object " + obj + "]'"); |
| element.id = "element"; |
| element.name = obj; |
| shouldBe("TryAllocate('" + obj + "')", "'[object " + obj + "]'"); |
| element.name = "element_name"; |
| } |
| |
| for (var obj in objects_different_constructor) { |
| shouldBe("TryAllocate('" + obj + "')", |
| "'[object " + objects_different_constructor[obj] + "]'"); |
| element.id = obj; |
| shouldBe("TryAllocate('" + obj + "')", |
| "'[object " + objects_different_constructor[obj] + "]'"); |
| element.id = "element"; |
| element.name = obj; |
| shouldBe("TryAllocate('" + obj + "')", |
| "'[object " + objects_different_constructor[obj] + "]'"); |
| element.name = "element_name"; |
| } |
| </script> |
| <script src="../../resources/js-test-post.js"></script> |
| </body> |
| </html> |