<!DOCTYPE html>
<title>Node.removeChild</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="creators.js"></script>
<div id="log"></div>
<iframe src=about:blank></iframe>
<script>
var documents = [
  [function() { return document }, "the main document"],
  [function() { return frames[0].document }, "a frame document"],
  [function() { return document.implementation.createHTMLDocument() },
   "a synthetic document"],
];

documents.forEach(function(d) {
  var get = d[0], description = d[1]
  for (var p in creators) {
    var creator = creators[p];
    test(function() {
      var doc = get();
      var s = doc[creator]("a")
      assert_equals(s.ownerDocument, doc)
      assert_throws("NOT_FOUND_ERR", function() { document.body.removeChild(s) })
      assert_equals(s.ownerDocument, doc)
    }, "Passing a detached " + p + " from " + description +
       " to removeChild should not affect it.")

    test(function() {
      var doc = get();
      var s = doc[creator]("b")
      doc.documentElement.appendChild(s)
      assert_equals(s.ownerDocument, doc)
      assert_throws("NOT_FOUND_ERR", function() { document.body.removeChild(s) })
      assert_equals(s.ownerDocument, doc)
    }, "Passing a non-detached " + p + " from " + description +
       " to removeChild should not affect it.")

    test(function() {
      var doc = get();
      var s = doc[creator]("test")
      doc.body.appendChild(s)
      assert_equals(s.ownerDocument, doc)
      assert_throws("NOT_FOUND_ERR", function() { s.removeChild(doc) })
    }, "Calling removeChild on a " + p + " from " + description +
       " with no children should throw NOT_FOUND_ERR.")
  }
});

test(function() {
  assert_throws(new TypeError(), function() { document.body.removeChild(null) })
  assert_throws(new TypeError(), function() { document.body.removeChild({'a':'b'}) })
}, "Passing a value that is not a Node reference to removeChild should throw TypeError.")
</script>
