<html>
<head>
    <title>Check exception thrown by getAllResponseHeaders and some
    characteristics of the return value</title>
<script type="text/javascript">

function log (msg) {
    var paragraph = document.createElement("li");
    paragraph.innerHTML=msg.replace(/\n/gm,"<br>");
    document.getElementById("console").appendChild(paragraph);
}

var xhr;

if (window.XMLHttpRequest) {
    xhr = new XMLHttpRequest();
} else {
    try {
        xhr = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (ex) {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
}

var savedHeader = null;
xhr.onreadystatechange = function() {
    var rState = this.readyState;
    // We expect an INVALID_STATE_ERR exception for readyState < 2
    // and no exception for readyState >= 2
    try {
        var header = this.getAllResponseHeaders();
        if (rState != this.readyState)
            log("UNCERTAIN " + rState + ": readyState changed while getting headers.");
        if (rState < 2) {
            log("FAILED " + rState + ": headerlist=" + header);
        } else if (header)
            if (savedHeader)
                if (savedHeader != header) {
                    log("FAILED " + rState +
": headerlist changed after it was first returned. Previous header list:\n"
+ savedHeader + "\n New headerlist:\n" + header);
                savedHeader = header;
                } 
                else //savedHeader == header here; no need to reprint header
                    log("PASSED " + rState);
            else {//first header list retrieved
                if (/^Set-Cookie:|^Set-Cookie2:/im.test(header))
                    log("FAILED " + rState +
": /^Set-Cookie:|^Set-Cookie2:/ matches. getAllResponseHeaders returned:\n" + header);
                else if (window.testRunner)
//do not print list for automated tests to avoid false failures.
                    log("PASSED " + rState +
": getAllResponseHeaders returned what looks like a conforming headerlist.");
                else
                    log("PASSED " + rState +
": getAllResponseHeaders returned:\n" + header);
                savedHeader = header;
            }
        else //header is null
            log("FAILED " + rState + ": null header list returned");
    } catch (e) {
        if (rState < 2) {
            log("PASSED " + rState);
        } else {
            log("FAILED " + rState + ": EXCEPTION THROWN: " + e.message + ".");
        }
    }
    if ((rState == 4) && (window.testRunner))
            testRunner.notifyDone();
}

function test() {
    if (window.testRunner) {
        testRunner.waitUntilDone();
        testRunner.dumpAsText();
    }
    // Test for readyState = 0
    try {
        var header = xhr.getAllResponseHeaders();
        log("FAILED " + xhr.readyState + ": header=" + header);
    } catch (e) {
        log("PASSED " + xhr.readyState);
    }
    try {
        xhr.open("GET","resources/1251.html", true);
        xhr.send(null);
    } catch(e) {
        log("FAILED open/send: EXCEPTION THROWN: " + e.message +".");
        if (window.testRunner)
            testRunner.notifyDone();
    }
}
</script>
</head>
<body onload="test()">

<p>Test page for <a href="http://bugs.webkit.org/show_bug.cgi?id=15356">bug 15356</a>
and <a href="http://bugs.webkit.org/show_bug.cgi?id=29121">bug 29121</a></p>
<p>Assertion: Invoking getAllResponseHeaders method when readyState >= 2
(HEADERS_RECEIVED) should return a conforming list of headers.</p>
<script>
    if (!window.testRunner)
        document.write("<p>If the test passes one should see \
below the ruler the text \"passed\" in all capital letters, 5 times, \
followed each time by a space and the readyState number.</p>\n\
<p>ReadyStatenumbers should be in ascending order 0 to 4.</p>\n\
<p>A conforming list of response headers should also be printed.</p>\n\
<p>A conforming list of headers:</p> \
   <li> contains one header per line.</li> \
   <li> has header names and header values separated by a COLON and \
a SPACE.</li>\
   <li> does not contain any headers that match (case-insensitively) \
Set-Cookie or Set-Cookie2</li>");
 </script>
 <hr>
 <p><ol id=console></ol></p>
</body>
</html>
