<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
</head>
<body>
<script>
function getOrCreate(id, tagName)
{
    var element = document.getElementById(id);
    if (element)
        return element;
    
    element = document.createElement(tagName);
    element.id = id;
    var parent = document.body || document.documentElement;
    var refNode = parent.firstChild;
    
    parent.insertBefore(element, refNode);
    return element;
}

function debug(msg)
{
    var span = document.createElement("span");
    getOrCreate("console", "div").appendChild(span); // insert it first so XHTML knows the namespace
    span.innerHTML = msg + '<br />';
}

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

var verbose = false;

var memory;

var numWorkers = 0;
function startWorker(file)
{
    if (verbose)
        debug("Starting worker: " + file);
    numWorkers++;
    var worker = new Worker(file);
    worker.onmessage = function(event) {
        if (event.data == "done") {
            if (verbose)
                debug("Finished worker: " + file);
            if (--numWorkers)
                return;
            debug("All workers done!");
            done();
            return;
        }
        if (event.data.indexOf("Error") == 0) {
            debug("Test failed: "+ event.data);
            if (window.testRunner)
                testRunner.notifyDone();
        }
        
        if (verbose)
            debug("Event from " + file + ": " + event.data);
    };
    worker.postMessage(memory);
}

function done()
{
    for (var i = 0; i < 3; ++i) {
        if (memory[i] != 1)
            throw "Error: Bad value at memory[" + i + "]: " + memory[i];
    }
    for (var i = 3; i < memory.length; ++i) {
        if (memory[i] != 0)
            throw "Error: Bad value at memory[" + i + "]: " + memory[i];
    }
    debug("Test passed!");

    if (window.testRunner)
        testRunner.notifyDone();
}

var sabCreator = new Worker("sab-creator-no-transfer.js");
sabCreator.onmessage = function(event) {
    memory = event.data;
    
    startWorker("simple-worker-1.js");
    startWorker("simple-worker-2.js");
};

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