summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/src/main.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/debugger/src/main.js')
-rw-r--r--devtools/client/debugger/src/main.js149
1 files changed, 149 insertions, 0 deletions
diff --git a/devtools/client/debugger/src/main.js b/devtools/client/debugger/src/main.js
new file mode 100644
index 0000000000..83a6c1e6fc
--- /dev/null
+++ b/devtools/client/debugger/src/main.js
@@ -0,0 +1,149 @@
+/* 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 * as firefox from "./client/firefox";
+
+import { asyncStore, verifyPrefSchema, prefs } from "./utils/prefs";
+import { setupHelper } from "./utils/dbg";
+import { setToolboxTelemetry } from "./utils/telemetry";
+
+import {
+ bootstrapApp,
+ bootstrapStore,
+ bootstrapWorkers,
+ unmountRoot,
+ teardownWorkers,
+} from "./utils/bootstrap";
+
+import { initialBreakpointsState } from "./reducers/breakpoints";
+import { initialSourcesState } from "./reducers/sources";
+import { initialUIState } from "./reducers/ui";
+import { initialSourceBlackBoxState } from "./reducers/source-blackbox";
+
+const {
+ sanitizeBreakpoints,
+} = require("resource://devtools/client/shared/thread-utils.js");
+
+async function syncBreakpoints() {
+ const breakpoints = await asyncStore.pendingBreakpoints;
+ const breakpointValues = Object.values(sanitizeBreakpoints(breakpoints));
+ return Promise.all(
+ breakpointValues.map(({ disabled, options, generatedLocation }) => {
+ if (disabled) {
+ return Promise.resolve();
+ }
+ // Set the breakpoint on the server using the generated location as generated
+ // sources are known on server, not original sources.
+ return firefox.clientCommands.setBreakpoint(generatedLocation, options);
+ })
+ );
+}
+
+async function syncXHRBreakpoints() {
+ const breakpoints = await asyncStore.xhrBreakpoints;
+ return Promise.all(
+ breakpoints.map(({ path, method, disabled }) => {
+ if (!disabled) {
+ firefox.clientCommands.setXHRBreakpoint(path, method);
+ }
+ })
+ );
+}
+
+function setPauseOnDebuggerStatement() {
+ const { pauseOnDebuggerStatement } = prefs;
+ return firefox.clientCommands.pauseOnDebuggerStatement(
+ pauseOnDebuggerStatement
+ );
+}
+
+function setPauseOnExceptions() {
+ const { pauseOnExceptions, pauseOnCaughtException } = prefs;
+ return firefox.clientCommands.pauseOnExceptions(
+ pauseOnExceptions,
+ pauseOnCaughtException
+ );
+}
+
+async function loadInitialState(commands, toolbox) {
+ const pendingBreakpoints = sanitizeBreakpoints(
+ await asyncStore.pendingBreakpoints
+ );
+ const tabs = { tabs: await asyncStore.tabs };
+ const xhrBreakpoints = await asyncStore.xhrBreakpoints;
+ const blackboxedRanges = await asyncStore.blackboxedRanges;
+ const eventListenerBreakpoints = await asyncStore.eventListenerBreakpoints;
+ const breakpoints = initialBreakpointsState(xhrBreakpoints);
+ const sourceBlackBox = initialSourceBlackBoxState({ blackboxedRanges });
+ const sources = initialSourcesState();
+ const ui = initialUIState();
+
+ return {
+ pendingBreakpoints,
+ tabs,
+ breakpoints,
+ eventListenerBreakpoints,
+ sources,
+ sourceBlackBox,
+ ui,
+ };
+}
+
+export async function bootstrap({
+ commands,
+ fluentBundles,
+ resourceCommand,
+ workers: panelWorkers,
+ panel,
+}) {
+ verifyPrefSchema();
+
+ // Set telemetry at the very beginning as some actions fired from this function might
+ // record events.
+ setToolboxTelemetry(panel.toolbox.telemetry);
+
+ const initialState = await loadInitialState(commands, panel.toolbox);
+ const workers = bootstrapWorkers(panelWorkers);
+
+ const { store, actions, selectors } = bootstrapStore(
+ firefox.clientCommands,
+ workers,
+ panel,
+ initialState
+ );
+
+ const connected = firefox.onConnect(
+ commands,
+ resourceCommand,
+ actions,
+ store
+ );
+
+ await syncBreakpoints();
+ await syncXHRBreakpoints();
+ await setPauseOnDebuggerStatement();
+ await setPauseOnExceptions();
+
+ setupHelper({
+ store,
+ actions,
+ selectors,
+ workers,
+ targetCommand: commands.targetCommand,
+ client: firefox.clientCommands,
+ });
+
+ bootstrapApp(store, panel.getToolboxStore(), {
+ fluentBundles,
+ toolboxDoc: panel.panelWin.parent.document,
+ });
+ await connected;
+ return { store, actions, selectors, client: firefox.clientCommands };
+}
+
+export async function destroy() {
+ firefox.onDisconnect();
+ unmountRoot();
+ teardownWorkers();
+}