|
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;
|