<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script src="resources/exceptions.js"></script>
<script>
window.onerror = function(){};

function test()
{
    WI.debuggerManager.allExceptionsBreakpoint.disabled = false;

    function dumpCommandLineAPIValue(prefix) {
        WI.runtimeManager.evaluateInInspectedWindow("$exception", {objectGroup: "test", includeCommandLineAPI: true, doNotPauseOnExceptionsAndMuteConsole: true}, function(result, wasThrown) {
            InspectorTest.log(prefix + ": $exception => " + result.description);
        });
    }

    function checkIfExceptionValueMatchesVariable(varName) {
        WI.runtimeManager.evaluateInInspectedWindow("$exception === " + varName, {objectGroup: "test", includeCommandLineAPI: true, doNotPauseOnExceptionsAndMuteConsole: true}, function(result, wasThrown) {
            InspectorTest.log("  CATCH: $exception === " + varName + " ? " + result.description);
        });
    }


    let suite = InspectorTest.createAsyncSuite("CommandLineAPI.$exception");

    suite.addTestCase({
        name: "EmptyBefore",
        description: "Without exceptions, $exception should not be defined",
        test(resolve, reject) {
            WI.runtimeManager.evaluateInInspectedWindow("$exception", {objectGroup: "test", includeCommandLineAPI: true, doNotPauseOnExceptionsAndMuteConsole: true}, (result, wasThrown) => {
                InspectorTest.expectThat(wasThrown, "$exception should throw an error if there is no exception.");
                InspectorTest.log(result.description);
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "CheckExceptionInsideNestedCatchBlocks",
        description: "Check $exception is always the current exception object when stepping through catch blocks.",
        test(resolve, reject) {
            InspectorTest.evaluateInPage("setTimeout(nestedCatchBlocks, 0)");

            let phase = 0;
            let listener = WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.CallFramesDidChange, (event) => {
                if (!WI.debuggerManager.activeCallFrame)
                    return;

                phase++;

                // Skip past the first pause to the second pause.
                if (phase === 1) {
                    dumpCommandLineAPIValue("OUTER 1");
                    WI.debuggerManager.resume();
                    return;
                }

                // Paused on the exception in the inner try, step over to get into the inner catch.
                if (phase === 2) {
                    dumpCommandLineAPIValue("INNER 1");
                    WI.debuggerManager.stepOver();
                    return;
                }

                // Paused in the inner catch, verify $exception is "inner exception".
                if (phase === 3) {
                    dumpCommandLineAPIValue("INNER 2");
                    checkIfExceptionValueMatchesVariable("e2");
                    WI.debuggerManager.stepOver();
                    return;
                }
        
                // Stepped into the outer catch, verify $exception is "outer exception".
                if (phase === 4) {
                    dumpCommandLineAPIValue("OUTER 2");
                    checkIfExceptionValueMatchesVariable("e1");
                    InspectorTest.singleFireEventListener("AfterTestFunction", resolve);
                    WI.debuggerManager.resume().then(() => {
                        WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.CallFramesDidChange, listener);
                    }, reject);
                    return;
                }
            });
        }
    });

    suite.addTestCase({
        name: "EmptyAfter",
        description: "Without exceptions, $exception should not be defined",
        test(resolve, reject) {
            WI.runtimeManager.evaluateInInspectedWindow("$exception", {objectGroup: "test", includeCommandLineAPI: true, doNotPauseOnExceptionsAndMuteConsole: true}, (result, wasThrown) => {
                InspectorTest.expectThat(wasThrown, "$exception should throw an error if there is no exception.");
                InspectorTest.log(result.description);
                resolve();
            });
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Checks that <code>$exception</code> is the value of the current exception, even in nested catch blocks.</p>
</body>
</html>
