blob: 7e9166dbdcdd9fc2c4b80f8e068b1c145749f2bf [file] [log] [blame]
<!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>