<body>
<p><a href="rdar://problem/7062824">rdar://problem/7062824</a> A wrong password entered for site or proxy auth remains in WebCore credential storage, and is sent with subsequent requests.</p>
<p>This test counts the number of failed requests server side.</p>
<div id = result>Testing... Please cancel all authentication dialogs.</div></br>
<div>Sync</div>
<button onclick="sendWithCredentials(false)">With credentials</button>
<button onclick="sendWithoutCredentials(false)">Without credentials</button>
<div>Async</div>
<button onclick="sendWithCredentials(true)">With credentials</button>
<button onclick="sendWithoutCredentials(true)">Without credentials</button>
<br>
<button onclick="status()">Status</button>
<script>
if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone()
}

function sendWithCredentials(next)
{
    var xhr = new XMLHttpRequest;
    xhr.open("GET", "resources/remember-bad-password/count-failures.php", next ? true : false, "foo", "bar");
    xhr.send("");
    if (next) {
        xhr.onload = next;
        xhr.onerror = next;
    }
}

function sendWithoutCredentials(next)
{
    var xhr = new XMLHttpRequest;
    xhr.open("GET", "resources/remember-bad-password/count-failures.php", next ? true : false);
    xhr.send("");

    if (next) {
        xhr.onload = next;
        xhr.onerror = next;
    }
}

function status()
{
    var xhr = new XMLHttpRequest;
    xhr.open("GET", "resources/remember-bad-password/count-failures.php?command=status", false);
    xhr.send("");
    return xhr.responseText;
}

function reset()
{
    var xhr = new XMLHttpRequest;
    xhr.open("GET", "resources/remember-bad-password/count-failures.php?command=reset", false);
    xhr.send("");
}

reset();
sendWithCredentials();
sendWithoutCredentials();
sendWithCredentials(function() {
sendWithoutCredentials(function() {
var s = status();
document.getElementById("result").innerHTML = (s == 2 ? "PASS" : ("FAIL: " + s));
if (window.testRunner)
    testRunner.notifyDone();
})});
</script>
</body>
