Files
basilisk55/devtools/client/webconsole/new-console-output/utils/context-menu.js
T

144 lines
4.7 KiB
JavaScript

/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* 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/. */
"use strict";
const Services = require("Services");
const {gDevTools} = require("devtools/client/framework/devtools");
const Menu = require("devtools/client/framework/menu");
const MenuItem = require("devtools/client/framework/menu-item");
const { MESSAGE_SOURCE } = require("devtools/client/webconsole/new-console-output/constants");
const {openVariablesView} = require("devtools/client/webconsole/new-console-output/utils/variables-view");
const clipboardHelper = require("devtools/shared/platform/clipboard");
const { l10n } = require("devtools/client/webconsole/new-console-output/utils/messages");
/**
* Create a Menu instance for the webconsole.
*
* @param {Object} jsterm
* The JSTerm instance used by the webconsole.
* @param {Element} parentNode
* The container of the new console frontend output wrapper.
* @param {Object} options
* - {String} actor (optional) actor id to use for context menu actions
* - {String} clipboardText (optional) text to "Copy" if no selection is available
* - {Object} message (optional) message object containing metadata such as:
* - {String} source
* - {String} request
*/
function createContextMenu(jsterm, parentNode, { actor, clipboardText, message }) {
let win = parentNode.ownerDocument.defaultView;
let selection = win.getSelection();
let { source, request } = message || {};
let menu = new Menu({
id: "webconsole-menu"
});
// Copy URL for a network request.
menu.append(new MenuItem({
id: "console-menu-copy-url",
label: l10n.getStr("webconsole.menu.copyURL.label"),
accesskey: l10n.getStr("webconsole.menu.copyURL.accesskey"),
visible: source === MESSAGE_SOURCE.NETWORK,
click: () => {
if (!request) {
return;
}
clipboardHelper.copyString(request.url);
},
}));
// Open URL in a new tab for a network request.
menu.append(new MenuItem({
id: "console-menu-open-url",
label: l10n.getStr("webconsole.menu.openURL.label"),
accesskey: l10n.getStr("webconsole.menu.openURL.accesskey"),
visible: source === MESSAGE_SOURCE.NETWORK,
click: () => {
if (!request) {
return;
}
let mainWindow = Services.wm.getMostRecentWindow(gDevTools.chromeWindowType);
mainWindow.openUILinkIn(request.url, "tab");
},
}));
// Open in variables view.
menu.append(new MenuItem({
id: "console-menu-open",
label: l10n.getStr("webconsole.menu.openInVarView.label"),
accesskey: l10n.getStr("webconsole.menu.openInVarView.accesskey"),
disabled: !actor,
click: () => {
openVariablesView(actor);
},
}));
// Store as global variable.
menu.append(new MenuItem({
id: "console-menu-store",
label: l10n.getStr("webconsole.menu.storeAsGlobalVar.label"),
accesskey: l10n.getStr("webconsole.menu.storeAsGlobalVar.accesskey"),
disabled: !actor,
click: () => {
let evalString = `{ let i = 0;
while (this.hasOwnProperty("temp" + i) && i < 1000) {
i++;
}
this["temp" + i] = _self;
"temp" + i;
}`;
let options = {
selectedObjectActor: actor,
};
jsterm.requestEvaluation(evalString, options).then((res) => {
jsterm.focus();
jsterm.setInputValue(res.result);
});
},
}));
// Copy message or grip.
menu.append(new MenuItem({
id: "console-menu-copy",
label: l10n.getStr("webconsole.menu.copy.label"),
accesskey: l10n.getStr("webconsole.menu.copy.accesskey"),
// Disabled if there is no selection and no message element available to copy.
disabled: selection.isCollapsed && !clipboardText,
click: () => {
if (selection.isCollapsed) {
// If the selection is empty/collapsed, copy the text content of the
// message for which the context menu was opened.
clipboardHelper.copyString(clipboardText);
} else {
clipboardHelper.copyString(selection.toString());
}
},
}));
// Select all.
menu.append(new MenuItem({
id: "console-menu-select",
label: l10n.getStr("webconsole.menu.selectAll.label"),
accesskey: l10n.getStr("webconsole.menu.selectAll.accesskey"),
disabled: false,
click: () => {
let webconsoleOutput = parentNode.querySelector(".webconsole-output");
selection.selectAllChildren(webconsoleOutput);
},
}));
return menu;
}
exports.createContextMenu = createContextMenu;