<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 sets a breakpoint on line:column in the <script> below.
    // We set a breakpoint before evaluating 'sum += ...', and verify that
    // call frame functionNames are what we expect.

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

    InspectorProtocol.eventHandler["Debugger.scriptParsed"] = function(messageObject)
    {
        if (/call-frame-function-name\.html$/.test(messageObject.params.url) && messageObject.params.startLine > 10) {
            ProtocolTest.log("Found <script>");
            var scriptIdentifier = messageObject.params.scriptId;
            var lineNumber = messageObject.params.startLine + 6;
            var columnNumber = 12;
            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!");
        InspectorProtocol.sendCommand("Debugger.disable");

        var functionNames = [ ];
        var i;
        for (i = 0; i < 3; i++)
            functionNames[i] = messageObject.params.callFrames[i].functionName;
        
        function assertFunctionName(index, actual, expected) {
            if (actual == expected)
                ProtocolTest.log('PASS: frame[' + index + '] "' + actual + '"');
            else
                ProtocolTest.log('FAIL: frame[' + index + '] expect "' + expected + '", actual "' + actual + '"');
        }

        // frame 0 should be the anonymous inner function.
        assertFunctionName(0, functionNames[0], "");

        // frame 1 should be "forEach" (an internal/host function).
        assertFunctionName(1, functionNames[1], "forEach");

        // frame 2 should be "testFunction".
        assertFunctionName(2, functionNames[2], "testFunction");

        ProtocolTest.completeTest();
    }
}
</script>
</head>
<body>
<p>Debugger.setBreakpoint on line:column in &lt;script&gt;</p>
<script>// Line 0
function testFunction() { // Line 1
    try { // Line 2
        var array = [2, 5, 7]; // Line 3
        var sum = 0; // Line 4
        array.forEach(function(value) { // Line 5
            sum += array[value]; // Line 6
        });
    } catch (e) {
        console.log("Exception: " + e);
    }
}
</script>
</body>
</html>
