<!doctype html>
<html>
  <head>
    <title>XMLHttpRequest: abort() during DONE</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <link rel="help" href="https://xhr.spec.whatwg.org/#the-abort()-method" data-tested-assertations="following-sibling::ol/li[4] following-sibling::ol/li[5]" />
  </head>
  <body>
    <div id="log"></div>
    <script>
      async_test(test => {
        var client = new XMLHttpRequest(),
            result = [],
            expected = [1, 4] // open() -> 1, send() -> 4
        client.onreadystatechange = test.step_func(function() {
          result.push(client.readyState)
        })
        client.open("GET", "resources/well-formed.xml", false)
        client.send(null)
        assert_equals(client.readyState, 4)
        assert_equals(client.status, 200)
        assert_equals(client.statusText, "OK")
        assert_equals(client.responseXML.documentElement.localName, "html")
        client.abort()
        assert_equals(client.readyState, 0)
        assert_equals(client.status, 0)
        assert_equals(client.statusText, "")
        assert_equals(client.responseXML, null)
        assert_equals(client.getAllResponseHeaders(), "")
        assert_array_equals(result, expected)
        test.done()
      }, document.title + " (sync)")

      async_test(test => {
        var client = new XMLHttpRequest(),
            result = [],
            expected = [1, 4] // open() -> 1, send() -> 4
        client.onreadystatechange = test.step_func(function() {
          result.push(client.readyState);
          if (client.readyState === 4) {
            assert_equals(client.readyState, 4)
            assert_equals(client.status, 200)
            assert_equals(client.statusText, "OK")
            assert_equals(client.responseXML.documentElement.localName, "html")
            client.abort();
            assert_equals(client.readyState, 0)
            assert_equals(client.status, 0)
            assert_equals(client.statusText, "")
            assert_equals(client.responseXML, null)
            assert_equals(client.getAllResponseHeaders(), "")
            test.done()
          }
        })
        client.open("GET", "resources/well-formed.xml", false)
        client.send(null)
        assert_equals(client.readyState, 0)
        assert_equals(client.status, 200)
        assert_equals(client.statusText, "OK")
        assert_equals(client.responseXML.documentElement.localName, "html")
      }, document.title + " (sync aborted in readystatechange)")

      async_test(test => {
        var client = new XMLHttpRequest(),
            result = [],
            expected = [1, 2, 3, 4]
        client.onreadystatechange = test.step_func(function() {
          result.push(client.readyState);
          if (client.readyState === 4) {
            assert_equals(client.readyState, 4)
            assert_equals(client.status, 200)
            assert_equals(client.responseXML.documentElement.localName, "html")
            client.abort();
            assert_equals(client.readyState, 0)
            assert_equals(client.status, 0)
            assert_equals(client.statusText, "")
            assert_equals(client.responseXML, null)
            assert_equals(client.getAllResponseHeaders(), "")
            test.step_timeout(function() {
              assert_array_equals(result, expected)
              test.done();
            }, 100); // wait a bit in case XHR timeout causes spurious event
          }
        })
        client.open("GET", "resources/well-formed.xml")
        client.send(null)
      }, document.title + " (async)")
    </script>
  </body>
</html>
