<!DOCTYPE html>
<meta charset=utf-8>
<title>Document.createElement</title>
<link rel=help href="https://dom.spec.whatwg.org/#dom-document-createelement">
<link rel=help href="https://dom.spec.whatwg.org/#dom-element-localname">
<link rel=help href="https://dom.spec.whatwg.org/#dom-element-tagname">
<link rel=help href="https://dom.spec.whatwg.org/#dom-element-prefix">
<link rel=help href="https://dom.spec.whatwg.org/#dom-element-namespaceuri">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<iframe src="/common/dummy.xml"></iframe>
<iframe src="/common/dummy.xhtml"></iframe>
<script>
function toASCIIUppercase(str) {
  var diff = "a".charCodeAt(0) - "A".charCodeAt(0);
  var res = "";
  for (var i = 0; i < str.length; ++i) {
    if ("a" <= str[i] && str[i] <= "z") {
      res += String.fromCharCode(str.charCodeAt(i) - diff);
    } else {
      res += str[i];
    }
  }
  return res;
}
function toASCIILowercase(str) {
  var diff = "a".charCodeAt(0) - "A".charCodeAt(0);
  var res = "";
  for (var i = 0; i < str.length; ++i) {
    if ("A" <= str[i] && str[i] <= "Z") {
      res += String.fromCharCode(str.charCodeAt(i) + diff);
    } else {
      res += str[i];
    }
  }
  return res;
}
var HTMLNS = "http://www.w3.org/1999/xhtml",
    valid = [
      undefined,
      null,
      "foo",
      "f1oo",
      "foo1",
      "f\u0BC6",
      "foo\u0BC6",
      ":",
      ":foo",
      "f:oo",
      "foo:",
      "f:o:o",
      "f::oo",
      "f::oo:",
      "foo:0",
      "foo:_",
      // combining char after :, invalid QName but valid Name
      "foo:\u0BC6",
      "foo:foo\u0BC6",
      "foo\u0BC6:foo",
      "xml",
      "xmlns",
      "xmlfoo",
      "xml:foo",
      "xmlns:foo",
      "xmlfoo:bar",
      "svg",
      "math",
      "FOO",
      // Test that non-ASCII chars don't get uppercased/lowercased
      "mar\u212a",
      "\u0130nput",
      "\u0131nput",
    ],
    invalid = [
      "",
      "1foo",
      "1:foo",
      "fo o",
      "\u0BC6foo",
      "}foo",
      "f}oo",
      "foo}",
      "\ufffffoo",
      "f\uffffoo",
      "foo\uffff",
      "<foo",
      "foo>",
      "<foo>",
      "f<oo",
      "-foo",
      ".foo",
      "\u0BC6",
    ]

var xmlIframe = document.querySelector('[src="/common/dummy.xml"]');
var xhtmlIframe = document.querySelector('[src="/common/dummy.xhtml"]');

function getWin(desc) {
  if (desc == "HTML document") {
    return window;
  }
  if (desc == "XML document") {
    assert_equals(xmlIframe.contentDocument.documentElement.textContent,
                  "Dummy XML document", "XML document didn't load");
    return xmlIframe.contentWindow;
  }
  if (desc == "XHTML document") {
    assert_equals(xhtmlIframe.contentDocument.documentElement.textContent,
                  "Dummy XHTML document", "XHTML document didn't load");
    return xhtmlIframe.contentWindow;
  }
}


valid.forEach(function(t) {
  ["HTML document", "XML document", "XHTML document"].forEach(function(desc) {
    async_test(function(testObj) {
      window.addEventListener("load", function() {
        testObj.step(function() {
          var win = getWin(desc);
          var doc = win.document;
          var elt = doc.createElement(t)
          assert_true(elt instanceof win.Element, "instanceof Element")
          assert_true(elt instanceof win.Node, "instanceof Node")
          assert_equals(elt.localName,
                        desc == "HTML document" ? toASCIILowercase(String(t))
                                                : String(t),
                        "localName")
          assert_equals(elt.tagName,
                        desc == "HTML document" ? toASCIIUppercase(String(t))
                                                : String(t),
                        "tagName")
          assert_equals(elt.prefix, null, "prefix")
          assert_equals(elt.namespaceURI,
                        desc == "XML document" ? null : HTMLNS, "namespaceURI")
        });
        testObj.done();
      });
    }, "createElement(" + format_value(t) + ") in " + desc);
  });
});
invalid.forEach(function(arg) {
  ["HTML document", "XML document", "XHTML document"].forEach(function(desc) {
    async_test(function(testObj) {
      window.addEventListener("load", function() {
        testObj.step(function() {
          var doc = getWin(desc).document;
          assert_throws("InvalidCharacterError",
                        function() { doc.createElement(arg) })
        });
        testObj.done();
      });
    }, "createElement(" + format_value(arg) + ") in " + desc);
  });
});
</script>
