tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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