| <!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> |