<html>
<head>
<script src="../../http/tests/inspector/resources/protocol-test.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 a breakpoint on line:column in the <script> below.
    // We set a breakpoint before evaluating `var b = ...`, and verify that
    // by running some expressions at that call frame.

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

    InspectorProtocol.eventHandler["Debugger.scriptParsed"] = function(messageObject)
    {
        if (/setBreakpoint-column\.html$/.test(messageObject.params.url) && messageObject.params.startLine > 10) {
            ProtocolTest.log("Found <script>");
            var scriptIdentifier = messageObject.params.scriptId;
            var lineNumber = messageObject.params.startLine + 2;
            var columnNumber = 10;
            var location = {scriptId: scriptIdentifier, lineNumber: lineNumber, columnNumber: columnNumber};
            InspectorProtocol.sendCommand("Debugger.setBreakpoint", {location: location}, function() {
                ProtocolTest.log("Running testFunction");
                InspectorProtocol.sendCommand("Runtime.evaluate", {expression: "testFunction()"});
            });
        }
    }

    InspectorProtocol.eventHandler["Debugger.paused"] = function(messageObject)
    {
        ProtocolTest.log("Hit Breakpoint!");
        var callFrameIdentifier = messageObject.params.callFrames[0].callFrameId;
        InspectorProtocol.sendCommand("Debugger.evaluateOnCallFrame", {callFrameId: callFrameIdentifier, expression: "a"}, function(messageObject) {
            ProtocolTest.log("Evaluted value of `a` (expecting number 1) was: " + JSON.stringify(messageObject.result.result));
            InspectorProtocol.sendCommand("Debugger.evaluateOnCallFrame", {callFrameId: callFrameIdentifier, expression: "b"}, function(messageObject) {
                ProtocolTest.log("Evaluted value of `b` (expecting undefined) was: " + JSON.stringify(messageObject.result.result));
                ProtocolTest.completeTest();
            });
        });
    }
}
</script>
</head>
<body>
<p>Debugger.setBreakpoint on line:column in &lt;script&gt;</p>
<script>// Line 0
function testFunction() {// Line 1
var a = 1;var b = a + 1;// Line 2
}// Line 3
</script>
</body>
</html>
