<!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>";
}

var testCases = [
    "testSendSharedArrayBuffer",
    "testSendInt8Array",
    "testSendUint8Array",
    "testSendUint8ClampedArray",
    "testSendInt16Array",
    "testSendUint16Array",
    "testSendInt32Array",
    "testSendUint32Array",
    "testSendFloat32Array",
    "testSendFloat64Array",
    "testSendSharedArrayBufferTwice",
    "testTransferArrayBufferAndSharedArrayBuffer",
    "testSharedArrayBufferInTransferListViaMessagePort",
];
var testIndex = 0;

function runNextTest()
{
    if (testIndex < testCases.length) {
        testIndex++;
        try {
            window[testCases[testIndex - 1]]();
        } catch (ex) {
            log("FAIL: unexpected exception " + ex);
            runNextTest();
        }
    } else {
        log("DONE");
        if (window.testRunner)
            testRunner.notifyDone();
    }
}

function testSendSharedArrayBuffer()
{
    runSendTest("SharedArrayBuffer");
}

function testSendInt8Array()
{
    runSendTest("Int8Array");
}

function testSendUint8Array()
{
    runSendTest("Uint8Array");
}

function testSendUint8ClampedArray()
{
    runSendTest("Uint8ClampedArray");
}

function testSendInt16Array()
{
    runSendTest("Int16Array");
}

function testSendUint16Array()
{
    runSendTest("Uint16Array");
}

function testSendInt32Array()
{
    runSendTest("Int32Array");
}

function testSendUint32Array()
{
    runSendTest("Uint32Array");
}

function testSendFloat32Array()
{
    runSendTest("Float32Array");
}

function testSendFloat64Array()
{
    runSendTest("Float64Array");
}

function initializeTypedArray(ta, length) {
    var i;
    for (i = 0; i < length; ++i)
        ta[i] = i;
}

function runSendTest(name)
{
    var length = 8;
    var type = window[name];
    var sab;
    var ta;
    var msg;

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

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

    initializeTypedArray(ta, length);

    // Don't allow passing a SharedArrayBuffer in the transfer list.
    try {
      worker.postMessage(msg, [sab]);
      log("FAIL: Passing SharedArrayBuffer in the transfer list did not throw.");
    } catch (e) {
      log("PASS: Passing SharedArrayBuffer in the transfer list threw.");
    }

    // 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.
    worker.postMessage(msg);

    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.");
}

function testTransferArrayBufferAndSharedArrayBuffer() {
    var ab = new ArrayBuffer(4);
    var sab = new SharedArrayBuffer(16);
    var msg = {
      name : 'ArrayBufferAndSharedArrayBuffer',
      ab: ab,
      abLength: ab.byteLength,
      sab: sab,
      sabLength: sab.byteLength,
    };

    log("Running TransferArrayBufferAndSharedArrayBuffer test case");

    initializeTypedArray(new Uint8Array(ab), ab.byteLength);
    initializeTypedArray(new Uint8Array(sab), sab.byteLength);

    worker.postMessage(msg, [ab]);

    if (ab.byteLength === 0)
        log("PASS: ArrayBuffer was neutered during transfer.");
    else
        log("FAIL: ArrayBuffer was not neutered during transfer.");
}

function testSendSharedArrayBufferTwice() {
    var sab = new SharedArrayBuffer(16);
    var msg = {
      name : 'SharedArrayBufferTwice',
      sab: sab,
      sabLength: sab.byteLength,
      sab2: sab,
      sab2Length: sab.byteLength,
    };

    log("Running SendSharedArrayBufferTwice test case");

    initializeTypedArray(new Uint8Array(sab), sab.byteLength);

    worker.postMessage(msg);
}

function testSharedArrayBufferInTransferListViaMessagePort() {
    var ab1 = new ArrayBuffer(4);
    var ab2 = new ArrayBuffer(4);
    var sab1 = new SharedArrayBuffer(16);
    var sab2 = new SharedArrayBuffer(16);
    var msg = {
      name : 'SharedArrayBufferInTransferListViaMessagePort',
      ab1: ab1,
      ab2: ab2,
      sab1: sab1,
      sab2: sab2,
    };

    var channel = new MessageChannel();

    channel.port2.onmessage = function() {
        log("FAIL: Message should not be sent.");
    };

    log("Running SharedArrayBufferInTransferListViaMessagePort test case");

    try {
        channel.port1.postMessage(msg, [ab1, sab1, ab2, sab2]);
        log("FAIL: Passing SharedArrayBuffer in the transfer list did not throw.");
    } catch (e) {
        log("PASS: Passing SharedArrayBuffer in the transfer list threw.");
    }

    if (ab1.byteLength === 0)
        log("FAIL: ArrayBuffer 'ab1' was neutered.");
    else
        log("PASS: ArrayBuffer 'ab1' was not neutered.");

    if (ab2.byteLength === 0)
        log("FAIL: ArrayBuffer 'ab2' was neutered.");
    else
        log("PASS: ArrayBuffer 'ab2' was not neutered.");

    runNextTest();
}

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

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

    runNextTest();

    worker.onmessage = function(e) {
        if (e.data != 'DONE') {
            // The worker sent a pass/fail message.
            log(e.data);
        } else {
            runNextTest();
        }
    };
} else {
    log("SharedArrayBuffers are not enabled -- skipping test.");
    testRunner.notifyDone();
}

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