<p>This test verifies that an Objective-C reference to a DOM object remains valid
after the frame that provided the DOM object navigates to a new location.
</p>
<p>If the test passes, you'll see a 'PASS' message below.
</p>
<hr>
<pre id="log"></pre>

<iframe id="iframe" src="data:text/html, " style="width: 0; height: 0; visibility: hidden"></iframe>

<script>
function log(s)
{
    document.getElementById("log").appendChild(document.createTextNode(s));
}

var iframe = document.getElementById("iframe");

var count = 0;

function runTest()
{
    // Use a possibly stale pointer.
    objCController.accessStoredWebScriptObject(); 

    // Repeat, just to be sure.
    if (++count < 100) { // >
        queueTest();
        return;
    }

    log("PASS: You didn't crash.\n");
    layoutTestController.notifyDone();
}

function queueTest()
{
    iframe.onload = runTest;
    objCController.storeWebScriptObject(count % 2 == 0 ? iframe.contentWindow : iframe.contentDocument.documentElement);
    iframe.contentWindow.location.reload();
}

function timeoutTest()
{
    log("FAIL: Test timed-out after " + count + " runs.\n");
    layoutTestController.notifyDone();
}

window.onload = function onload()
{
    if (!("layoutTestController" in window) || !("objCController" in window)) {
        var errorMessage = "FAIL: This test can only run inside DumpRenderTree on the mac.";
        log(errorMessage);
        throw errorMessage;
    }

    timeoutIdentifier = setTimeout(timeoutTest, 30000); // timeout after 30 seconds

    layoutTestController.dumpAsText();
    layoutTestController.waitUntilDone();

    queueTest();
}
</script>
