<html>
<meta charset="utf-8">
<body>
<p>Tests for XMLHttpRequest authentication.
<script>
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }
    
    var console_messages = document.createElement("ol");
    document.body.appendChild(console_messages);
    
    function log(message)
    {
        var item = document.createElement("li");
        item.appendChild(document.createTextNode(message));
        console_messages.appendChild(item);
    }

    function sendAndLogResponse(uid, req)
    {
        try {
            req.send("");
            log(uid + ': ' + req.responseText);
        } catch (e) {
            log(uid + ": req.send raised exception: " + e);
            log(uid + ": req.readyState: " + req.readyState);
            log(uid + ": req.status: " + req.status);
        }
    }

    // async
    var asyncStep = 1;

    req = new XMLHttpRequest;
    req.onreadystatechange = processStateChange;
    req.open("GET", "resources/basic-auth/basic-auth.php?uid=1", true, "1", "%a%");
    req.send("");

    function processStateChange() {
    
      if (req.readyState == 4){
        if (req.status == 200){
          if (asyncStep == 1) {
            asyncStep = 2;
            log('async: ' + req.responseText);
            req.onreadystatechange = processStateChange;
            req.open("GET", "resources/basic-auth/basic-auth.php?uid=2", true, "2", "%40");
            req.send("");
          } else if (asyncStep == 2) {
            asyncStep = 3;
            log('async2: ' + req.responseText);
            req.onreadystatechange = processStateChange;
            req.open("GET", "resources/basic-auth/basic-auth.php?uid=3", true, "3", "@");
            req.send("");
          } else if (asyncStep == 3) {
            asyncStep = 4;
            log('async3: ' + req.responseText);
            req.onreadystatechange = processStateChange;
            req.open("GET", "resources/basic-auth/basic-auth.php?uid=4", true, "4", ":");
            req.send("");
          } else if (asyncStep == 4) {
            asyncStep = 5;
            log('async4: ' + req.responseText);
            req.onreadystatechange = processStateChange;
            req.open("GET", "resources/basic-auth/basic-auth.php?uid=5", true, "5", " ");
            req.send("");
          } else if (asyncStep == 5) {
            asyncStep = 6;
            log('async5: ' + req.responseText);
            req.onreadystatechange = processStateChange;
            req.open("GET", "resources/basic-auth/basic-auth.php?uid=6", true, "6", "%61");
            req.send("");
          } else if (asyncStep == 6) {
            asyncStep = 7;
            log('async6: ' + req.responseText);
            req.onreadystatechange = processStateChange;
            req.open("GET", "resources/basic-auth/basic-auth.php?uid=7", true, "7", "/@\\ \"#><?`");
            req.send("");
          } else if (asyncStep == 7) {
            log('async7: ' + req.responseText);
            if (window.testRunner)
              testRunner.notifyDone();
          }
        } else {
            log("async" + asyncStep + " failed with unexpected status: " + req.status + ". Response: '" + req.responseText + "'.");
            if (window.testRunner)
              testRunner.notifyDone();
        }
      }
    }
</script>
</body>
</html>
