зеркало из https://github.com/mozilla/gecko-dev.git
Bug 785689 - Debugger breaking when it shouldn't. r=msucan,vporof
This commit is contained in:
Родитель
2f88458c33
Коммит
3b9100236a
|
@ -261,26 +261,26 @@ ThreadActor.prototype = {
|
|||
return undefined;
|
||||
}
|
||||
|
||||
switch (aRequest.resumeLimit.type) {
|
||||
case "step":
|
||||
this.dbg.onEnterFrame = onEnterFrame;
|
||||
// Fall through.
|
||||
case "next":
|
||||
let stepFrame = this._getNextStepFrame(startFrame);
|
||||
if (stepFrame) {
|
||||
let steppingType = aRequest.resumeLimit.type;
|
||||
if (["step", "next", "finish"].indexOf(steppingType) == -1) {
|
||||
return { error: "badParameterType",
|
||||
message: "Unknown resumeLimit type" };
|
||||
}
|
||||
// Make sure there is still a frame on the stack if we are to continue
|
||||
// stepping.
|
||||
let stepFrame = this._getNextStepFrame(startFrame);
|
||||
if (stepFrame) {
|
||||
switch (steppingType) {
|
||||
case "step":
|
||||
this.dbg.onEnterFrame = onEnterFrame;
|
||||
// Fall through.
|
||||
case "next":
|
||||
stepFrame.onStep = onStep;
|
||||
stepFrame.onPop = onPop;
|
||||
}
|
||||
break;
|
||||
case "finish":
|
||||
stepFrame = this._getNextStepFrame(startFrame);
|
||||
if (stepFrame) {
|
||||
break;
|
||||
case "finish":
|
||||
stepFrame.onPop = onPop;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return { error: "badParameterType",
|
||||
message: "Unknown resumeLimit type" };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,94 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
/**
|
||||
* Make sure that stepping in the last statement of the last frame doesn't
|
||||
* cause an unexpected pause, when another JS frame is pushed on the stack
|
||||
* (bug 785689).
|
||||
*/
|
||||
|
||||
var gDebuggee;
|
||||
var gClient;
|
||||
var gThreadClient;
|
||||
|
||||
function run_test()
|
||||
{
|
||||
initTestDebuggerServer();
|
||||
gDebuggee = addTestGlobal("test-stack");
|
||||
gClient = new DebuggerClient(DebuggerServer.connectPipe());
|
||||
gClient.connect(function () {
|
||||
attachTestGlobalClientAndResume(gClient,
|
||||
"test-stack",
|
||||
function (aResponse, aThreadClient) {
|
||||
gThreadClient = aThreadClient;
|
||||
test_stepping_last();
|
||||
});
|
||||
});
|
||||
do_test_pending();
|
||||
}
|
||||
|
||||
function test_stepping_last()
|
||||
{
|
||||
gThreadClient.addOneTimeListener("paused", function (aEvent, aPacket) {
|
||||
gThreadClient.addOneTimeListener("paused", function (aEvent, aPacket) {
|
||||
// Check the return value.
|
||||
do_check_eq(aPacket.type, "paused");
|
||||
do_check_eq(aPacket.frame.where.line, gDebuggee.line0 + 2);
|
||||
do_check_eq(aPacket.why.type, "resumeLimit");
|
||||
// Check that stepping worked.
|
||||
do_check_eq(gDebuggee.a, undefined);
|
||||
do_check_eq(gDebuggee.b, undefined);
|
||||
|
||||
gThreadClient.addOneTimeListener("paused", function (aEvent, aPacket) {
|
||||
// Check the return value.
|
||||
do_check_eq(aPacket.type, "paused");
|
||||
do_check_eq(aPacket.frame.where.line, gDebuggee.line0 + 3);
|
||||
do_check_eq(aPacket.why.type, "resumeLimit");
|
||||
// Check that stepping worked.
|
||||
do_check_eq(gDebuggee.a, 1);
|
||||
do_check_eq(gDebuggee.b, undefined);
|
||||
|
||||
gThreadClient.addOneTimeListener("paused", function (aEvent, aPacket) {
|
||||
// Check the return value.
|
||||
do_check_eq(aPacket.type, "paused");
|
||||
// When leaving a stack frame the line number doesn't change.
|
||||
do_check_eq(aPacket.frame.where.line, gDebuggee.line0 + 3);
|
||||
do_check_eq(aPacket.why.type, "resumeLimit");
|
||||
// Check that stepping worked.
|
||||
do_check_eq(gDebuggee.a, 1);
|
||||
do_check_eq(gDebuggee.b, 2);
|
||||
|
||||
gThreadClient.stepIn(function () {
|
||||
test_next_pause();
|
||||
});
|
||||
});
|
||||
gThreadClient.stepIn();
|
||||
});
|
||||
gThreadClient.stepIn();
|
||||
|
||||
});
|
||||
gThreadClient.stepIn();
|
||||
|
||||
});
|
||||
|
||||
gDebuggee.eval("var line0 = Error().lineNumber;\n" +
|
||||
"debugger;\n" + // line0 + 1
|
||||
"var a = 1;\n" + // line0 + 2
|
||||
"var b = 2;\n"); // line0 + 3
|
||||
}
|
||||
|
||||
function test_next_pause()
|
||||
{
|
||||
gThreadClient.addOneTimeListener("paused", function (aEvent, aPacket) {
|
||||
// Check the return value.
|
||||
do_check_eq(aPacket.type, "paused");
|
||||
// Before fixing bug 785689, the type was resumeLimit.
|
||||
do_check_eq(aPacket.why.type, "debuggerStatement");
|
||||
|
||||
gThreadClient.resume(function () {
|
||||
finishClient(gClient);
|
||||
});
|
||||
});
|
||||
|
||||
gDebuggee.eval("debugger;");
|
||||
}
|
|
@ -53,6 +53,7 @@ tail =
|
|||
[test_stepping-02.js]
|
||||
[test_stepping-03.js]
|
||||
[test_stepping-04.js]
|
||||
[test_stepping-05.js]
|
||||
[test_framebindings-01.js]
|
||||
[test_framebindings-02.js]
|
||||
[test_framebindings-03.js]
|
||||
|
|
Загрузка…
Ссылка в новой задаче