Files
tubestation/devtools/client/shared/thread-utils.js
Alexandre Poirot 564a6404bd Bug 1578220 - [devtools] Allow disabling debugger statement by a toggle in the breakpoints panel. r=devtools-reviewers,nchevobbe
This toggle is checked by default so that debugger statements are still enabled by default.
As for other settings, this is preserved on restart so that it is handy for users willing to
always keep them disabled. But it may be an annoyance for others forgetting that they once disabled them.

Differential Revision: https://phabricator.services.mozilla.com/D193431
2023-11-17 16:05:04 +00:00

90 lines
3.2 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const asyncStoreHelper = require("resource://devtools/client/shared/async-store-helper.js");
const { validateBreakpointLocation } = ChromeUtils.import(
"resource://devtools/shared/validate-breakpoint.jsm"
);
const asyncStore = asyncStoreHelper("debugger", {
pendingBreakpoints: ["pending-breakpoints", {}],
tabs: ["tabs", []],
xhrBreakpoints: ["xhr-breakpoints", []],
eventListenerBreakpoints: ["event-listener-breakpoints", undefined],
blackboxedRanges: ["blackboxedRanges", {}],
});
exports.asyncStore = asyncStore;
exports.getThreadOptions = async function () {
return {
shouldPauseOnDebuggerStatement: Services.prefs.getBoolPref(
"devtools.debugger.pause-on-debugger-statement"
),
pauseOnExceptions: Services.prefs.getBoolPref(
"devtools.debugger.pause-on-exceptions"
),
ignoreCaughtExceptions: Services.prefs.getBoolPref(
"devtools.debugger.ignore-caught-exceptions"
),
shouldIncludeSavedFrames: Services.prefs.getBoolPref(
"devtools.debugger.features.async-captured-stacks"
),
shouldIncludeAsyncLiveFrames: Services.prefs.getBoolPref(
"devtools.debugger.features.async-live-stacks"
),
skipBreakpoints: Services.prefs.getBoolPref(
"devtools.debugger.skip-pausing"
),
logEventBreakpoints: Services.prefs.getBoolPref(
"devtools.debugger.log-event-breakpoints"
),
// This option is always true. See Bug 1654590 for removal.
observeAsmJS: true,
breakpoints: sanitizeBreakpoints(await asyncStore.pendingBreakpoints),
// XXX: `event-listener-breakpoints` is a copy of the event-listeners state
// of the debugger panel. The `active` property is therefore linked to
// the `active` property of the state.
// See devtools/client/debugger/src/reducers/event-listeners.js
eventBreakpoints:
((await asyncStore.eventListenerBreakpoints) || {}).active || [],
};
};
/**
* Bug 1720512 - We used to store invalid breakpoints, leading to blank debugger.
* Filter out only the one that look invalid.
*/
function sanitizeBreakpoints(breakpoints) {
if (typeof breakpoints != "object") {
return {};
}
// We are not doing any assertion against keys,
// as it looks like we are never using them anywhere in frontend, nor backend.
const validBreakpoints = {};
for (const key in breakpoints) {
const bp = breakpoints[key];
try {
if (!bp) {
throw new Error("Undefined breakpoint");
}
// Debugger's main.js's `syncBreakpoints` will only use generatedLocation
// when restoring breakpoints.
validateBreakpointLocation(bp.generatedLocation);
// But Toolbox will still pass location to thread actor's reconfigure
// for target that don't support watcher+BreakpointListActor
validateBreakpointLocation(bp.location);
validBreakpoints[key] = bp;
} catch (e) {
console.error(
"Ignore invalid breakpoint from debugger store",
bp,
e.message
);
}
}
return validBreakpoints;
}
exports.sanitizeBreakpoints = sanitizeBreakpoints;