 <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>XMLHttpRequest: redirected worker scripts, origin and referrer</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
</head>
<body>
    <div id="log"></div>
    <script type="text/javascript">
        var test = async_test() // This "test" does not actually do any assertations. It's just there to have multiple, separate, asyncronous sub-tests.
        var expectations = {
            'Referer header': 'Referer: '+(location.href.replace(/[^/]*$/, ''))+"resources/workerxhr-origin-referrer.js\n",
            'Origin header': 'Origin: '+location.protocol+'//'+location.hostname+((location.port === "")?"":":"+location.port)+'\n',
            'Request URL test' : (location.href.replace(/[^/]*$/, ''))+'resources/requri.py?full'
        }
        // now start the worker
        var finalWorkerURL = "workerxhr-origin-referrer.js";
        var url = "resources/redirect.py?location=" + encodeURIComponent(finalWorkerURL);
        var worker = new Worker(url, true)
        worker.onmessage = function (e) {
            var subtest = async_test(e.data.test)
            subtest.step(function(){
                var thisExpectation = expectations[e.data.test]
                delete expectations[e.data.test]
                assert_equals(e.data.result, thisExpectation)
                subtest.done()
            })
            var allDone = true
            for(var prop in expectations){
                  allDone = false
            }
            if(allDone){
                test.step(function(){
                    test.done()
                })
            }
        }

    </script>
</body>
</html>
