<!DOCTYPE html>
<html>
<body>
<p>Test sharing SharedArrayBuffers between dedicated workers.</p>
<div id="result"></div>
<script type="text/javascript">
function log(message)
{
    document.getElementById("result").innerHTML += message + "</br>";
}

if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

var testCases = [
    {name: "SharedArrayBuffer"},
    {name: "Int8Array"},
    {name: "Uint8Array"},
    {name: "Uint8ClampedArray"},
    {name: "Int16Array"},
    {name: "Uint16Array"},
    {name: "Int32Array"},
    {name: "Uint32Array"},
    {name: "Float32Array"},
    {name: "Float64Array"}
];
var currentTestCase = 0;

function runTestCase(testCase) {
    var length = 8;
    var name = testCase.name;
    var type = window[name];
    var sab;
    var ta;

    log("Running " + name + " test case");

    if (testCase.name == 'SharedArrayBuffer') {
        sab = new SharedArrayBuffer(length);
        ta = new Uint8Array(sab);
    } else {
        sab = new SharedArrayBuffer(length * type.BYTES_PER_ELEMENT);
        ta = new type(sab);
    }

    var i;
    for (i = 0; i < length; ++i)
        ta[i] = i;

    // Without Atomics, we can't safely test modifying the contents of the
    // SharedArrayBuffer. All we can test for now is that the SharedArrayBuffer
    // is not neutered when transferred to a Worker.
    if (testCase.name == 'SharedArrayBuffer')
        worker.postMessage({name: name, data: sab, length: length}, [sab]);
    else
        worker.postMessage({name: name, data: ta, length: length}, [sab]);

    if (sab.length === 0)
        log("FAIL: SharedArrayBuffer was neutered during transfer.");
    else
        log("PASS: SharedArrayBuffer not neutered during transfer.");

    // Ensure the data wasn't changed.
    for (i = 0; i < length; ++i) {
        if (ta[i] != i) {
            log("FAIL: Original data changed during transfer. Expected " + i +
                " got " + ta[i]);
            break;
        }
    }
    if (i == length)
        log("PASS: Original data not changed during transfer.");
}

if (window.internals && internals.runtimeFlags.sharedArrayBufferEnabled && window.SharedArrayBuffer) {
    var worker = new Worker('resources/worker-sharedarraybuffer-transfer.js');

    runTestCase(testCases[currentTestCase]);

    worker.onmessage = function(e) {
        if (e.data == 'DONE') {
            // The current test case is finished.
            if (++currentTestCase == testCases.length) {
                log("DONE");
                testRunner.notifyDone();
            } else {
                runTestCase(testCases[currentTestCase]);
            }
        } else {
            // The worker sent a pass/fail message.
            log(e.data);
        }

    };
} else {
    log("SharedArrayBuffers are not enabled -- skipping test.");
    testRunner.notifyDone();
}

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