 <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>XMLHttpRequest: worker scripts, origin and referrer</title>
    <link rel="stylesheet" href="/resources/testharness.css" />
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <link rel="help" href="https://xhr.spec.whatwg.org/#the-open()-method" data-tested-assertations="following::OL[1]/LI[3] following::OL[1]/LI[3]/ol[1]/li[1] following::OL[1]/LI[3]/ol[1]/li[2] following::OL[1]/LI[3]/ol[1]/li[3]" />
</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 worker = new Worker("resources/workerxhr-origin-referrer.js", 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>

