<p>Tests the behavior of whitelisting origins and removing them later.</p>

<pre id="console"></pre>
<script>
testRunner.dumpAsText();

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

function loadURL(url, expectSuccess)
{
    log("Loading: " + url + " " + (expectSuccess ? "(expecting PASS)" : "(expecting NETWORK_ERR)"));

    var req = new XMLHttpRequest();
    req.open("GET", url, false);
    try {
        req.send(null);
        log((expectSuccess ? "PASS: " : "FAIL: ") + req.responseText);
    } catch (e) {
        log((expectSuccess ? "FAIL: " : "PASS: ") + e);
    }
}

function test(origin, protocol, host, subdomains, url)
{
    log("Testing: source origin: " + origin + " destination origin: " + protocol + ":" + host + " " + (subdomains ? "allowing subdomains" : ""));

    loadURL(url, false);

    testRunner.addOriginAccessWhitelistEntry(origin, protocol.toLowerCase(), host.toLowerCase(), subdomains);

    loadURL(url, true);

    testRunner.removeOriginAccessWhitelistEntry(origin, protocol, host, subdomains);

    loadURL(url, false);

    log("\n");
}

var tests = [
    ["http://127.0.0.1:8000", "http", "localhost", false, "http://localhost:8000/xmlhttprequest/resources/get.txt"],
    ["http://127.0.0.1:8000", "http", "localhost", true, "http://localhost:8000/xmlhttprequest/resources/get.txt"],
    ["http://127.0.0.1:8000", "hTtP", "LoCaLhOsT", true, "http://localhost:8000/xmlhttprequest/resources/get.txt"],
    ["http://127.0.0.1:8000", "http", "", true, "http://localhost:8000/xmlhttprequest/resources/get.txt"]
];

tests.forEach(function(testEntry) { test.apply(null, testEntry) });
</script>
