Bug 1411565 - Use BrowserContentProcess for local and remote addon debugging draft
authorJulian Descottes <jdescottes@mozilla.com>
Mon, 20 Nov 2017 19:16:42 +0100
changeset 700673 4acf9848a445a41a50e015a847d570ff3481c0dc
parent 700672 1c231c32cd991f8f3ae73959c75a7fa8f0d6fb72
child 740963 6bb0143fc2641af4d360c2f2fdaf3005bef0ebf6
push id89931
push userjdescottes@mozilla.com
push dateMon, 20 Nov 2017 18:25:22 +0000
bugs1411565
milestone59.0a1
Bug 1411565 - Use BrowserContentProcess for local and remote addon debugging MozReview-Commit-ID: 1xrTeTURBA9
devtools/client/aboutdebugging/components/addons/Panel.js
devtools/client/aboutdebugging/components/addons/Target.js
devtools/client/aboutdebugging/modules/addon.js
--- a/devtools/client/aboutdebugging/components/addons/Panel.js
+++ b/devtools/client/aboutdebugging/components/addons/Panel.js
@@ -88,18 +88,16 @@ class AddonsPanel extends Component {
 
   updateAddonsList() {
     this.props.client.listAddons()
       .then(({addons}) => {
         let extensions = addons.filter(addon => addon.debuggable).map(addon => {
           return {
             addonActor: addon.actor,
             addonID: addon.id,
-            // Forward the whole addon actor form for potential remote debugging.
-            form: addon,
             icon: addon.iconURL || ExtensionIcon,
             manifestURL: addon.manifestURL,
             name: addon.name,
             temporarilyInstalled: addon.temporarilyInstalled,
             url: addon.url,
             warnings: addon.warnings,
           };
         });
--- a/devtools/client/aboutdebugging/components/addons/Target.js
+++ b/devtools/client/aboutdebugging/components/addons/Target.js
@@ -4,17 +4,17 @@
 
 /* eslint-env browser */
 
 "use strict";
 
 const { Component } = require("devtools/client/shared/vendor/react");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
-const { debugLocalAddon, debugRemoteAddon, isTemporaryID, parseFileUri, uninstallAddon } =
+const { debugAddon, isTemporaryID, parseFileUri, uninstallAddon } =
   require("../../modules/addon");
 const Services = require("Services");
 
 loader.lazyImporter(this, "BrowserToolboxProcess",
   "resource://devtools/client/framework/ToolboxProcess.jsm");
 
 loader.lazyRequireGetter(this, "DebuggerClient",
   "devtools/shared/client/debugger-client", true);
@@ -127,17 +127,16 @@ class AddonTarget extends Component {
   static get propTypes() {
     return {
       client: PropTypes.instanceOf(DebuggerClient).isRequired,
       connect: PropTypes.object,
       debugDisabled: PropTypes.bool,
       target: PropTypes.shape({
         addonActor: PropTypes.string.isRequired,
         addonID: PropTypes.string.isRequired,
-        form: PropTypes.object.isRequired,
         icon: PropTypes.string,
         name: PropTypes.string.isRequired,
         temporarilyInstalled: PropTypes.bool,
         url: PropTypes.string,
         warnings: PropTypes.array,
       }).isRequired
     };
   }
@@ -145,23 +144,18 @@ class AddonTarget extends Component {
   constructor(props) {
     super(props);
     this.debug = this.debug.bind(this);
     this.uninstall = this.uninstall.bind(this);
     this.reload = this.reload.bind(this);
   }
 
   debug() {
-    let { client, connect, target } = this.props;
-
-    if (connect.type === "REMOTE") {
-      debugRemoteAddon(target.form, client);
-    } else if (connect.type === "LOCAL") {
-      debugLocalAddon(target.addonID);
-    }
+    let { connect, target } = this.props;
+    debugAddon(target.addonID, connect.params);
   }
 
   uninstall() {
     let { target } = this.props;
     uninstallAddon(target.addonID);
   }
 
   reload() {
--- a/devtools/client/aboutdebugging/modules/addon.js
+++ b/devtools/client/aboutdebugging/modules/addon.js
@@ -4,76 +4,38 @@
 
 "use strict";
 
 loader.lazyImporter(this, "BrowserToolboxProcess",
   "resource://devtools/client/framework/ToolboxProcess.jsm");
 loader.lazyImporter(this, "AddonManager", "resource://gre/modules/AddonManager.jsm");
 loader.lazyImporter(this, "AddonManagerPrivate", "resource://gre/modules/AddonManager.jsm");
 
-var {TargetFactory} = require("devtools/client/framework/target");
-var {Toolbox} = require("devtools/client/framework/toolbox");
-
-var {gDevTools} = require("devtools/client/framework/devtools");
-
-let browserToolboxProcess = null;
-let remoteAddonToolbox = null;
-function closeToolbox() {
-  if (browserToolboxProcess) {
-    browserToolboxProcess.close();
-  }
-
-  if (remoteAddonToolbox) {
-    remoteAddonToolbox.destroy();
-  }
-}
+let toolbox = null;
 
 /**
- * Start debugging an addon in the current instance of Firefox.
+ * Start debugging an addon.
  *
  * @param {String} addonID
  *        String id of the addon to debug.
+ * @param {Object} options
+ *        Additional connection options when connected to a remote runtime.
  */
-exports.debugLocalAddon = async function (addonID) {
-  // Close previous addon debugging toolbox.
-  closeToolbox();
-
-  browserToolboxProcess = BrowserToolboxProcess.init({
-    addonID,
-    onClose: () => {
-      browserToolboxProcess = null;
-    }
-  });
-};
+exports.debugAddon = async function (addonID, {host, port} = {}) {
+  if (toolbox) {
+    toolbox.close();
+  }
 
-/**
- * Start debugging an addon in a remote instance of Firefox.
- *
- * @param {Object} addonForm
- *        Necessary to create an addon debugging target.
- * @param {DebuggerClient} client
- *        Required for remote debugging.
- */
-exports.debugRemoteAddon = async function (addonForm, client) {
-  // Close previous addon debugging toolbox.
-  closeToolbox();
-
-  let options = {
-    form: addonForm,
-    chrome: true,
-    client,
-    isTabActor: addonForm.isWebExtension
-  };
-
-  let target = await TargetFactory.forRemoteTab(options);
-
-  let hostType = Toolbox.HostType.WINDOW;
-  remoteAddonToolbox = await gDevTools.showToolbox(target, "webconsole", hostType);
-  remoteAddonToolbox.once("destroy", () => {
-    remoteAddonToolbox = null;
+  toolbox = BrowserToolboxProcess.init({
+    addonID,
+    host,
+    port,
+    onClose: () => {
+      toolbox = null;
+    }
   });
 };
 
 exports.uninstallAddon = async function (addonID) {
   let addon = await AddonManager.getAddonByID(addonID);
   return addon && addon.uninstall();
 };