<!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_dom("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_dom("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_dom(
        "NOT_FOUND_ERR",
        (doc.defaultView || self).DOMException,
        function() { s.removeChild(doc) }
      );
    }, "Calling removeChild on a " + p + " from " + description +
       " with no children should throw NOT_FOUND_ERR.")
  }
});

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