<html>
<head>
<script src="../../http/tests/inspector/inspector-test.js"></script>
<script src="../../http/tests/inspector/debugger-test.js"></script>
<script>
function testFunction()
{
    debugger;
}

var test = function()
{
    InspectorTest.setQuiet(true);
    InspectorTest.runDebuggerTestSuite([
        function testRevealAndHighlightExecutionLine(next)
        {
            var executionLineSet = false;
            var executionLineRevealed = false;
            InspectorTest.addSniffer(WebInspector.SourceFrame.prototype, "revealLine", didRevealLine);
            InspectorTest.addSniffer(WebInspector.JavaScriptSourceFrame.prototype, "setExecutionLine", didSetExecutionLine);
            InspectorTest.runTestFunctionAndWaitUntilPaused(didPaused);

            function didPaused(callFrames)
            {
            }

            function didSetExecutionLine(line)
            {
                if (executionLineSet)
                    return;
                executionLineSet = true;
                maybeNext();
            }

            function didRevealLine(line)
            {
                if (executionLineRevealed)
                    return;
                if (this.isShowing()) {
                    executionLineRevealed = true;
                    maybeNext();
                }
            }

            function maybeNext()
            {
                if (executionLineRevealed && executionLineSet) {
                    InspectorTest.addResult("Execution line revealed and highlighted.");
                    InspectorTest.resumeExecution(next);
                }
            }
        }
    ]);
}
</script>
</head>
<body onload="runTest()">
<p>Tests that execution line is revealed and highlighted when debugger is paused.</p>
<a href="https://bugs.webkit.org/show_bug.cgi?id=80306">Bug 80306</a>
</body>
</html>
