<button onclick="presetAuthorization()">Start</button>
<pre id="console"></pre>
<script>
if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
    testRunner.setCanOpenWindows();
}

function log(message)
{
    document.getElementById('console').appendChild(document.createTextNode(message + '\n'));
}

function presetAuthorization()
{
    window.addEventListener("message", test, false);
    window.open("http://localhost:8000/xmlhttprequest/resources/cross-origin-preset-authorization-frame.html");
}

function test()
{
    log("Trying different ways to access a password protected resource from another origin. The UA already has login and password for this protection space.\n")
    log("You should see several PASS messages followed by a DONE\n");
    log("SCRIPT SRC='...' Should succeed, since authorization is sent for cross-origin subresource loads.");
    var scriptElement = document.createElement("script");
    scriptElement.setAttribute("src", "http://localhost:8000/xmlhttprequest/resources/cross-origin-authorization.php");
    scriptElement.setAttribute("onload", "test_sync_auth_stored()");
    scriptElement.setAttribute("onerror", "test_sync_auth_stored()");
    document.body.appendChild(scriptElement);
}

function test_sync_auth_stored()
{
    log("Cross-origin XMLHttpRequest (sync), testing stored authorization.");
    
    var req = new XMLHttpRequest;
    req.open("GET", "http://localhost:8000/xmlhttprequest/resources/cross-origin-authorization.php", false);
    req.withCredentials = true;
    try {
        req.send();
        log((req.status == 401) ? "FAIL: 401 Authorization required" : "PASS");
    } catch (ex) {
        log("FAIL: Got an exception. " + ex);
    }
    test_sync_cookies();
}

function test_sync_cookies()
{
    log("Cross-origin XMLHttpRequest (sync), testing cookies.");
    
    var req = new XMLHttpRequest;
    req.open("GET", "http://localhost:8000/xmlhttprequest/resources/cross-origin-check-cookies.php", false);
    req.withCredentials = true;
    req.send();
    if (req.status == 200)
        log(req.responseText.match(/WK\-cross\-origin/) ? "PASS" : "FAIL");
    else
        log("FAIL: Wrong status code " + req.status);
    test_async_auth_stored();
}

function test_async_auth_stored()
{
    log("Cross-origin XMLHttpRequest (async), testing stored authorization.");

    var req = new XMLHttpRequest;
    req.open("GET", "http://localhost:8000/xmlhttprequest/resources/cross-origin-authorization.php", true);
    req.withCredentials = true;
    req.send();
    req.onload = function() {
        log((req.status == 401) ? "FAIL: 401 Authorization required" : "PASS");
        test_async_cookies();
    }
    req.onerror = function() {
        log("FAIL: Received error event.");
        test_async_cookies();
    }
}

function test_async_cookies()
{
    log("Cross-origin XMLHttpRequest (async), testing cookies.");

    var req = new XMLHttpRequest;
    req.open("GET", "http://localhost:8000/xmlhttprequest/resources/cross-origin-check-cookies.php", true);
    req.withCredentials = true;
    req.send();
    req.onload = function() {
        log(req.responseText.match(/WK\-cross\-origin/) ? "PASS" : "FAIL");
        test_sync_auth_explicit();
    }
}

function test_sync_auth_explicit()
{
    log("Cross-origin XMLHttpRequest (sync), testing authorization with explicitly provided credentials that should be ignored.");
    
    var req = new XMLHttpRequest;
    req.open("GET", "http://localhost:8000/xmlhttprequest/resources/cross-origin-authorization.php", false, "test2", "test2");
    req.withCredentials = true;
    try {
        req.send();
        if (req.status == 200)
            log(req.responseText.match(/test2/) ? "FAIL: Explicit credentials were not ignored" : "PASS");
        else
            log("FAIL: Wrong status code " + req.status);
    } catch (ex) {
        log("FAIL: Got an exception. " + ex);
    }
    test_async_auth_explicit();
}


function test_async_auth_explicit()
{
    log("Cross-origin XMLHttpRequest (async), testing authorization with explicitly provided credentials that should be ignored.");

    var req = new XMLHttpRequest;
    req.open("GET", "http://localhost:8000/xmlhttprequest/resources/cross-origin-authorization.php", true, "test2", "test2");
    req.withCredentials = true;
    req.send();
    req.onload = function() {
        if (req.status == 200)
            log(req.responseText.match(/test2/) ? "FAIL: Explicit credentials were not ignored" : "PASS");
        else
            log("FAIL: Wrong status code " + req.status);
        log("DONE");
        if (window.testRunner)
            testRunner.notifyDone();
    }
    req.onerror = function() {
        log("FAIL: Received error event.");
        log("DONE");
        if (window.testRunner)
            testRunner.notifyDone();
    }
}

if (window.testRunner)
    presetAuthorization();
</script>
