109 lines
4.4 KiB
HTML
109 lines
4.4 KiB
HTML
<!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>
|