<!DOCTYPE html>
<html>
<body>
<p>Verify that creation of a worker does not leak its creating document.</p>
<div id='console'></div>
<script src='resources/worker-util.js'></script>
<script>
function log(message)
{
    document.getElementById("console").innerHTML += message + "<br>";
}

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

// Set this number as high as possible without introducing timeouts in debug builds.
// Reducing it does not require rebaselines.
var numIterations = 6;

var currentIteration = 0;
var iframe = null;
var numLiveAtStart = 0;
var numLiveAtEnd = 0;

window.onmessage = function(event) {
    if (event.data == "done") {
        runOneIteration();
    }
};

function startTest()
{
    gc();
    if (window.internals && window.internals.numberOfLiveDocuments) {
        numLiveAtStart = window.internals.numberOfLiveDocuments();
        // Depending on which tests ran before this one in DumpRenderTree,
        // their Document instances may not have been fully cleaned up yet.
        // When this test is run in isolation, there should be only one
        // live document at this point.
        runOneIteration();
    } else {
        log("window.internals.numberOfLiveDocuments not available -- no point in running test");
        finishTest();
    }
}

function runOneIteration() {
    if (currentIteration < numIterations) {
        ++currentIteration;

        var createdIframe = false;
        if (!iframe) {
            iframe = document.createElement("iframe");
            createdIframe = true;
        }
        iframe.setAttribute("src", "resources/worker-document-leak-iframe.html");
        if (createdIframe)
            document.body.appendChild(iframe);
    } else {
        finishTest();
    }
}

function finishTest()
{
    gc();

    if (window.internals && window.internals.numberOfLiveDocuments) {
        numLiveAtEnd = window.internals.numberOfLiveDocuments();
        // Under no circumstances should the number of live documents
        // at the end be more than 1 greater than the number at the
        // beginning (because of the iframe).
        if (numLiveAtEnd > numLiveAtStart + 1) {
            log("FAIL: leaked documents during test run (started with " + numLiveAtStart + ", ended with " + numLiveAtEnd + ")");
        } else {
            log("PASS: did not leak documents during test run");
        }
    }

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

window.onload = startTest;
</script>
</body>
</html>
