<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<script>
var elem;
var ns = "http://not-html.test";

function testDocumentProperty(attributeName, elementName, base) {
  var elem;
  if (typeof base == 'undefined')
    base = 0;

  elem = document.createElementNS(ns, elementName);
  document.body.appendChild(elem);
  shouldBe("document." + attributeName + ".length", base + "");
  document.body.removeChild(elem);

  elem = document.createElement(elementName);
  document.body.appendChild(elem);
  shouldBe("document." + attributeName + ".length", base + 1 + "");
  document.body.removeChild(elem);
}

function testDocumentPropertyWithAttribute(attributeName, elementName, elementAttributeName, base) {
  var elem;
  if (typeof base == 'undefined')
    base = 0;

  elem = document.createElementNS(ns, elementName);
  elem.setAttribute(elementAttributeName, "foo");
  document.body.appendChild(elem);
  shouldBe("document." + attributeName + ".length", base + "");
  document.body.removeChild(elem);

  elem = document.createElement(elementName);
  elem.setAttribute(elementAttributeName, "foo");
  document.body.appendChild(elem);
  shouldBe("document." + attributeName + ".length", base + 1 + "");
  document.body.removeChild(elem);
}

function testElementProperty(elementName, attributeName, subelementName, base) {
  var subelem;
  if (typeof base == 'undefined')
    base = 0;

  elem = document.createElement(elementName);
  subelem = document.createElementNS(ns, subelementName);
  elem.appendChild(subelem);
  shouldBe("elem." + attributeName + ".length", base + "");
  elem.removeChild(subelem);

  subelem = document.createElement(subelementName);
  elem.appendChild(subelem);
  shouldBe("elem." + attributeName + ".length", base + 1 + "");
  elem.removeChild(subelem);
}

function runTest() {
  if (window.testRunner)
    window.testRunner.dumpAsText();

  description('Tests that HTMLCollection only properly contains HTML elements');

  var elem;
  select = document.createElement("select");
  elem = document.createElementNS(ns, "option");
  select.appendChild(elem);
  shouldBe("select.options.length", "0");
  shouldBe("select.selectedOptions.length", "0");

  elem = document.createElement("option");
  select.appendChild(elem);
  shouldBe("select.options.length", "1");

  testDocumentProperty("images", "img");
  testDocumentProperty("forms", "form");
  testDocumentProperty("applets", "applet");
  testDocumentProperty("embeds", "embed");

  // Note that this is run before the final script element on this page is inserted
  testDocumentProperty("scripts", "script", 3);

  testDocumentPropertyWithAttribute("links", "a", "href");
  testDocumentPropertyWithAttribute("links", "area", "href");
  testDocumentPropertyWithAttribute("anchors", "a", "name");

  testElementProperty("map", "areas", "area");
  testElementProperty("table", "rows", "tr");
  testElementProperty("table", "tBodies", "tbody");
  testElementProperty("tr", "cells", "td");
  testElementProperty("thead", "rows", "tr");
  testElementProperty("tbody", "rows", "tr");
  testElementProperty("tfoot", "rows", "tr");
}
</script>
</head>
<body>
  <script>runTest();</script>
  <script src="../../resources/js-test-post.js"></script>
</body>
</html>
