summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/src/actions/pause/commands.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/debugger/src/actions/pause/commands.js')
-rw-r--r--devtools/client/debugger/src/actions/pause/commands.js147
1 files changed, 147 insertions, 0 deletions
diff --git a/devtools/client/debugger/src/actions/pause/commands.js b/devtools/client/debugger/src/actions/pause/commands.js
new file mode 100644
index 0000000000..0bb371bf6e
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/commands.js
@@ -0,0 +1,147 @@
+/* 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 {
+ getSelectedFrame,
+ getCurrentThread,
+ getIsCurrentThreadPaused,
+ getIsPaused,
+} from "../../selectors/index";
+import { PROMISE } from "../utils/middleware/promise";
+import { evaluateExpressions } from "../expressions";
+import { selectLocation } from "../sources/index";
+import { fetchScopes } from "./fetchScopes";
+import { fetchFrames } from "./fetchFrames";
+import { recordEvent } from "../../utils/telemetry";
+import { validateFrame } from "../../utils/context";
+
+export function selectThread(thread) {
+ return async ({ dispatch, getState, client }) => {
+ if (getCurrentThread(getState()) === thread) {
+ return;
+ }
+ dispatch({ type: "SELECT_THREAD", thread });
+
+ const selectedFrame = getSelectedFrame(getState(), thread);
+
+ const serverRequests = [];
+ // Update the watched expressions as we may never have evaluated them against this thread
+ // Note that selectedFrame may be null if the thread isn't paused.
+ serverRequests.push(dispatch(evaluateExpressions(selectedFrame)));
+
+ // If we were paused on the newly selected thread, ensure:
+ // - select the source where we are paused,
+ // - fetching the paused stackframes,
+ // - fetching the paused scope, so that variable preview are working on the selected source.
+ // (frames and scopes is supposed to be fetched on pause,
+ // but if two threads pause concurrently, it might be cancelled)
+ if (selectedFrame) {
+ serverRequests.push(dispatch(selectLocation(selectedFrame.location)));
+ serverRequests.push(dispatch(fetchFrames(thread)));
+
+ serverRequests.push(dispatch(fetchScopes(selectedFrame)));
+ }
+
+ await Promise.all(serverRequests);
+ };
+}
+
+/**
+ * Debugger commands like stepOver, stepIn, stepOut, resume
+ *
+ * @param string type
+ */
+export function command(type) {
+ return async ({ dispatch, getState, client }) => {
+ if (!type) {
+ return null;
+ }
+ // For now, all commands are by default against the currently selected thread
+ const thread = getCurrentThread(getState());
+
+ const frame = getSelectedFrame(getState(), thread);
+
+ return dispatch({
+ type: "COMMAND",
+ command: type,
+ thread,
+ [PROMISE]: client[type](thread, frame?.id),
+ });
+ };
+}
+
+/**
+ * StepIn
+ *
+ * @returns {Function} {@link command}
+ */
+export function stepIn() {
+ return ({ dispatch, getState }) => {
+ if (!getIsCurrentThreadPaused(getState())) {
+ return null;
+ }
+ return dispatch(command("stepIn"));
+ };
+}
+
+/**
+ * stepOver
+ *
+ * @returns {Function} {@link command}
+ */
+export function stepOver() {
+ return ({ dispatch, getState }) => {
+ if (!getIsCurrentThreadPaused(getState())) {
+ return null;
+ }
+ return dispatch(command("stepOver"));
+ };
+}
+
+/**
+ * stepOut
+ *
+ * @returns {Function} {@link command}
+ */
+export function stepOut() {
+ return ({ dispatch, getState }) => {
+ if (!getIsCurrentThreadPaused(getState())) {
+ return null;
+ }
+ return dispatch(command("stepOut"));
+ };
+}
+
+/**
+ * resume
+ *
+ * @returns {Function} {@link command}
+ */
+export function resume() {
+ return ({ dispatch, getState }) => {
+ if (!getIsCurrentThreadPaused(getState())) {
+ return null;
+ }
+ recordEvent("continue");
+ return dispatch(command("resume"));
+ };
+}
+
+/**
+ * restart frame
+ */
+export function restart(frame) {
+ return async ({ dispatch, getState, client }) => {
+ if (!getIsPaused(getState(), frame.thread)) {
+ return null;
+ }
+ validateFrame(getState(), frame);
+ return dispatch({
+ type: "COMMAND",
+ command: "restart",
+ thread: frame.thread,
+ [PROMISE]: client.restart(frame.thread, frame.id),
+ });
+ };
+}