<!doctype html>
<html>
  <head>
    <title>XMLHttpRequest: responseXML basic test</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <link rel="help" href="https://xhr.spec.whatwg.org/#the-responsexml-attribute" data-tested-assertations="following::ol[1]/li[2] following::ol[1]/li[4]" />
    <link rel="help" href="https://xhr.spec.whatwg.org/#document-response-entity-body" data-tested-assertations="following::ol[1]/li[1] following::ol[1]/li[6] following::ol[1]/li[10]" />
  </head>
  <body>
    <div id="log"></div>
    <script>
      test(function() {
        var client = new XMLHttpRequest()
        assert_equals(client.responseXML, null)
        client.open("GET", "resources/well-formed.xml", false)
        assert_equals(client.responseXML, null)
        client.send(null)
        assert_equals(client.responseXML.documentElement.localName, "html", 'localName is html')
        assert_equals(client.responseXML.documentElement.childNodes.length, 5, 'childNodes is 5')
        assert_equals(client.responseXML.getElementById("n1").localName, client.responseXML.documentElement.childNodes[1].localName)
        assert_equals(client.responseXML.getElementById("n2"), client.responseXML.documentElement.childNodes[3], 'getElementById("n2")')
        assert_equals(client.responseXML.getElementsByTagName("p")[1].namespaceURI, "namespacesarejuststrings", 'namespaceURI')
      })
      test(function() {
        var client = new XMLHttpRequest()
        client.open("GET", "resources/status.py?type=application/xml", false)
        client.send(null)
        assert_equals(client.responseXML, null)
      }, 'responseXML on empty response documents')
    </script>
  </body>
</html>
