Bug 1380806 - Move DevTools command line implementation to its own module. r=jdescottes draft
authorAlexandre Poirot <poirot.alex@gmail.com>
Thu, 13 Jul 2017 19:19:30 +0200
changeset 643096 d896496d6468f63ecf24b8bbb313b517f84cf796
parent 642518 a921bfb8a2cf3db4d9edebe9b35799a3f9d035da
child 643099 fa9f4d05a7511ce857a324199b1da1e42cce380b
push id72992
push userbmo:poirot.alex@gmail.com
push dateWed, 09 Aug 2017 09:08:27 +0000
reviewersjdescottes
bugs1380806
milestone57.0a1
Bug 1380806 - Move DevTools command line implementation to its own module. r=jdescottes Mostly to get it out of Firefox startup codepath. But it would also allow DevTools add-on to control this. MozReview-Commit-ID: 7oJSDEa7Wjk
devtools/client/framework/command-line.js
devtools/client/framework/moz.build
devtools/shim/devtools-startup.js
copy from devtools/shim/devtools-startup.js
copy to devtools/client/framework/command-line.js
--- a/devtools/shim/devtools-startup.js
+++ b/devtools/client/framework/command-line.js
@@ -1,176 +1,23 @@
 /* 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/. */
-
-/**
- * This XPCOM component is loaded very early.
- * Be careful to lazy load dependencies as much as possible.
- *
- * It manages all the possible entry points for DevTools:
- * - Handles command line arguments like -jsconsole,
- * - Register all key shortcuts,
- * - Listen for "Web Developer" system menu opening, under "Tools",
- * - Inject the wrench icon in toolbar customization, which is used
- *   by the "Web Developer" list displayed in the hamburger menu,
- * - Register the JSON Viewer protocol handler.
- *
- * Only once any of these entry point is fired, this module ensures starting
- * core modules like 'devtools-browser.js' that hooks the browser windows
- * and ensure setting up tools.
- **/
-
 "use strict";
 
-const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
+const { Ci, Cc, Cu } = require("chrome");
+const Services = require("Services");
+
 const kDebuggerPrefs = [
   "devtools.debugger.remote-enabled",
   "devtools.chrome.enabled"
 ];
-const { XPCOMUtils } = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {});
-XPCOMUtils.defineLazyModuleGetter(this, "Services",
-                                  "resource://gre/modules/Services.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
-                                  "resource://gre/modules/AppConstants.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "CustomizableUI",
-                                  "resource:///modules/CustomizableUI.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "CustomizableWidgets",
-                                  "resource:///modules/CustomizableWidgets.jsm");
 
-XPCOMUtils.defineLazyGetter(this, "Bundle", function () {
-  const kUrl = "chrome://devtools/locale/key-shortcuts.properties";
-  return Services.strings.createBundle(kUrl);
-});
-
-XPCOMUtils.defineLazyGetter(this, "KeyShortcuts", function () {
-  const isMac = AppConstants.platform == "macosx";
-
-  // Common modifier shared by most key shortcuts
-  const modifiers = isMac ? "accel,alt" : "accel,shift";
-
-  // List of all key shortcuts triggering installation UI
-  // `id` should match tool's id from client/definitions.js
-  return [
-    // The following keys are also registered in /client/menus.js
-    // And should be synced.
-
-    // Both are toggling the toolbox on the last selected panel
-    // or the default one.
-    {
-      id: "toggleToolbox",
-      shortcut: Bundle.GetStringFromName("toggleToolbox.commandkey"),
-      modifiers
-    },
-    // All locales are using F12
-    {
-      id: "toggleToolboxF12",
-      shortcut: Bundle.GetStringFromName("toggleToolboxF12.commandkey"),
-      modifiers: "" // F12 is the only one without modifiers
-    },
-    // Toggle the visibility of the Developer Toolbar (=gcli)
-    {
-      id: "toggleToolbar",
-      shortcut: Bundle.GetStringFromName("toggleToolbar.commandkey"),
-      modifiers: "shift"
-    },
-    // Open WebIDE window
-    {
-      id: "webide",
-      shortcut: Bundle.GetStringFromName("webide.commandkey"),
-      modifiers: "shift"
-    },
-    // Open the Browser Toolbox
-    {
-      id: "browserToolbox",
-      shortcut: Bundle.GetStringFromName("browserToolbox.commandkey"),
-      modifiers: "accel,alt,shift"
-    },
-    // Open the Browser Console
-    {
-      id: "browserConsole",
-      shortcut: Bundle.GetStringFromName("browserConsole.commandkey"),
-      modifiers: "accel,shift"
-    },
-    // Toggle the Responsive Design Mode
-    {
-      id: "responsiveDesignMode",
-      shortcut: Bundle.GetStringFromName("responsiveDesignMode.commandkey"),
-      modifiers
-    },
-    // Open ScratchPad window
-    {
-      id: "scratchpad",
-      shortcut: Bundle.GetStringFromName("scratchpad.commandkey"),
-      modifiers: "shift"
-    },
-
-    // The following keys are also registered in /client/definitions.js
-    // and should be synced.
-
-    // Key for opening the Inspector
-    {
-      toolId: "inspector",
-      shortcut: Bundle.GetStringFromName("inspector.commandkey"),
-      modifiers
-    },
-    // Key for opening the Web Console
-    {
-      toolId: "webconsole",
-      shortcut: Bundle.GetStringFromName("webconsole.commandkey"),
-      modifiers
-    },
-    // Key for opening the Debugger
-    {
-      toolId: "jsdebugger",
-      shortcut: Bundle.GetStringFromName("debugger.commandkey"),
-      modifiers
-    },
-    // Key for opening the Network Monitor
-    {
-      toolId: "netmonitor",
-      shortcut: Bundle.GetStringFromName("netmonitor.commandkey"),
-      modifiers
-    },
-    // Key for opening the Style Editor
-    {
-      toolId: "styleeditor",
-      shortcut: Bundle.GetStringFromName("styleeditor.commandkey"),
-      modifiers: "shift"
-    },
-    // Key for opening the Performance Panel
-    {
-      toolId: "performance",
-      shortcut: Bundle.GetStringFromName("performance.commandkey"),
-      modifiers: "shift"
-    },
-    // Key for opening the Storage Panel
-    {
-      toolId: "storage",
-      shortcut: Bundle.GetStringFromName("storage.commandkey"),
-      modifiers: "shift"
-    },
-    // Key for opening the DOM Panel
-    {
-      toolId: "dom",
-      shortcut: Bundle.GetStringFromName("dom.commandkey"),
-      modifiers
-    },
-  ];
-});
-
-function DevToolsStartup() {}
-
-DevToolsStartup.prototype = {
-  /**
-   * Flag that indicates if the developer toggle was already added to customizableUI.
-   */
-  developerToggleCreated: false,
-
-  handle: function (cmdLine) {
+module.exports = {
+  handle(cmdLine) {
     let consoleFlag = cmdLine.handleFlag("jsconsole", false);
     let debuggerFlag = cmdLine.handleFlag("jsdebugger", false);
     let devtoolsFlag = cmdLine.handleFlag("devtools", false);
 
     if (consoleFlag) {
       this.handleConsoleFlag(cmdLine);
     }
     if (debuggerFlag) {
@@ -184,234 +31,41 @@ DevToolsStartup.prototype = {
       // We get an error if the option is given but not followed by a value.
       // By catching and trying again, the value is effectively optional.
       debuggerServerFlag = cmdLine.handleFlag("start-debugger-server", false);
     }
     if (debuggerServerFlag) {
       this.handleDebuggerServerFlag(cmdLine, debuggerServerFlag);
     }
 
-    // Only top level Firefox Windows fire a browser-delayed-startup-finished event
     let onWindowReady = window => {
-      this.hookWindow(window);
-
-      if (devtoolsFlag) {
-        this.handleDevToolsFlag(window);
-        // This listener is called for all Firefox windows, but we want to execute
-        // that command only once
-        devtoolsFlag = false;
-      }
-      JsonView.initialize();
+			Services.obs.removeObserver(onWindowReady, "browser-delayed-startup-finished");
+			this.handleDevToolsFlag(window);
     };
     Services.obs.addObserver(onWindowReady, "browser-delayed-startup-finished");
   },
 
-  /**
-   * Register listeners to all possible entry points for Developer Tools.
-   * But instead of implementing the actual actions, defer to DevTools codebase.
-   * In most cases, it only needs to call this.initDevTools which handles the rest.
-   * We do that to prevent loading any DevTools module until the user intent to use them.
-   */
-  hookWindow(window) {
-    // Key Shortcuts need to be added on all the created windows.
-    this.hookKeyShortcuts(window);
-
-    if (!this.developerToggleCreated) {
-      this.hookDeveloperToggle();
-      this.developerToggleCreated = true;
-    }
-
-    // The developer menu hook only needs to be added if devtools have not been
-    // initialized yet.
-    if (!this.initialized) {
-      this.hookWebDeveloperMenu(window);
-    }
-  },
-
-  /**
-   * Dynamically register a wrench icon in the customization menu.
-   * You can use this button by right clicking on Firefox toolbar
-   * and dragging it from the customization panel to the toolbar.
-   * (i.e. this isn't displayed by default to users!)
-   *
-   * _But_, the "Web Developer" entry in the hamburger menu (the menu with
-   * 3 horizontal lines), is using this "developer-button" view to populate
-   * its menu. So we have to register this button for the menu to work.
-   *
-   * Also, this menu duplicates its own entries from the "Web Developer"
-   * menu in the system menu, under "Tools" main menu item. The system
-   * menu is being hooked by "hookWebDeveloperMenu" which ends up calling
-   * devtools/client/framework/browser-menu to create the items for real,
-   * initDevTools, from onViewShowing is also calling browser-menu.
-   */
-  hookDeveloperToggle() {
-    let id = "developer-button";
-    let widget = CustomizableUI.getWidget(id);
-    if (widget && widget.provider == CustomizableUI.PROVIDER_API) {
-      return;
-    }
-    let item = {
-      id: id,
-      type: "view",
-      viewId: "PanelUI-developer",
-      shortcutId: "key_toggleToolbox",
-      tooltiptext: "developer-button.tooltiptext2",
-      defaultArea: AppConstants.MOZ_DEV_EDITION ?
-                     CustomizableUI.AREA_NAVBAR :
-                     CustomizableUI.AREA_PANEL,
-      onViewShowing: (event) => {
-        // Ensure creating the menuitems in the system menu before trying to copy them.
-        this.initDevTools("HamburgerMenu");
-
-        // Populate the subview with whatever menuitems are in the developer
-        // menu. We skip menu elements, because the menu panel has no way
-        // of dealing with those right now.
-        let doc = event.target.ownerDocument;
-
-        let menu = doc.getElementById("menuWebDeveloperPopup");
-
-        let itemsToDisplay = [...menu.children];
-        // Hardcode the addition of the "work offline" menuitem at the bottom:
-        itemsToDisplay.push({localName: "menuseparator", getAttribute: () => {}});
-        itemsToDisplay.push(doc.getElementById("goOfflineMenuitem"));
-
-        let developerItems = doc.getElementById("PanelUI-developerItems");
-        // Import private helpers from CustomizableWidgets
-        let { clearSubview, fillSubviewFromMenuItems } =
-          Cu.import("resource:///modules/CustomizableWidgets.jsm", {});
-        clearSubview(developerItems);
-        fillSubviewFromMenuItems(itemsToDisplay, developerItems);
-      },
-      onInit(anchor) {
-        // Since onBeforeCreated already bails out when initialized, we can call
-        // it right away.
-        this.onBeforeCreated(anchor.ownerDocument);
-      },
-      onBeforeCreated(doc) {
-        // Bug 1223127, CUI should make this easier to do.
-        if (doc.getElementById("PanelUI-developerItems")) {
-          return;
-        }
-        let view = doc.createElement("panelview");
-        view.id = "PanelUI-developerItems";
-        let panel = doc.createElement("vbox");
-        panel.setAttribute("class", "panel-subview-body");
-        view.appendChild(panel);
-        doc.getElementById("PanelUI-multiView").appendChild(view);
-      }
-    };
-    CustomizableUI.createWidget(item);
-    CustomizableWidgets.push(item);
-  },
-
-  /*
-   * We listen to the "Web Developer" system menu, which is under "Tools" main item.
-   * This menu item is hardcoded empty in Firefox UI. We listen for its opening to
-   * populate it lazily. Loading main DevTools module is going to populate it.
-   */
-  hookWebDeveloperMenu(window) {
-    let menu = window.document.getElementById("webDeveloperMenu");
-    menu.addEventListener("popupshowing", () => {
-      this.initDevTools("SystemMenu");
-    }, { once: true });
-  },
-
-  hookKeyShortcuts(window) {
-    let doc = window.document;
-    let keyset = doc.createElement("keyset");
-    keyset.setAttribute("id", "devtoolsKeyset");
-
-    for (let key of KeyShortcuts) {
-      let xulKey = this.createKey(doc, key, () => this.onKey(window, key));
-      keyset.appendChild(xulKey);
-    }
-
-    // Appending a <key> element is not always enough. The <keyset> needs
-    // to be detached and reattached to make sure the <key> is taken into
-    // account (see bug 832984).
-    let mainKeyset = doc.getElementById("mainKeyset");
-    mainKeyset.parentNode.insertBefore(keyset, mainKeyset);
-  },
-
-  onKey(window, key) {
-    let require = this.initDevTools("KeyShortcut");
-    let { gDevToolsBrowser } = require("devtools/client/framework/devtools-browser");
-    gDevToolsBrowser.onKeyShortcut(window, key);
-  },
-
-  // Create a <xul:key> DOM Element
-  createKey(doc, { id, toolId, shortcut, modifiers: mod }, oncommand) {
-    let k = doc.createElement("key");
-    k.id = "key_" + (id || toolId);
-
-    if (shortcut.startsWith("VK_")) {
-      k.setAttribute("keycode", shortcut);
-    } else {
-      k.setAttribute("key", shortcut);
-    }
-
-    if (mod) {
-      k.setAttribute("modifiers", mod);
-    }
-
-    // Bug 371900: command event is fired only if "oncommand" attribute is set.
-    k.setAttribute("oncommand", ";");
-    k.addEventListener("command", oncommand);
-
-    return k;
-  },
-
-  /**
-   * Boolean flag to check if DevTools have been already initialized or not.
-   * By initialized, we mean that its main modules are loaded.
-   */
-  initialized: false,
-
-  initDevTools: function (reason) {
-    if (!this.initialized) {
-      // Only save the first call for each firefox run as next call
-      // won't necessarely start the tool. For example key shortcuts may
-      // only change the currently selected tool.
-      try {
-        Services.telemetry.getHistogramById("DEVTOOLS_ENTRY_POINT")
-                          .add(reason);
-      } catch (e) {
-        dump("DevTools telemetry entry point failed: " + e + "\n");
-      }
-    }
-    this.initialized = true;
-    let { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
-    // Ensure loading main devtools module that hooks up into browser UI
-    // and initialize all devtools machinery.
-    require("devtools/client/framework/devtools-browser");
-    return require;
-  },
-
   handleConsoleFlag: function (cmdLine) {
     let window = Services.wm.getMostRecentWindow("devtools:webconsole");
     if (!window) {
-      this.initDevTools("CommandLine");
-
-      let { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
       let hudservice = require("devtools/client/webconsole/hudservice");
       let { console } = Cu.import("resource://gre/modules/Console.jsm", {});
       hudservice.toggleBrowserConsole().catch(console.error);
     } else {
       // the Browser Console was already open
       window.focus();
     }
 
     if (cmdLine.state == Ci.nsICommandLine.STATE_REMOTE_AUTO) {
       cmdLine.preventDefault = true;
     }
   },
 
   // Open the toolbox on the selected tab once the browser starts up.
   handleDevToolsFlag: function (window) {
-    const require = this.initDevTools("CommandLine");
     const {gDevTools} = require("devtools/client/framework/devtools");
     const {TargetFactory} = require("devtools/client/framework/target");
     let target = TargetFactory.forTab(window.gBrowser.selectedTab);
     gDevTools.showToolbox(target);
   },
 
   _isRemoteDebuggingEnabled() {
     let remoteDebuggingEnabled = false;
@@ -529,98 +183,10 @@ DevToolsStartup.prototype = {
     } catch (e) {
       dump("Unable to start debugger server on " + portOrPath + ": " + e);
     }
 
     if (cmdLine.state == Ci.nsICommandLine.STATE_REMOTE_AUTO) {
       cmdLine.preventDefault = true;
     }
   },
-
-  // Used by tests and the toolbox to register the same key shortcuts in toolboxes loaded
-  // in a window window.
-  get KeyShortcuts() {
-    return KeyShortcuts;
-  },
-  get wrappedJSObject() {
-    return this;
-  },
-
-  /* eslint-disable max-len */
-  helpInfo: "  --jsconsole        Open the Browser Console.\n" +
-            "  --jsdebugger       Open the Browser Toolbox.\n" +
-            "  --wait-for-jsdebugger Spin event loop until JS debugger connects.\n" +
-            "                     Enables debugging (some) application startup code paths.\n" +
-            "                     Only has an effect when `--jsdebugger` is also supplied.\n" +
-            "  --devtools         Open DevTools on initial load.\n" +
-            "  --start-debugger-server [ws:][ <port> | <path> ] Start the debugger server on\n" +
-            "                     a TCP port or Unix domain socket path. Defaults to TCP port\n" +
-            "                     6000. Use WebSocket protocol if ws: prefix is specified.\n",
-  /* eslint-disable max-len */
-
-  classID: Components.ID("{9e9a9283-0ce9-4e4a-8f1c-ba129a032c32}"),
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsICommandLineHandler]),
 };
 
-/**
- * Singleton object that represents the JSON View in-content tool.
- * It has the same lifetime as the browser.
- */
-const JsonView = {
-  initialized: false,
-
-  initialize: function () {
-    // Prevent loading the frame script multiple times if we call this more than once.
-    if (this.initialized) {
-      return;
-    }
-    this.initialized = true;
-
-    // Load JSON converter module. This converter is responsible
-    // for handling 'application/json' documents and converting
-    // them into a simple web-app that allows easy inspection
-    // of the JSON data.
-    Services.ppmm.loadProcessScript(
-      "resource://devtools/client/jsonview/converter-observer.js",
-      true);
-
-    // Register for messages coming from the child process.
-    // This is never removed as there is no particular need to unregister
-    // it during shutdown.
-    Services.ppmm.addMessageListener(
-      "devtools:jsonview:save", this.onSave);
-  },
-
-  // Message handlers for events from child processes
-
-  /**
-   * Save JSON to a file needs to be implemented here
-   * in the parent process.
-   */
-  onSave: function (message) {
-    let chrome = Services.wm.getMostRecentWindow("navigator:browser");
-    let browser = chrome.gBrowser.selectedBrowser;
-    if (message.data.url === null) {
-      // Save original contents
-      chrome.saveBrowser(browser, false, message.data.windowID);
-    } else {
-      // The following code emulates saveBrowser, but:
-      // - Uses the given blob URL containing the custom contents to save.
-      // - Obtains the file name from the URL of the document, not the blob.
-      let persistable = browser.QueryInterface(Ci.nsIFrameLoaderOwner)
-        .frameLoader.QueryInterface(Ci.nsIWebBrowserPersistable);
-      persistable.startPersistence(message.data.windowID, {
-        onDocumentReady(doc) {
-          let uri = chrome.makeURI(doc.documentURI, doc.characterSet);
-          let filename = chrome.getDefaultFileName(undefined, uri, doc, null);
-          chrome.internalSave(message.data.url, doc, filename, null, doc.contentType,
-            false, null, null, null, doc, false, null, undefined);
-        },
-        onError(status) {
-          throw new Error("JSON Viewer's onSave failed in startPersistence");
-        }
-      });
-    }
-  }
-};
-
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory(
-  [DevToolsStartup]);
--- a/devtools/client/framework/moz.build
+++ b/devtools/client/framework/moz.build
@@ -12,16 +12,17 @@ TEST_HARNESS_FILES.xpcshell.devtools.cli
 DIRS += [
     'components',
 ]
 
 DevToolsModules(
     'about-devtools-toolbox.js',
     'attach-thread.js',
     'browser-menus.js',
+    'command-line.js',
     'devtools-browser.js',
     'devtools.js',
     'gDevTools.jsm',
     'menu-item.js',
     'menu.js',
     'selection.js',
     'sidebar.js',
     'source-map-url-service.js',
--- a/devtools/shim/devtools-startup.js
+++ b/devtools/shim/devtools-startup.js
@@ -16,21 +16,18 @@
  *
  * Only once any of these entry point is fired, this module ensures starting
  * core modules like 'devtools-browser.js' that hooks the browser windows
  * and ensure setting up tools.
  **/
 
 "use strict";
 
-const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
-const kDebuggerPrefs = [
-  "devtools.debugger.remote-enabled",
-  "devtools.chrome.enabled"
-];
+const { interfaces: Ci, utils: Cu } = Components;
+
 const { XPCOMUtils } = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {});
 XPCOMUtils.defineLazyModuleGetter(this, "Services",
                                   "resource://gre/modules/Services.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
                                   "resource://gre/modules/AppConstants.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "CustomizableUI",
                                   "resource:///modules/CustomizableUI.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "CustomizableWidgets",
@@ -152,58 +149,50 @@ XPCOMUtils.defineLazyGetter(this, "KeySh
     {
       toolId: "dom",
       shortcut: Bundle.GetStringFromName("dom.commandkey"),
       modifiers
     },
   ];
 });
 
+const DevToolsFlags = [
+  "devtools",
+  "jsconsole",
+  "jsdebugger",
+  "start-debugger-server",
+  "wait-for-jsdebugger",
+];
+
 function DevToolsStartup() {}
 
 DevToolsStartup.prototype = {
   /**
    * Flag that indicates if the developer toggle was already added to customizableUI.
    */
   developerToggleCreated: false,
 
-  handle: function (cmdLine) {
-    let consoleFlag = cmdLine.handleFlag("jsconsole", false);
-    let debuggerFlag = cmdLine.handleFlag("jsdebugger", false);
-    let devtoolsFlag = cmdLine.handleFlag("devtools", false);
+  // Check if any command line argument specific to DevTools has been given
+  hasAnyDevToolsFlag(cmdLine) {
+    return DevToolsFlags.some(flag => cmdLine.findFlag(flag, false) != -1);
+  },
 
-    if (consoleFlag) {
-      this.handleConsoleFlag(cmdLine);
-    }
-    if (debuggerFlag) {
-      this.handleDebuggerFlag(cmdLine);
-    }
-    let debuggerServerFlag;
-    try {
-      debuggerServerFlag =
-        cmdLine.handleFlagWithParam("start-debugger-server", false);
-    } catch (e) {
-      // We get an error if the option is given but not followed by a value.
-      // By catching and trying again, the value is effectively optional.
-      debuggerServerFlag = cmdLine.handleFlag("start-debugger-server", false);
-    }
-    if (debuggerServerFlag) {
-      this.handleDebuggerServerFlag(cmdLine, debuggerServerFlag);
+  handle: function (cmdLine) {
+    // Defer command line implementation to a dedicated module to reduce
+    // this module size
+    if (this.hasAnyDevToolsFlag(cmdLine)) {
+      let require = this.initDevTools("CommandLine");
+      let CommandLine = require("devtools/client/framework/command-line");
+      CommandLine.handle(cmdLine);
     }
 
     // Only top level Firefox Windows fire a browser-delayed-startup-finished event
     let onWindowReady = window => {
       this.hookWindow(window);
 
-      if (devtoolsFlag) {
-        this.handleDevToolsFlag(window);
-        // This listener is called for all Firefox windows, but we want to execute
-        // that command only once
-        devtoolsFlag = false;
-      }
       JsonView.initialize();
     };
     Services.obs.addObserver(onWindowReady, "browser-delayed-startup-finished");
   },
 
   /**
    * Register listeners to all possible entry points for Developer Tools.
    * But instead of implementing the actual actions, defer to DevTools codebase.
@@ -380,166 +369,16 @@ DevToolsStartup.prototype = {
     this.initialized = true;
     let { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
     // Ensure loading main devtools module that hooks up into browser UI
     // and initialize all devtools machinery.
     require("devtools/client/framework/devtools-browser");
     return require;
   },
 
-  handleConsoleFlag: function (cmdLine) {
-    let window = Services.wm.getMostRecentWindow("devtools:webconsole");
-    if (!window) {
-      this.initDevTools("CommandLine");
-
-      let { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
-      let hudservice = require("devtools/client/webconsole/hudservice");
-      let { console } = Cu.import("resource://gre/modules/Console.jsm", {});
-      hudservice.toggleBrowserConsole().catch(console.error);
-    } else {
-      // the Browser Console was already open
-      window.focus();
-    }
-
-    if (cmdLine.state == Ci.nsICommandLine.STATE_REMOTE_AUTO) {
-      cmdLine.preventDefault = true;
-    }
-  },
-
-  // Open the toolbox on the selected tab once the browser starts up.
-  handleDevToolsFlag: function (window) {
-    const require = this.initDevTools("CommandLine");
-    const {gDevTools} = require("devtools/client/framework/devtools");
-    const {TargetFactory} = require("devtools/client/framework/target");
-    let target = TargetFactory.forTab(window.gBrowser.selectedTab);
-    gDevTools.showToolbox(target);
-  },
-
-  _isRemoteDebuggingEnabled() {
-    let remoteDebuggingEnabled = false;
-    try {
-      remoteDebuggingEnabled = kDebuggerPrefs.every(pref => {
-        return Services.prefs.getBoolPref(pref);
-      });
-    } catch (ex) {
-      let { console } = Cu.import("resource://gre/modules/Console.jsm", {});
-      console.error(ex);
-      return false;
-    }
-    if (!remoteDebuggingEnabled) {
-      let errorMsg = "Could not run chrome debugger! You need the following " +
-                     "prefs to be set to true: " + kDebuggerPrefs.join(", ");
-      let { console } = Cu.import("resource://gre/modules/Console.jsm", {});
-      console.error(new Error(errorMsg));
-      // Dump as well, as we're doing this from a commandline, make sure people
-      // don't miss it:
-      dump(errorMsg + "\n");
-    }
-    return remoteDebuggingEnabled;
-  },
-
-  handleDebuggerFlag: function (cmdLine) {
-    if (!this._isRemoteDebuggingEnabled()) {
-      return;
-    }
-
-    let devtoolsThreadResumed = false;
-    let pauseOnStartup = cmdLine.handleFlag("wait-for-jsdebugger", false);
-    if (pauseOnStartup) {
-      let observe = function (subject, topic, data) {
-        devtoolsThreadResumed = true;
-        Services.obs.removeObserver(observe, "devtools-thread-resumed");
-      };
-      Services.obs.addObserver(observe, "devtools-thread-resumed");
-    }
-
-    const { BrowserToolboxProcess } = Cu.import("resource://devtools/client/framework/ToolboxProcess.jsm", {});
-    BrowserToolboxProcess.init();
-
-    if (pauseOnStartup) {
-      // Spin the event loop until the debugger connects.
-      let tm = Cc["@mozilla.org/thread-manager;1"].getService();
-      tm.spinEventLoopUntil(() => {
-        return devtoolsThreadResumed;
-      });
-    }
-
-    if (cmdLine.state == Ci.nsICommandLine.STATE_REMOTE_AUTO) {
-      cmdLine.preventDefault = true;
-    }
-  },
-
-  /**
-   * Handle the --start-debugger-server command line flag. The options are:
-   * --start-debugger-server
-   *   The portOrPath parameter is boolean true in this case. Reads and uses the defaults
-   *   from devtools.debugger.remote-port and devtools.debugger.remote-websocket prefs.
-   *   The default values of these prefs are port 6000, WebSocket disabled.
-   *
-   * --start-debugger-server 6789
-   *   Start the non-WebSocket server on port 6789.
-   *
-   * --start-debugger-server /path/to/filename
-   *   Start the server on a Unix domain socket.
-   *
-   * --start-debugger-server ws:6789
-   *   Start the WebSocket server on port 6789.
-   *
-   * --start-debugger-server ws:
-   *   Start the WebSocket server on the default port (taken from d.d.remote-port)
-   */
-  handleDebuggerServerFlag: function (cmdLine, portOrPath) {
-    if (!this._isRemoteDebuggingEnabled()) {
-      return;
-    }
-
-    let webSocket = false;
-    let defaultPort = Services.prefs.getIntPref("devtools.debugger.remote-port");
-    if (portOrPath === true) {
-      // Default to pref values if no values given on command line
-      webSocket = Services.prefs.getBoolPref("devtools.debugger.remote-websocket");
-      portOrPath = defaultPort;
-    } else if (portOrPath.startsWith("ws:")) {
-      webSocket = true;
-      let port = portOrPath.slice(3);
-      portOrPath = Number(port) ? port : defaultPort;
-    }
-
-    let { DevToolsLoader } =
-      Cu.import("resource://devtools/shared/Loader.jsm", {});
-
-    try {
-      // Create a separate loader instance, so that we can be sure to receive
-      // a separate instance of the DebuggingServer from the rest of the
-      // devtools.  This allows us to safely use the tools against even the
-      // actors and DebuggingServer itself, especially since we can mark
-      // serverLoader as invisible to the debugger (unlike the usual loader
-      // settings).
-      let serverLoader = new DevToolsLoader();
-      serverLoader.invisibleToDebugger = true;
-      let { DebuggerServer: debuggerServer } =
-        serverLoader.require("devtools/server/main");
-      debuggerServer.init();
-      debuggerServer.addBrowserActors();
-      debuggerServer.allowChromeProcess = true;
-
-      let listener = debuggerServer.createListener();
-      listener.portOrPath = portOrPath;
-      listener.webSocket = webSocket;
-      listener.open();
-      dump("Started debugger server on " + portOrPath + "\n");
-    } catch (e) {
-      dump("Unable to start debugger server on " + portOrPath + ": " + e);
-    }
-
-    if (cmdLine.state == Ci.nsICommandLine.STATE_REMOTE_AUTO) {
-      cmdLine.preventDefault = true;
-    }
-  },
-
   // Used by tests and the toolbox to register the same key shortcuts in toolboxes loaded
   // in a window window.
   get KeyShortcuts() {
     return KeyShortcuts;
   },
   get wrappedJSObject() {
     return this;
   },