<!doctype html>
<html>
  <head>
    <title>XMLHttpRequest: responseXML document properties</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[4]" />
    <link rel="help" href="https://xhr.spec.whatwg.org/#document-response-entity-body" data-tested-assertations="following::ol[1]/li[6] following::ol[1]/li[7] following::ol[1]/li[8] following::ol[1]/li[10]" />
  </head>
  <body>
    <div id="log"></div>
    <script>
      var timePreXHR = Math.floor(new Date().getTime(new Date().getTime() - 3000) / 1000); // three seconds ago, in case there's clock drift
      var client = new XMLHttpRequest()
      client.open("GET", "resources/well-formed.xml", false)
      client.send(null)
      var expected = {
        domain:undefined,
        URL:location.href.replace(/[^/]*$/, 'resources/well-formed.xml'),
        documentURI:location.href.replace(/[^/]*$/, 'resources/well-formed.xml'),
        referrer:'',
        title:'',
        contentType:'application/xml',
        readyState:'complete',
        location:null,
        defaultView:null,
        body:undefined,
        images: undefined,
        doctype:null,
        forms:undefined,
        all:undefined,
        links: undefined,
        cookie:''
      }

      for (var name in expected) {
        runTest(name, expected[name])
      }

      function runTest(name, value){
        test(function(){
          assert_equals(client.responseXML[name], value)
        }, name)
      }

      test(function() {
        var lastModified = Math.floor(new Date(client.responseXML.lastModified).getTime() / 1000);
        var now = Math.floor(new Date().getTime(new Date().getTime() + 3000) / 1000); // three seconds from now, in case there's clock drift
        assert_greater_than_equal(lastModified, timePreXHR);
        assert_less_than_equal(lastModified, now);
      }, 'lastModified set to time of response if no HTTP header provided')

      test(function() {
        var client2 = new XMLHttpRequest()
        client2.open("GET", "resources/last-modified.py", false)
        client2.send(null)
        assert_equals((new Date(client2.getResponseHeader('Last-Modified'))).getTime(), (new Date(client2.responseXML.lastModified)).getTime())
      }, 'lastModified set to related HTTP header if provided')

      test(function() {
        client.responseXML.cookie = "thisshouldbeignored"
        assert_equals(client.responseXML.cookie, "")
      }, 'cookie (after setting it)')

      test(function() {
        assert_equals(typeof(client.responseXML.styleSheets), "object")
      }, 'styleSheets')

      test(function() {
        assert_equals(typeof(client.responseXML.implementation), "object")
      }, 'implementation')
    </script>
  </body>
</html>
