Blame devtools/client/debugger/new/panel.js

Packit f0b94e
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit f0b94e
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit f0b94e
"use strict";
Packit f0b94e
Packit f0b94e
const { Task } = require("devtools/shared/task");
Packit f0b94e
const { LocalizationHelper } = require("devtools/shared/l10n");
Packit f0b94e
const { gDevTools } = require("devtools/client/framework/devtools");
Packit f0b94e
const { TargetFactory } = require("devtools/client/framework/target");
Packit f0b94e
const { Toolbox } = require("devtools/client/framework/toolbox");
Packit f0b94e
Packit f0b94e
const DBG_STRINGS_URI = "devtools/client/locales/debugger.properties";
Packit f0b94e
const L10N = new LocalizationHelper(DBG_STRINGS_URI);
Packit f0b94e
Packit f0b94e
function DebuggerPanel(iframeWindow, toolbox) {
Packit f0b94e
  this.panelWin = iframeWindow;
Packit f0b94e
  this.panelWin.L10N = L10N;
Packit f0b94e
  this.toolbox = toolbox;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
DebuggerPanel.prototype = {
Packit f0b94e
  open: async function() {
Packit f0b94e
    if (!this.toolbox.target.isRemote) {
Packit f0b94e
      await this.toolbox.target.makeRemote();
Packit f0b94e
    }
Packit f0b94e
Packit f0b94e
    const {
Packit f0b94e
      actions,
Packit f0b94e
      store,
Packit f0b94e
      selectors,
Packit f0b94e
      client
Packit f0b94e
    } = await this.panelWin.Debugger.bootstrap({
Packit f0b94e
      threadClient: this.toolbox.threadClient,
Packit f0b94e
      tabTarget: this.toolbox.target,
Packit f0b94e
      debuggerClient: this.toolbox.target.client,
Packit f0b94e
      sourceMaps: this.toolbox.sourceMapService,
Packit f0b94e
      toolboxActions: {
Packit f0b94e
        // Open a link in a new browser tab.
Packit f0b94e
        openLink: this.openLink.bind(this),
Packit f0b94e
        openWorkerToolbox: this.openWorkerToolbox.bind(this)
Packit f0b94e
      }
Packit f0b94e
    });
Packit f0b94e
Packit f0b94e
    this._actions = actions;
Packit f0b94e
    this._store = store;
Packit f0b94e
    this._selectors = selectors;
Packit f0b94e
    this._client = client;
Packit f0b94e
    this.isReady = true;
Packit f0b94e
    return this;
Packit f0b94e
  },
Packit f0b94e
Packit f0b94e
  getVarsForTests() {
Packit f0b94e
    return {
Packit f0b94e
      store: this._store,
Packit f0b94e
      selectors: this._selectors,
Packit f0b94e
      actions: this._actions,
Packit f0b94e
      client: this._client
Packit f0b94e
    };
Packit f0b94e
  },
Packit f0b94e
Packit f0b94e
  _getState: function() {
Packit f0b94e
    return this._store.getState();
Packit f0b94e
  },
Packit f0b94e
Packit f0b94e
  openLink: function(url) {
Packit f0b94e
    const parentDoc = this.toolbox.doc;
Packit f0b94e
    if (!parentDoc) {
Packit f0b94e
      return;
Packit f0b94e
    }
Packit f0b94e
Packit f0b94e
    const win = parentDoc.querySelector("window");
Packit f0b94e
    if (!win) {
Packit f0b94e
      return;
Packit f0b94e
    }
Packit f0b94e
Packit f0b94e
    const top = win.ownerDocument.defaultView.top;
Packit f0b94e
    if (!top || typeof top.openUILinkIn !== "function") {
Packit f0b94e
      return;
Packit f0b94e
    }
Packit f0b94e
Packit f0b94e
    top.openUILinkIn(url, "tab");
Packit f0b94e
  },
Packit f0b94e
Packit f0b94e
  openWorkerToolbox: function(worker) {
Packit f0b94e
    this.toolbox.target.client.attachWorker(
Packit f0b94e
      worker.actor,
Packit f0b94e
      (response, workerClient) => {
Packit f0b94e
        const workerTarget = TargetFactory.forWorker(workerClient);
Packit f0b94e
        gDevTools
Packit f0b94e
          .showToolbox(workerTarget, "jsdebugger", Toolbox.HostType.WINDOW)
Packit f0b94e
          .then(toolbox => {
Packit f0b94e
            toolbox.once("destroy", () => workerClient.detach());
Packit f0b94e
          });
Packit f0b94e
      }
Packit f0b94e
    );
Packit f0b94e
  },
Packit f0b94e
Packit f0b94e
  getFrames: function() {
Packit f0b94e
    let frames = this._selectors.getFrames(this._getState());
Packit f0b94e
Packit f0b94e
    // Frames is null when the debugger is not paused.
Packit f0b94e
    if (!frames) {
Packit f0b94e
      return {
Packit f0b94e
        frames: [],
Packit f0b94e
        selected: -1
Packit f0b94e
      };
Packit f0b94e
    }
Packit f0b94e
Packit f0b94e
    const selectedFrame = this._selectors.getSelectedFrame(this._getState());
Packit f0b94e
    const selected = frames.findIndex(frame => frame.id == selectedFrame.id);
Packit f0b94e
Packit f0b94e
    frames.forEach(frame => {
Packit f0b94e
      frame.actor = frame.id;
Packit f0b94e
    });
Packit f0b94e
Packit f0b94e
    return { frames, selected };
Packit f0b94e
  },
Packit f0b94e
Packit f0b94e
  isPaused() {
Packit f0b94e
    return this._selectors.isPaused(this._getState());
Packit f0b94e
  },
Packit f0b94e
Packit f0b94e
  selectSource(url, line) {
Packit f0b94e
    this._actions.selectSourceURL(url, { location: { line } });
Packit f0b94e
  },
Packit f0b94e
Packit f0b94e
  getSource(sourceURL) {
Packit f0b94e
    return this._selectors.getSourceByURL(this._getState(), sourceURL);
Packit f0b94e
  },
Packit f0b94e
Packit f0b94e
  destroy: function() {
Packit f0b94e
    this.panelWin.Debugger.destroy();
Packit f0b94e
    this.emit("destroyed");
Packit f0b94e
  }
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
exports.DebuggerPanel = DebuggerPanel;