if (self.postMessage)
    runTests();
 else
    onconnect = handleConnect;

function handleConnect(event)
{
    // For shared workers, create a faux postMessage() API to send messages back to the parent page.
    self.postMessage = function(message) { event.ports[0].postMessage(message); }
    runTests();
}

function runTests()
{
    try {
        postMessage("Test started.");

        importScripts();
        postMessage("PASS: importScripts(), exists, is a function, and doesn't throw when not given any arguments");

        var source1 = "worker-importScripts-source1.js";
        var source2 = "worker-importScripts-source2.js";
        var differentOrigin = "http://localhost:8000/workers/resources/worker-importScripts-differentOrigin.js";
        var differentRedirectOrigin = "/resources/redirect.py?url=http://localhost:8000/workers/resources/worker-importScripts-differentOrigin.js";
        var syntaxErrorSource = "worker-importScripts-syntaxError.js";
        var fakeSource = "nonexistant";
        loadedSource1 = false;
        loadedSource2 = false;
        differentOriginLoaded = false;

        function resetLoadFlags() {
            loadedSource1 = false;
            loadedSource2 = false;
            differentOriginLoaded = false;
        }

        try {
            importScripts(differentOrigin)
        } catch(e) {
            postMessage("FAIL: Threw " + e + " when attempting cross origin load");
        }
        if (differentOriginLoaded)
            postMessage("PASS: executed script from different origin");

        resetLoadFlags();

        try {
            importScripts(differentRedirectOrigin)
        } catch(e) {
            postMessage("FAIL: Threw " + e + " when attempting load from different origin through a redirect");
        }
        if (differentOriginLoaded)
            postMessage("PASS: executed script from different origin through a redirect");
        else
            postMessage("FAIL: did not load script from different origin through a redirect");

        resetLoadFlags();

        postMessage("Testing single argument:");
        importScripts(source1)
        if (loadedSource1)
            postMessage("PASS: loaded first source");
        else
            postMessage("FAIL: did not load first source");

        resetLoadFlags();

        postMessage("Testing multiple arguments:");
        importScripts(source1, source2);
        if (loadedSource1 && loadedSource2)
            postMessage("PASS: Both sources loaded and executed.");
        else
            postMessage("FAIL: not all sources were loaded");

        resetLoadFlags();

        postMessage("Testing multiple arguments (different order):");
        importScripts(source2, source1);
        if (loadedSource1 && loadedSource2)
            postMessage("PASS: Both sources loaded and executed.");
        else
            postMessage("FAIL: not all sources were loaded");

        resetLoadFlags();
        firstShouldThrow = false;
        secondShouldThrow = false;
        postMessage("Testing multiple arguments, with different origin for one argument:");
        try {
            importScripts(source1, differentOrigin, source2);
        } catch(e) {
            postMessage("FAIL: Threw " + e + " when attempt cross origin load");
        }
        if (loadedSource1 && loadedSource2 && differentOriginLoaded)
            postMessage("PASS: all resources executed.");
        else
            postMessage("FAIL: Not  of the origin failure");

        resetLoadFlags();

        try {
            importScripts(source1, fakeSource, source2);
        } catch(e) {
            postMessage("PASS: Threw " + e + " when importing script");
        }
        if (!loadedSource1 && !loadedSource2)
            postMessage("FAIL: Nothing was executed when network error occurred.");
        else
            postMessage("PASS: some resources were loaded despite the network error");

        resetLoadFlags();

        try {
            importScripts(source1, syntaxErrorSource, source2);
        } catch(e) {
            postMessage("PASS: Threw " + e + " when encountering a syntax error in imported script");
        }
        if (!loadedSource1 && !loadedSource2)
            postMessage("FAIL: Nothing was executed when syntax error was present in any source.");
        else
            postMessage("PASS: some resources were loaded despite the presence of a syntax error");

        resetLoadFlags();

        postMessage("Testing multiple arguments, with first resource throwing an exception:");
        firstShouldThrow = true;
        try {
            importScripts(source1, source2);
        } catch(e) {
            postMessage("PASS: Propagated '" + e + "' from script");
        }
        firstShouldThrow = false;
        if (loadedSource1 && !loadedSource2)
            postMessage("PASS: First resource was executed, and second resource was not");
        else if (loadedSource2)
            postMessage("FAIL: Second resource was executed");
        else
            postMessage("FAIL: first resource did not execute correctly");

        resetLoadFlags();

        postMessage("Testing multiple arguments, with second resource throwing an exception:");
        secondShouldThrow = true;
        try {
            importScripts(source1, source2);
        } catch(e) {
            postMessage("PASS: Propagated '" + e + "' from script");
        }
        secondShouldThrow = false;
        if (loadedSource1 && loadedSource2)
            postMessage("PASS: Both scripts were executed");
        else
            postMessage("FAIL: scripts did not execute correctly");

        resetLoadFlags();

    } catch(e) {
        postMessage("FAIL: Unexpected exception: " + e);
    } finally {
        postMessage("DONE");
    }
}

