<html>
<head>
<script src="../../http/tests/inspector/inspector-test.js"></script>
<script src="../../http/tests/inspector/elements-test.js"></script>
<script>
function documentClickHandler(event) { console.log("click - document - attribute"); }

function setupEventListeners()
{
    function f() {}
    var button = document.getElementById("node");
    function clickHandler(event) { console.log("click - button - bubbling (registered before attribute)"); }
    button.addEventListener("click", clickHandler, false);
    button.addEventListener("hover", function hoverHandler(event) { console.log("hover - button - bubbling"); }, false);
    button.addEventListener("click", function(event) { console.log("click - button - capturing"); }, true);
    button.onclick = function(event) { console.log("click - button - attribute"); }
    button.addEventListener("click", function(event) { console.log("click - button - bubbling (registered after attribute)"); }, false);
    document.onclick = documentClickHandler;
    document.addEventListener("click", function(event) { console.log("click - document - capturing"); }, true);
    document.addEventListener("mousedown", f, false);
    document.removeEventListener("mousedown", f, false);

    document.body.addEventListener("custom event", f, true);

    function ObjectHandler() { document.addEventListener("click", this, true); }
    ObjectHandler.prototype.toString = function() { return "ObjectHandler"; }
    new ObjectHandler();
}

function test()
{
    WebInspector.settings.eventListenersFilter.set("all");
    InspectorTest.selectNodeWithId("node", step1);

    function step1()
    {
        InspectorTest.expandAndDumpSelectedElementEventListeners(step2);
    }
    function step2()
    {
        InspectorTest.selectNodeWithId("node-without-listeners", step3);
    }
    function step3()
    {
        InspectorTest.expandAndDumpSelectedElementEventListeners(step4);
    }
    function step4()
    {
        var eventListenersPane = WebInspector.panels.elements.sidebarPanes.eventListeners;
        eventListenersPane.settingsSelectElement.selectedIndex = 1;
        eventListenersPane._changeSetting();
        InspectorTest.addResult("Listeners for selected node only(should be no listeners):");
        InspectorTest.expandAndDumpSelectedElementEventListeners(step5);
    }
    function step5()
    {
        InspectorTest.expandAndDumpSelectedElementEventListeners(InspectorTest.completeTest);
    }
}

function onloadHandler()
{
    setupEventListeners();
    runTest();
}
</script>
</head>

<body onload="onloadHandler()">
<p>
Tests event listeners output in the Elements sidebar panel.
</p>

<button id="node">Inspect Me</button>

<div id="node-without-listeners"></div>

</body>
</html>
