<html>
<head>
    <title>Check exception thrown by getReponseHeader </title>
<script type="text/javascript">

var savedHeader = null;
var headerName="Content-Type";
var nullTests =  new Array("SeT-COoKie", "sEt-coOkIE2", 
    "xxx-mytest-headerabc", null, "Content-Type:");

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

function log4(status, rState, subState, msg) {
    log(status + " " + rState + " " + subState + ": " + msg);
}

function log3(status, rState, msg) {
    log4(status, rState, headerName, msg);
}

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

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.getResponseHeader(headerName);
        if (rState != this.readyState)
            log3("UNCERTAIN", rState, "readyState changed while getting the header.");
        if (rState < 2) {
            log3("FAILED", rState, headerName + "=" + header);
        } else if (header) {
            if (savedHeader)
                if (savedHeader != header) {
                    log3("FAILED", rState,headerName + " changed after it was first returned. Previous " + headerName
                        + "=" + savedHeader + "; New " + headerName + "=" + header + ".");
                savedHeader = header;
                } 
                else //savedHeader == header here; no need to reprint header
                    log3("PASSED", rState, headerName);
            else {//first header value retrieved
                if (window.testRunner)
//do not print the header's value for automated tests to avoid false failures.
                    log3("PASSED", rState, "ResponseHeader(" + headerName + ") returned a value.");
                else
                    log3("PASSED", rState, "getResponseHeader(" + headerName + ") returned: " + header + ".");
                savedHeader = header;
            }
            for (var i=0;i<nullTests.length;++i) {
                try {
                    var str = this.getResponseHeader(nullTests[i]);
                    if (str == null)
                        log4("PASSED", rState, nullTests[i], "getResponseHeader(" + nullTests[i] +
                            ") returned null.");
                    else
                        log4("FAILED", rState, nullTests[i], "getResponseHeader(" + nullTests[i] +
                            ") returned \"" + str + "\"");
                } catch(e) {
                    log4("FAILED", rState, nullTests[i], "getResponseHeader(" + nullTests[i] + ") threw exception:" + e);
                }
            }
        }
        else //header is null
            log3("FAILED", rState, "null " + headerName + " returned.");
    } catch (e) {
        if (rState < 2)
            log3("PASSED", rState, "exception thrown");
        else
            log3("FAILED", rState, "exception thrown: " + e.message + ".");
    }
    if ((rState == 4) && (window.testRunner))
            testRunner.notifyDone();
}

if (window.testRunner) {
    testRunner.waitUntilDone();
    testRunner.dumpAsText();
}

function test() {
    // Test for readyState = 0
    try {
        var header = xhr.getResponseHeader(headerName);
        log3("FAILED", xhr.readyState, headerName + "=" + header + ".");
    } catch (e) {
        log3("PASSED", xhr.readyState, "exception thrown.");
    }
    try {
        xhr.open("GET","resources/1251.html", true);
        xhr.send(null);
    } catch(e) {
        log3("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 the getResponseHeader method when readyState >= 2
(HEADERS_RECEIVED) returns a header value if the header exists.</p>
<p>Assertion: Invoking the getResponseHeader method with the parameter
    satisfying the following conditions causes getResponseHeader
    to return null:
<li>1a. The parameter case-insensitively matches Set-Cookie;</li>
<li>1b. The parameter case-insensitively matches Set-Cookie2;</li>
<li>2.  The parameter does not match any header in the response;</li>
<li>3a. The parameter is null (it is not a valid header name);</li>
<li>3b. The parameter is "Content-Type:" (it is not a valid header name).</li>

<script>
    if (!window.testRunner)
        document.write("<p>If the test passes one should see \
below the ruler the text \"passed\" in all capital letters, once for every ready state &lt; 2, \
followed each time by a space and the readyState number and 6 times for every ready state >= 2.</p>\n\
<p>ReadyState numbers should be in ascending order 0 to 4.</p>\n\
<p>ReadyState numbers should be followed by a blank, the name of the header tested, colon a space and a message.</p>\
<p>The value of the " + headerName + " header should  be printed for ready state 2.</p>");
</script>
 <hr>
 <p><ol id=console></ol></p>
</body>
</html>
