<html>
<head>
<script>function foo() { };
</script>
<script>
function bar() { };
</script><script>function f1() { debugger; }</script>
<script>
function f2() { return f1(); }
</script>

<script>
function f3()
{
    return f2();
}
f3();
</script>

<script src="../../http/tests/inspector/inspector-test.js"></script>
<script src="../../http/tests/inspector/debugger-test.js"></script>

<script>

var test = function()
{
    var testName = WebInspector.inspectedPageURL;
    testName = testName.substring(testName.lastIndexOf('/') + 1);

    InspectorTest.startDebuggerTest(step1);

    function step1()
    {
        InspectorTest.addResult("Did load front-end");
        InspectorTest.addResult("Paused: " + !!WebInspector.debuggerModel.debuggerPausedDetails());
        InspectorTest.reloadPage(didReload.bind(this));
        WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerPaused, didPauseAfterReload, this); 
    }

    function didReload()
    {
        InspectorTest.addResult("didReload");
        InspectorTest.completeDebuggerTest();
    }

    function didPauseAfterReload(details)
    {
        InspectorTest.addResult("didPauseAfterReload");
        InspectorTest.addResult("Source strings corresponding to the call stack:");
        dumpNextCallFrame(didDump);
    }

    var callFrameIndex = 0;
    function dumpNextCallFrame(next)
    {
        var callFrames = WebInspector.debuggerModel.callFrames;
        if (callFrameIndex === callFrames.length) {
            next();
            return;
        }
        var frame = callFrames[callFrameIndex];
        var uiLocation = WebInspector.debuggerModel.rawLocationToUILocation(frame.location);
        InspectorTest.showUISourceCode(uiLocation.uiSourceCode, dumpCallFrameLine);

        function dumpCallFrameLine(sourceFrame)
        {
            var resourceText = sourceFrame._textEditor.text();
            var lines = resourceText.split("\n");
            var lineNumber = uiLocation.lineNumber;
            InspectorTest.addResult("Frame " + callFrameIndex + ") line " + lineNumber + ", content: " + lines[lineNumber] + " (must be part of function '" + frame.functionName + "')");
            callFrameIndex++
            dumpNextCallFrame(next);
        }
    }

    function uiSourceCodeAdded(uiSourceCode)
    {
        InspectorTest.addResult("uiSourceCodeAdded");
    }

    function didDump()
    {
        InspectorTest.resumeExecution(didResume);
    }

    function didResume()
    {
        InspectorTest.addResult("didResume");
    }
};
</script>

</head>

<body onload="runTest()">
<p>
Tests that main resource script text is correct when paused in inline script on reload.
<a href="https://bugs.webkit.org/show_bug.cgi?id=77548">Bug 77548.</a>
</p>

</body>
</html>
