<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<p>Test that window.onerror and "error" event listeners from main world are
invoked for uncaught exceptions in user scripts running in isolate worlds as
well as for exceptions in the main world.<a href="https://bugs.webkit.org/show_bug.cgi?id=8519">Bug 8519.</a>
</p>
<div id="console"></div>
<script>

var expectedRecordCount = 12;
var recordCount = 0;
document.getElementById("console").addEventListener("DOMNodeInserted", function(e) {
    recordCount++;
    if (recordCount === expectedRecordCount && window.testRunner)
        testRunner.notifyDone();
}, false);

function log(msg) {
    var record = document.createElement("div");
    record.innerHTML = msg;
    document.getElementById("console").appendChild(record);
}

function lastUrlComponent(url) {
    return url ? url.match( /[^\/]+\/?$/ )[0] : url;
}

window.onerror = function(msg, url, line)
{
    log("Main world window.onerror: " + msg + " at " + lastUrlComponent(url) + ":" + line);
    return true;
}

window.addEventListener("error", function(e)
{
    var url = lastUrlComponent(e.filename);
    log("Main world error event listener: " + e.message + " at " + url + ":" + e.lineno);
    e.preventDefault();
}, false);

var exceptions = function(isolatedWorld)
{
    window.addEventListener("load", function(e) {
        // Do the following call from load listener to make sure error in the setTimeout callback always happens after the error in this listener.
        setTimeout(function() {
            throw new Error("Error in " + isolatedWorld + " setTimeout callback.");
        }, 0);
        throw new Error("Error in " + isolatedWorld + " load handler.");
    }, false);


    throw new Error("Error in "+ isolatedWorld + " inline script.");
}

if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
    testRunner.addUserScript("(" + exceptions + ")('user script')", false, true);
}

exceptions("main world");

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