<html>
<head>
<script src="../../http/tests/inspector/resources/protocol-test.js"></script>
<script src="resources/breakpoint.js"></script>

<script>
// Put this here instead of on <body onload> to prevent an extra Debugger.scriptParsed event.
window.onload = runTest;

function test()
{
    // This test setting 2 breakpoints in DFG compiled functions: one inlined,
    // and one not inlined.

    InspectorProtocol.sendCommand("Debugger.enable", {});
    InspectorProtocol.sendCommand("Debugger.setBreakpointsActive", {active: true});

    var breakpointId = null;
    var scriptId = 0;
    var startLine = 0;

    InspectorProtocol.eventHandler["Debugger.scriptParsed"] = function(messageObject)
    {
        if (/resources\/breakpoint\.js$/.test(messageObject.params.url)) {
            ProtocolTest.log("Found breakpoint.js");
            scriptId = messageObject.params.scriptId;
            startLine = messageObject.params.startLine;

            InspectorProtocol.sendCommand("Runtime.evaluate", {
                expression: "dfgWithoutInline2();"
            }, function(responseObject) {
                ProtocolTest.log("dfg function warmed up\n");

                var location1 = {scriptId: scriptId, lineNumber: 2, columnNumber: 0};

                InspectorProtocol.sendCommand("Debugger.setBreakpoint", {location: location1}, function(responseObject) {
                    InspectorProtocol.checkForError(responseObject);
                    ProtocolTest.log("Breakpoint set in breakpointBasic()");

                    breakpointId = responseObject.result.breakpointId;
                    InspectorProtocol.sendCommand("Runtime.evaluate", {
                        expression: "callNotInlineable2();"
                    }, function(responseObject) {
                        ProtocolTest.log("Test complete");
                        ProtocolTest.completeTest();
                    });
                });
            });
        }
    }

    InspectorProtocol.eventHandler["Debugger.paused"] = function(messageObject)
    {
        ProtocolTest.log("Hit Breakpoint!");
        var callFrames = messageObject.params.callFrames;
        if (callFrames.length < 3)
            ProtocolTest.log("FAIL: too few frames in stack trace");

        var callFrameId = callFrames[1].callFrameId;
        ProtocolTest.log("Evaluating in DFG frame at frame[1]: 'x = 20000;'");
        InspectorProtocol.sendCommand("Debugger.evaluateOnCallFrame", { callFrameId: callFrameId, expression: "x = 20000;" }, function(responseObject) {
            InspectorProtocol.sendCommand("Debugger.resume", {}, function(responseObject) {
                ProtocolTest.log("Resumed from breakpoint");
            });
        });
    }
}
</script>
</head>
<body>
<p>Debugger.evaluateOnCallFrame in a DFG compiled functions.</p>
</body>
</html>
