<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',
    'EventTarget',
    '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',
    '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>
