211 lines
5.5 KiB
HTML
211 lines
5.5 KiB
HTML
<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',
|
|
'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',
|
|
'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',
|
|
'DataTransfer',
|
|
'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>
|