<!doctype html>
<html>
  <head>
    <title>XMLHttpRequest: send() - "Basic" authenticated CORS request using setRequestHeader() but not setting withCredentials (expects to succeed)</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <script src="/common/utils.js"></script>
    <!-- These spec references do not make much sense simply because the spec doesn't say very much about this.. -->
    <link rel="help" href="https://xhr.spec.whatwg.org/#the-setrequestheader()-method" data-tested-assertations="following::ol[1]/li[6]" />
    <link rel="help" href="https://xhr.spec.whatwg.org/#the-send()-method" data-tested-assertations="following::code[contains(@title,'http-authorization')]/.." />
  </head>
  <body>
    <div id="log"></div>
    <script>
    function doTest(desc, pathsuffix, conditionsFunc, errorFunc, endFunc) {
      var test = async_test(desc)
      test.step(function() {
        var client = new XMLHttpRequest(),
            urlstart = location.host + location.pathname.replace(/\/[^\/]*$/, '/'),
            user = token()
        client.open("GET", location.protocol + "//www1." + urlstart + "resources/" + pathsuffix, true)
        client.setRequestHeader("x-user", user)
        client.setRequestHeader("x-pass", 'pass')
        client.setRequestHeader("Authorization", "Basic " + btoa(user + ":pass"))
        client.onerror = test.step_func(errorFunc)
        client.onreadystatechange = test.step_func(function () {
          if(client.readyState < 4) {return}
          conditionsFunc(client, test, user)
        })
        if(endFunc) {
          client.onloadend = test.step_func(endFunc)
        }
        client.send(null)
      })
    }

    doTest("CORS request with setRequestHeader auth to URL accepting Authorization header", "auth7/corsenabled.py", function (client, test, user) {
      assert_true(client.responseText == (user + "\npass"), "responseText should contain the right user and password")
      assert_equals(client.status, 200)
      assert_equals(client.getResponseHeader("x-challenge"), "DID-NOT")
      test.done()
    }, function(){
      assert_unreached("Cross-domain request is permitted and should not cause an error")
      this.done()
    })

    var errorFired = false;
    doTest("CORS request with setRequestHeader auth to URL NOT accepting Authorization header", "auth8/corsenabled-no-authorize.py", function (client, test, user) {
      assert_equals(client.responseText, '')
      assert_equals(client.status, 0)
    }, function(e){
      errorFired = true
      assert_equals(e.type, 'error', 'Error event fires when Authorize is a user-set header but not allowed by the CORS endpoint')
    }, function() {
      assert_true(errorFired, 'The error event should fire')
      this.done()
    })

    </script>
  </body>
</html>
