<html>
<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);
        }
    }

    // sync
    req = new XMLHttpRequest;
    req.open("GET", "resources/basic-auth/basic-auth.py?uid=sync", false, "sync", "123");
    sendAndLogResponse("sync", req);

    req.open("GET", document.URL.replace("basic-auth.html", "resources/basic-auth/basic-auth.py?uid=sync2"), false, "sync2", "123");
    sendAndLogResponse("sync2", req);

    req.open("GET", document.URL.replace("basic-auth.html", "resources/basic-auth/basic-auth.py?uid=sync3").replace("http://", "http://sync3:123@"), false);
    sendAndLogResponse("sync3", req);

    req.open("GET", document.URL.replace("basic-auth.html", "resources/basic-auth/basic-auth.py?uid=sync4").replace("http://", "http://incorrect:incorrect@"), false, "sync4", "123");
    sendAndLogResponse("sync4", req);

    req.open("GET", document.URL.replace("basic-auth.html", "resources/basic-auth/basic-auth.py?uid=sync5").replace("http://", "http://sync5:123@"), false, undefined, undefined);
    sendAndLogResponse("sync5", req);

    req.open("GET", document.URL.replace("basic-auth.html", "resources/basic-auth/basic-auth.py?uid=sync6").replace("http://", "http://sync6:123@"), false, undefined);
    sendAndLogResponse("sync6", req);

    req.open("GET", document.URL.replace("basic-auth.html", "resources/basic-auth/basic-auth.py?uid=sync7").replace("http://", "http://sync7:incorrect@"), false, undefined, "123");
    sendAndLogResponse("sync7", req);

    // async
    var asyncStep = 1;

    req.onreadystatechange = processStateChange;
    req.open("GET", "resources/basic-auth/basic-auth.py?uid=async", true, "async", "123");
    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", document.URL.replace("basic-auth.html", "resources/basic-auth/basic-auth.py?uid=async2"), true, "async2", "123");
            req.send("");
          } else if (asyncStep == 2) {
            asyncStep = 3;
            log('async2: ' + req.responseText);
            req.onreadystatechange = processStateChange;
            req.open("GET", document.URL.replace("basic-auth.html", "resources/basic-auth/basic-auth.py?uid=async3").replace("http://", "http://async3:123@"), true, "async3", "123");
            req.send("");
          } else if (asyncStep == 3) {
            asyncStep = 4;
            log('async3: ' + req.responseText);
            req.onreadystatechange = processStateChange;
            req.open("GET", document.URL.replace("basic-auth.html", "resources/basic-auth/basic-auth.py?uid=async4").replace("http://", "http://incorrect:incorrect@"), true, "async4", "123");
            req.send("");
          } else if (asyncStep == 4) {
            asyncStep = 5;
            log('async4: ' + req.responseText);
            req.onreadystatechange = processStateChange;
            req.open("GET", document.URL.replace("basic-auth.html", "resources/basic-auth/basic-auth.py?uid=async5").replace("http://", "http://async5:123@"), true, undefined, undefined);
            req.send("");
          } else if (asyncStep == 5) {
            asyncStep = 6;
            log('async5: ' + req.responseText);
            req.onreadystatechange = processStateChange;
            req.open("GET", document.URL.replace("basic-auth.html", "resources/basic-auth/basic-auth.py?uid=async6").replace("http://", "http://async6:123@"), true, undefined);
            req.send("");
          } else if (asyncStep == 6) {
            asyncStep = 7;
            log('async6: ' + req.responseText);
            req.onreadystatechange = processStateChange;
            req.open("GET", document.URL.replace("basic-auth.html", "resources/basic-auth/basic-auth.py?uid=async7").replace("http://", "http://async7:incorrect@"), true, undefined, "123");
            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);
        }
      }
    }
</script>
</body>
</html>
