summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/src/selectors/breakpoints.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/debugger/src/selectors/breakpoints.js')
-rw-r--r--devtools/client/debugger/src/selectors/breakpoints.js84
1 files changed, 84 insertions, 0 deletions
diff --git a/devtools/client/debugger/src/selectors/breakpoints.js b/devtools/client/debugger/src/selectors/breakpoints.js
new file mode 100644
index 0000000000..29b8fbdd42
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/breakpoints.js
@@ -0,0 +1,84 @@
+/* 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/>. */
+
+import { createSelector } from "devtools/client/shared/vendor/reselect";
+
+import { makeBreakpointId } from "../utils/breakpoint/index";
+
+// This method is only used from the main test helper
+export function getBreakpointsMap(state) {
+ return state.breakpoints.breakpoints;
+}
+
+export const getBreakpointsList = createSelector(
+ state => state.breakpoints.breakpoints,
+ breakpoints => Object.values(breakpoints)
+);
+
+export function getBreakpointCount(state) {
+ return getBreakpointsList(state).length;
+}
+
+export function getBreakpoint(state, location) {
+ if (!location) {
+ return undefined;
+ }
+
+ const breakpoints = getBreakpointsMap(state);
+ return breakpoints[makeBreakpointId(location)];
+}
+
+/**
+ * Gets the breakpoints on a line or within a range of lines
+ * @param {Object} state
+ * @param {Number} source
+ * @param {Number|Object} lines - line or an object with a start and end range of lines
+ * @returns {Array} breakpoints
+ */
+export function getBreakpointsForSource(state, source, lines) {
+ if (!source) {
+ return [];
+ }
+
+ const breakpoints = getBreakpointsList(state);
+ return breakpoints.filter(bp => {
+ const location = source.isOriginal ? bp.location : bp.generatedLocation;
+
+ if (lines) {
+ const isOnLineOrWithinRange =
+ typeof lines == "number"
+ ? location.line == lines
+ : location.line >= lines.start.line &&
+ location.line <= lines.end.line;
+ return location.source === source && isOnLineOrWithinRange;
+ }
+ return location.source === source;
+ });
+}
+
+export function getHiddenBreakpoint(state) {
+ const breakpoints = getBreakpointsList(state);
+ return breakpoints.find(bp => bp.options.hidden);
+}
+
+export function hasLogpoint(state, location) {
+ const breakpoint = getBreakpoint(state, location);
+ return breakpoint?.options.logValue;
+}
+
+export function getXHRBreakpoints(state) {
+ return state.breakpoints.xhrBreakpoints;
+}
+
+export const shouldPauseOnAnyXHR = createSelector(
+ getXHRBreakpoints,
+ xhrBreakpoints => {
+ const emptyBp = xhrBreakpoints.find(({ path }) => path.length === 0);
+ if (!emptyBp) {
+ return false;
+ }
+
+ return !emptyBp.disabled;
+ }
+);