<!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, column, error)
{
    log("Main world window.onerror: " + msg + " at " + lastUrlComponent(url) + ":" + line + ":" + column + " " + error);
    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.colno + " " + e.error);
    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>
