<pre id="console"></pre>

<script>
if (window.testRunner) {
    testRunner.waitUntilDone();
    testRunner.dumpAsText()
}

function log(msg)
{
    document.getElementById('console').appendChild(document.createTextNode(msg + "\n"));
}

var intervalId;
function cancelSetInterval()
{
    window.clearInterval(intervalId);
}

function setTimeout1()
{
    var id = window.setTimeout("log('PASS: setTimeout(\"STRING\", 0) works.'); setInterval1()", 0);
    if (id == undefined)
        done(false);
}

function setInterval1()
{
    intervalId = window.setInterval("log('PASS: setInterval(\"STRING\", 0) works.'); cancelSetInterval(); setTimeout2()", 0);
    if (intervalId == undefined)
        done(false);
}

function setTimeout2()
{
    var id = window.setTimeout(String("log('PASS: setTimeout(String(\"STRING\"), 0) works.'); setInterval2()"), 0);
    if (id == undefined)
        done(false);
}

function setInterval2()
{
    intervalId = window.setInterval(String("log('PASS: setInterval(String(\"STRING\"), 0) works.'); cancelSetInterval(); setTimeout3()"), 0);
    if (intervalId == undefined)
        done(false);
}

function setTimeout3()
{
    var id = window.setTimeout({ toString : function() { return "log('PASS: setTimeout({toString:function(){}}, 0) works.'); setInterval3();" } }, 0);
    if (id == undefined)
        done(false);
}

function setInterval3()
{
    intervalId = window.setInterval({ toString : function() { return "log('PASS: setInterval({toString:function(){}}, 0) works.'); cancelSetInterval(); setTimeout4()" } }, 0);
    if (intervalId == undefined)
        done(false);
}

function setTimeout4()
{
    try {
        var id = window.setTimeout({ toString : function() { throw "Exception"; } }, 0);
        done(false);
    } catch (e) {
        log("PASS: setTimeout({ toString : function() { throw \"Exception\"; } }, 0) correctly threw an exception.");
        setInterval4();
    }
}

function setInterval4()
{
    try {
        var id = window.setInterval({ toString : function() { throw "Exception"; } }, 0);
        window.clearInterval(id);
        done(false);
    } catch (e) {
        log("PASS: setInterval({ toString : function() { throw \"Exception\"; } }, 0) correctly threw an exception.");
        done(true);
    }
}


function done(didPass)
{
    if (didPass)
        log("PASS: All tests passed.");
    else
        log("FAIL: All tests did not pass.");

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

setTimeout1();

</script>
