<html>
<head>
<script src="../../http/tests/inspector/resources/protocol-test.js"></script>
<script src="resources/exception.js"></script>
<script>
function test()
{
    function testFunction() {
        // This function runs in the second inspector window. We can use this one to debug the first inspector.

        InspectorProtocol.sendCommand("Debugger.enable", {});
        InspectorProtocol.sendCommand("Debugger.setBreakpointsActive", {active: true});
        InspectorProtocol.sendCommand("Debugger.setPauseOnExceptions", {state: "all"}, function(responseObject) {
            InspectorProtocol.checkForError(responseObject);
            ProtocolTest.log("Debugger.setPauseOnExceptions - all");

            // Trigger an exception in the main inspector.
            InspectorProtocol.sendCommand("Runtime.evaluate", {expression: "setTimeout(function() { throw new Error('PASS: Expected exception') }, 0);"});
        });

        InspectorProtocol.eventHandler["Debugger.paused"] = function(messageObject)
        {
            ProtocolTest.log("PASS: Paused!");
            InspectorProtocol.sendCommand("Debugger.resume", {});
        }

        InspectorProtocol.eventHandler["Debugger.resumed"] = function(messageObject)
        {
            ProtocolTest.log("PASS: Resumed!");

            // Revert Debugger.setPauseOnExceptions as it can have an impact on the following tests.
            InspectorProtocol.sendCommand("Debugger.setPauseOnExceptions", {state: "none"}, function(responseObject) {
                ProtocolTest.completeTest();
            });
        }
    };

    window.log = ProtocolTest.log.bind(InspectorProtocol);
    window.closeTest = function()
    {
        window.internals.closeDummyInspectorFrontend();
        ProtocolTest.completeTest();
    }

    var secondInspectorFrontend = window.internals.openDummyInspectorFrontend("InspectorProtocolStub.html");
    secondInspectorFrontend.addEventListener("load", function(event) {
        secondInspectorFrontend.postMessage("(" + testFunction.toString() +")();", "*");
    });
}
</script>
</head>
<body onload="runTest()">
<p>Checking that the inspector code can be debugged using a second inspector window.</p>
</body>
</html>
