<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'; connect-src 'none'">
<script>
if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}
</script>
</head>
<body>
<p>This tests that in an isolated world the Content Security Policy of the parent origin (this page) is bypassed and a Web Worker is allowed to make an XHR request.</p>
<pre id="result"></pre>
<script>
window.onmessage = function (event)
{
    document.getElementById("result").textContent = event.data;
    if (window.testRunner)
        testRunner.notifyDone();
}

function runTest()
{
    var script = [
        'var exception;',
        'var xhr;',
        'try {',
        '    var isAsynchronous = false;',
        '    xhr = new XMLHttpRequest;',
        '    xhr.open("GET", "http://127.0.0.1:8000/xmlhttprequest/resources/get.txt", isAsynchronous);',
        '    xhr.send();',
        '} catch (e) {',
        '    exception = e;',
        '}',
        'if (exception)',
        '    self.postMessage("FAIL should not have thrown an exception. Threw exception " + exception + ".");',
        'else',
        '    self.postMessage(xhr.response);',
    ].join("\n");

    var worker;
    try {
        worker = new Worker(window.URL.createObjectURL(new Blob([script])));
        worker.onmessage = function (event) { window.postMessage(event.data, "*") };
    } catch (exception) {
        window.postMessage("FAIL should not have thrown an exception when creating worker. Threw exception " + exception + ".", "*");
    }
}

if (window.testRunner)
    testRunner.evaluateScriptInIsolatedWorld(0, runTest.toString() + ";runTest();");
</script>
</body>
</html>
