| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <script src="../../http/tests/inspector/resources/inspector-test.js"></script> | |
| <script src="./resources/exceptions.js"></script> | |
| <script> | |
| TestPage.allowUncaughtExceptions = true; | |
| TestPage.needToSanitizeUncaughtExceptionURLs = true; | |
| function test() | |
| { | |
| WI.debuggerManager.allExceptionsBreakpoint.disabled = false; | |
| let suite = InspectorTest.createAsyncSuite("CommandLineAPI.$exception"); | |
| function addNoExceptionTest(name) { | |
| suite.addTestCase({ | |
| name, description: "Without exceptions, $exception should be undefined", | |
| 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(); | |
| }); | |
| } | |
| }); | |
| } | |
| function addUncaughtExceptionTest(name, testFunction) { | |
| suite.addTestCase({ | |
| name, description: "Trigger an uncaught exception and check $exception.", | |
| test(resolve, reject) { | |
| InspectorTest.evaluateInPage(`setTimeout(${testFunction})`); | |
| WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => { | |
| WI.runtimeManager.evaluateInInspectedWindow("$exception", {objectGroup: "test", includeCommandLineAPI: true, doNotPauseOnExceptionsAndMuteConsole: true}, (result, wasThrown) => { | |
| InspectorTest.log("$exception => " + result.description); | |
| WI.debuggerManager.resume().then(resolve, reject); | |
| }); | |
| }); | |
| } | |
| }); | |
| } | |
| function addCaughtExceptionTest(name, expression) { | |
| suite.addTestCase({ | |
| name, description: "Trigger a caught exception and check $exception.", | |
| test(resolve, reject) { | |
| InspectorTest.evaluateInPage(expression); | |
| let didStep = false; | |
| let didEvaluate = false; | |
| let listener = WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.CallFramesDidChange, (event) => { | |
| if (!WI.debuggerManager.activeCallFrame) | |
| return; | |
| if (!didStep) { | |
| didStep = true; | |
| InspectorTest.pass("Paused, stepping out to catch block..."); | |
| WI.debuggerManager.stepOut(); | |
| return; | |
| } | |
| if (!didEvaluate) { | |
| didEvaluate = true; | |
| WI.runtimeManager.evaluateInInspectedWindow("$exception === e", {objectGroup: "test", includeCommandLineAPI: true, doNotPauseOnExceptionsAndMuteConsole: true}, (result, wasThrown) => { | |
| InspectorTest.expectThat(result.description === "true", "`$exception` should be equal to `e`."); | |
| }); | |
| WI.runtimeManager.evaluateInInspectedWindow("$exception", {objectGroup: "test", includeCommandLineAPI: true, doNotPauseOnExceptionsAndMuteConsole: true}, (result, wasThrown) => { | |
| InspectorTest.log("$exception => " + result.description); | |
| InspectorTest.singleFireEventListener("AfterTestFunction", resolve); | |
| WI.debuggerManager.resume().then(() => { | |
| WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.CallFramesDidChange, listener); | |
| }).catch(reject); | |
| }); | |
| return; | |
| } | |
| }); | |
| } | |
| }); | |
| } | |
| addNoExceptionTest("BeforeExceptions"); | |
| addUncaughtExceptionTest("UncaughtTypeException", "triggerUncaughtTypeException"); | |
| addUncaughtExceptionTest("UncaughtReferenceException", "triggerUncaughtReferenceException"); | |
| addUncaughtExceptionTest("UncaughtSyntaxException", "triggerUncaughtSyntaxException"); | |
| addUncaughtExceptionTest("UncaughtDOMException", "triggerUncaughtDOMException"); | |
| addUncaughtExceptionTest("UncaughtString", "throwString"); | |
| addUncaughtExceptionTest("UncaughtNumber", "throwNumber"); | |
| addUncaughtExceptionTest("UncaughtNull", "throwNull"); | |
| addUncaughtExceptionTest("UncaughtObject", "throwObject"); | |
| addUncaughtExceptionTest("UncaughtNode", "throwNode"); | |
| addCaughtExceptionTest("CatchTypeException", `setTimeout(function() { catcher(triggerUncaughtTypeException); TestPage.dispatchEventToFrontend("AfterTestFunction"); })`); | |
| addCaughtExceptionTest("CatchThrownString", `setTimeout(function() { catcher(throwString); TestPage.dispatchEventToFrontend("AfterTestFunction"); })`); | |
| addCaughtExceptionTest("CatchThrownObject", `setTimeout(function() { catcher(throwObject); TestPage.dispatchEventToFrontend("AfterTestFunction"); })`); | |
| addNoExceptionTest("AfterExceptions"); | |
| suite.runTestCasesAndFinish(); | |
| } | |
| </script> | |
| </head> | |
| <body onload="runTest()"> | |
| <p>Checks that <code>$exception</code> is available and accurate in evaluations when paused on an exception.</p> | |
| </body> | |
| </html> |