<!DOCTYPE html>
<html>
<title>Test how event handlers work with isolated Worlds</title>
<script>

// This test is meaningless without testRunner.
if (window.testRunner && window.eventSender) {

    testRunner.dumpAsText();
    testRunner.waitUntilDone();

    window.textAttributeEventsCount = 0;
    window.xhrEventsCount = 0;
    window.functionAttributeEventsCount = 0;
    window.addEventListener("message", function(message)
    {
        testRunner.notifyDone();
    }, false);

    window.textAttributeEventsCallback = function()
    {
        if (textAttributeEventsCount++)
            document.getElementById("log").innerHTML += "PASS";
    }

    function newTest(title)
    {
        document.getElementById("log").innerHTML += "<br>" + title + ": ";
    }

    function textAttributeEventListener()
    {
        window.textAttributeEventsCallback = function()
        {
            if (window.alreadyFailed)
                return;
             document.getElementById("log").innerHTML += "FAIL";
             window.alreadyFailed = true;
        }

        var test = document.getElementById("test");
        test.innerHTML = "<button id='button1' onclick='textAttributeEventsCallback()'></button>";
        document.getElementById("button1").click();
    }

    function functionAttributeEventListener()
    {
        var test = document.getElementById("test");
        var button = test.appendChild(document.createElement("button"));
        window.functionAttributeEventsCount = 0;
        button.onclick = function()
        {
            if (window.functionAttributeEventsCount++)
                document.getElementById("log").innerHTML += "PASS";
        }
        button.style.cssText = "width: 30px;height:30px";
        button.click();
    }

    function xhrEventListener()
    {
        window.xhrWorld = 1;
        var done;
        var xhr = new XMLHttpRequest();
        xhr.open("GET", "anyfile", true);
        xhr.onreadystatechange = function() {
            if (done)
                return;
            done = true;
            document.getElementById("log").innerHTML += window.xhrWorld  ? "PASS" : "FAIL";
            window.postMessage("done", "*");
        };
        xhr.send(null);
    }

    function runTestInWorld(worldId, funcName)
    {
        testRunner.evaluateScriptInIsolatedWorld(worldId, String(eval(funcName)) + "\n" + funcName + "();");
    }

    function runTest() 
    {
        newTest("Text attribute event listeners should always fire in main world");
        runTestInWorld(1, "textAttributeEventListener");
        var button1 = document.getElementById("button1");
        button1.click();
        button1.parentElement.removeChild(button1);
        
        newTest("Function attribute event listeners should fire in the world where they were created");
        runTestInWorld(1, "functionAttributeEventListener");
        var testDiv = document.getElementById("test");
        // Land somewhere on the button.
        eventSender.mouseMoveTo(testDiv.offsetLeft + 5, testDiv.offsetTop + 5);
        eventSender.mouseDown();
        eventSender.mouseUp();

        newTest("XHR attribute event listeners should fire in the world where they were created");
        runTestInWorld(1, "xhrEventListener");
    }
}
</script>
<body onload="runTest()">
    <div id="test"></div>
    <div id="log"></div>
</body>
</html>
