Bug 1608177 - Setting logpoints does not clean up breakpoint state properly, r=jlast.

Differential Revision: https://phabricator.services.mozilla.com/D59372

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Brian Hackett 2020-01-09 18:06:25 +00:00
parent 343072c5ec
commit 23013977bd
4 changed files with 17 additions and 10 deletions

View File

@ -12,7 +12,8 @@ add_task(async function() {
}); });
await selectSource(dbg, "doc_rr_basic.html"); await selectSource(dbg, "doc_rr_basic.html");
await addBreakpoint(dbg, "doc_rr_basic.html", 21, undefined, { await addBreakpoint(dbg, "doc_rr_basic.html", 21);
await setBreakpointOptions(dbg, "doc_rr_basic.html", 21, undefined, {
logValue: `"Logpoint Number " + number`, logValue: `"Logpoint Number " + number`,
}); });
await addBreakpoint(dbg, "doc_rr_basic.html", 6, undefined, { await addBreakpoint(dbg, "doc_rr_basic.html", 6, undefined, {
@ -43,5 +44,8 @@ add_task(async function() {
await checkEvaluateInTopFrame(dbg, "number", 5); await checkEvaluateInTopFrame(dbg, "number", 5);
await reverseStepOverToLine(dbg, 20); await reverseStepOverToLine(dbg, 20);
await addBreakpoint(dbg, "doc_rr_basic.html", 22);
await resumeToLine(dbg, 22);
await shutdownDebugger(dbg); await shutdownDebugger(dbg);
}); });

View File

@ -91,6 +91,12 @@ BreakpointActor.prototype = {
* Called on changes to this breakpoint's script offsets or options. * Called on changes to this breakpoint's script offsets or options.
*/ */
_newOffsetsOrOptions(script, offsets, oldOptions) { _newOffsetsOrOptions(script, offsets, oldOptions) {
// Clear any existing handler first in case this is called multiple times
// after options change.
for (const offset of offsets) {
script.clearBreakpoint(this, offset);
}
// When replaying, logging breakpoints are handled using an API to get logged // When replaying, logging breakpoints are handled using an API to get logged
// messages from throughout the recording. // messages from throughout the recording.
if (this.threadActor.dbg.replaying && this.options.logGroupId) { if (this.threadActor.dbg.replaying && this.options.logGroupId) {
@ -125,10 +131,7 @@ BreakpointActor.prototype = {
} }
// In all other cases, this is used as a script breakpoint handler. // In all other cases, this is used as a script breakpoint handler.
// Clear any existing handler first in case this is called multiple times
// after options change.
for (const offset of offsets) { for (const offset of offsets) {
script.clearBreakpoint(this, offset);
script.setBreakpoint(offset, this); script.setBreakpoint(offset, this);
} }
}, },

View File

@ -2037,16 +2037,14 @@ const gControl = {
RecordReplayControl.clearGraphics(); RecordReplayControl.clearGraphics();
} else { } else {
addPauseData(gPausePoint, data, /* trackCached */ true); addPauseData(gPausePoint, data, /* trackCached */ true);
if (data.paintData) {
RecordReplayControl.hadRepaint(data.paintData); RecordReplayControl.hadRepaint(data.paintData);
} }
}
return data; return data;
}, },
paint(point) { paint(point) {
const data = maybeGetPauseData(point); const data = maybeGetPauseData(point);
if (data && data.paintData) { if (data) {
RecordReplayControl.hadRepaint(data.paintData); RecordReplayControl.hadRepaint(data.paintData);
} }
}, },

View File

@ -305,8 +305,10 @@ static bool Middleman_HadRepaint(JSContext* aCx, unsigned aArgc, Value* aVp) {
CallArgs args = CallArgsFromVp(aArgc, aVp); CallArgs args = CallArgsFromVp(aArgc, aVp);
if (!args.get(0).isString()) { if (!args.get(0).isString()) {
JS_ReportErrorASCII(aCx, "Bad arguments"); parent::ClearGraphics();
return false;
args.rval().setUndefined();
return true;
} }
RootedString data(aCx, args.get(0).toString()); RootedString data(aCx, args.get(0).toString());