<!doctype html>
<html>
  <head>
    <title>XMLHttpRequest: responseXML document properties</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
  </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 responseURL = new URL('resources/well-formed.xml', location.href).href
      var expected = {
        domain:undefined,
        URL:responseURL,
        documentURI:responseURL,
        baseURI:responseURL,
        referrer:'',
        title:'',
        contentType:'application/xml',
        readyState:'complete',
        location:null,
        defaultView:null,
        body:null,
        doctype:null,
        all:undefined,
        cookie:''
      }

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

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

      async_test(t => {
        const client = new XMLHttpRequest();
        client.open("GET", "resources/redirect.py?location=well-formed.xml");
        client.send();
        client.onload = t.step_func_done(() => {
          assert_equals(client.responseXML.URL, responseURL);
          assert_equals(client.responseXML.baseURI, responseURL);
        });
      }, "Test document URL properties after redirect");

      async_test(t => {
        const client = new XMLHttpRequest();
        client.open("GET", "resources/redirect.py?location=base.xml");
        client.send();
        client.onload = t.step_func_done(() => {
          const localResponseURL = new URL('resources/base.xml', location.href).href;
          assert_equals(client.responseXML.URL, localResponseURL);
          assert_equals(client.responseXML.baseURI, 'https://example.com/');
          client.responseXML.documentElement.remove();
          assert_equals(client.responseXML.baseURI, localResponseURL);
          const newBase = document.createElement("base"),
                newBaseURL = "https://elsewhere.example/";
          newBase.href = "https://elsewhere.example/";
          client.responseXML.appendChild(newBase);
          assert_equals(client.responseXML.baseURI, newBaseURL);
          newBase.remove();
          document.head.appendChild(newBase);
          assert_equals(client.responseXML.baseURI, localResponseURL);
          newBase.remove();
        });
      }, "Test document URL properties of document with <base> after redirect");

      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)')

      var objectProps = [
        "styleSheets",
        "implementation",
        "images",
        "forms",
        "links",
      ];

      for (let prop of objectProps) {
        test(function() {
          assert_equals(typeof(client.responseXML[prop]), "object")
        }, prop + " should be an object")
      }
    </script>
  </body>
</html>
