menus.js (5527B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 /** 8 * This module defines the sorted list of menuitems inserted into the 9 * "Browser Tools" menu. 10 * It also defines the key shortcuts that relates to them. 11 * 12 * Various fields are necessary for historical compatiblity with XUL/addons: 13 * - id: 14 * used as <xul:menuitem> id attribute 15 * - l10nKey: 16 * prefix used to locale localization strings from menus.properties 17 * - oncommand: 18 * function called when the menu item or key shortcut are fired 19 * - keyId: 20 * Identifier used in devtools/client/devtools-startup.js 21 * Helps figuring out the DOM id for the related <xul:key> 22 * in order to have the key text displayed in menus. 23 * - checkbox: 24 * If true, the menuitem is prefixed by a checkbox and runtime code can 25 * toggle it. 26 */ 27 28 const lazy = {}; 29 ChromeUtils.defineESModuleGetters(lazy, { 30 BrowserToolboxLauncher: 31 "resource://devtools/client/framework/browser-toolbox/Launcher.sys.mjs", 32 }); 33 34 loader.lazyRequireGetter(this, "flags", "resource://devtools/shared/flags.js"); 35 36 loader.lazyRequireGetter( 37 this, 38 "gDevToolsBrowser", 39 "resource://devtools/client/framework/devtools-browser.js", 40 true 41 ); 42 loader.lazyRequireGetter( 43 this, 44 "ResponsiveUIManager", 45 "resource://devtools/client/responsive/manager.js" 46 ); 47 loader.lazyRequireGetter( 48 this, 49 "openDocLink", 50 "resource://devtools/client/shared/link.js", 51 true 52 ); 53 loader.lazyRequireGetter( 54 this, 55 "CommandsFactory", 56 "resource://devtools/shared/commands/commands-factory.js", 57 true 58 ); 59 60 loader.lazyRequireGetter( 61 this, 62 "PICKER_TYPES", 63 "resource://devtools/shared/picker-constants.js" 64 ); 65 66 exports.menuitems = [ 67 { 68 id: "menu_devToolbox", 69 l10nKey: "webDeveloperToolsMenu", 70 oncommand(event) { 71 try { 72 const window = event.target.ownerDocument.defaultView; 73 gDevToolsBrowser.toggleToolboxCommand( 74 window.gBrowser, 75 ChromeUtils.now() 76 ); 77 } catch (e) { 78 console.error(`Exception while opening the toolbox: ${e}\n${e.stack}`); 79 } 80 }, 81 keyId: "toggleToolbox", 82 checkbox: true, 83 }, 84 { 85 id: "menu_devtools_remotedebugging", 86 l10nKey: "devtoolsRemoteDebugging", 87 oncommand(event) { 88 const window = event.target.ownerDocument.defaultView; 89 gDevToolsBrowser.openAboutDebugging(window.gBrowser); 90 }, 91 }, 92 { 93 id: "menu_browserToolbox", 94 l10nKey: "browserToolboxMenu", 95 oncommand() { 96 lazy.BrowserToolboxLauncher.init(); 97 }, 98 keyId: "browserToolbox", 99 }, 100 { 101 id: "menu_browserConsole", 102 l10nKey: "browserConsoleCmd", 103 oncommand() { 104 const { 105 BrowserConsoleManager, 106 } = require("resource://devtools/client/webconsole/browser-console-manager.js"); 107 BrowserConsoleManager.openBrowserConsoleOrFocus(); 108 }, 109 keyId: "browserConsole", 110 }, 111 { 112 id: "menu_responsiveUI", 113 l10nKey: "responsiveDesignMode", 114 oncommand(event) { 115 const window = event.target.ownerDocument.defaultView; 116 ResponsiveUIManager.toggle(window, window.gBrowser.selectedTab, { 117 trigger: "menu", 118 }); 119 }, 120 keyId: "responsiveDesignMode", 121 checkbox: true, 122 }, 123 { 124 id: "menu_eyedropper", 125 l10nKey: "eyedropper", 126 async oncommand(event) { 127 const window = event.target.ownerDocument.defaultView; 128 129 // The eyedropper might be used without a toolbox, so it should use a 130 // dedicated commands instance. 131 // See Bug 1701004. 132 const commands = await CommandsFactory.forTab( 133 window.gBrowser.selectedTab 134 ); 135 await commands.targetCommand.startListening(); 136 137 const target = commands.targetCommand.targetFront; 138 const inspectorFront = await target.getFront("inspector"); 139 140 // If RDM is active, disable touch simulation events if they're enabled. 141 // Similarly, enable them when the color picker is done picking. 142 if ( 143 ResponsiveUIManager.isActiveForTab(commands.descriptorFront.localTab) 144 ) { 145 const ui = ResponsiveUIManager.getResponsiveUIForTab( 146 commands.descriptorFront.localTab 147 ); 148 await ui.setElementPickerState(true, PICKER_TYPES.EYEDROPPER); 149 150 inspectorFront.once("color-picked", async () => { 151 await ui.setElementPickerState(false, PICKER_TYPES.EYEDROPPER); 152 }); 153 154 inspectorFront.once("color-pick-canceled", async () => { 155 await ui.setElementPickerState(false, PICKER_TYPES.EYEDROPPER); 156 }); 157 } 158 159 // Destroy the dedicated commands instance when the color picking is 160 // finished. 161 inspectorFront.once("color-picked", () => commands.destroy()); 162 inspectorFront.once("color-pick-canceled", () => commands.destroy()); 163 164 inspectorFront.pickColorFromPage({ copyOnSelect: true, fromMenu: true }); 165 166 if (flags.testing) { 167 // Used in devtools/client/inspector/test/browser_inspector_eyedropper_ruleview.js 168 Services.obs.notifyObservers( 169 { wrappedJSObject: target }, 170 "color-picker-command-handled" 171 ); 172 } 173 }, 174 checkbox: true, 175 }, 176 { 177 id: "extensionsForDevelopers", 178 l10nKey: "extensionsForDevelopersCmd", 179 appMenuL10nId: "appmenu-developer-tools-extensions", 180 oncommand() { 181 openDocLink( 182 "https://addons.mozilla.org/firefox/collections/mozilla/webdeveloper/" 183 ); 184 }, 185 }, 186 ];