Bug 1392531 - create dedicated tab target instance for web-extensions;r=ochameau,rpl draft
authorJulian Descottes <jdescottes@mozilla.com>
Tue, 22 Aug 2017 16:31:44 +0200
changeset 650516 e7ca0a1a47a3f762cac8006a3229cb9914ab3469
parent 649871 c7c96eebbcb91e5e0c8ef0dbbb5324812fa1e476
child 650517 270e98b4af322ff2310f6c965495c55db2d5fecd
child 650621 3051bf785354ac53a6554d6bdc4d7709cc9393b4
child 650622 8f1b7460a629ba104278248a31d94f45c1bdc57e
push id75432
push userjdescottes@mozilla.com
push dateTue, 22 Aug 2017 15:20:26 +0000
reviewersochameau, rpl
bugs1392531
milestone57.0a1
Bug 1392531 - create dedicated tab target instance for web-extensions;r=ochameau,rpl MozReview-Commit-ID: G7EOfYnZuZw
browser/components/extensions/ext-devtools.js
devtools/client/framework/devtools.js
devtools/shim/DevToolsShim.jsm
--- a/browser/components/extensions/ext-devtools.js
+++ b/browser/components/extensions/ext-devtools.js
@@ -49,17 +49,18 @@ global.getDevToolsTargetForContext = asy
     throw new Error("Unable to get a TabTarget for a context not associated to any toolbox");
   }
 
   if (!context.devToolsToolbox.target.isLocalTab) {
     throw new Error("Unexpected target type: only local tabs are currently supported.");
   }
 
   const tab = context.devToolsToolbox.target.tab;
-  context.devToolsTarget = DevToolsShim.getTargetForTab(tab);
+  context.devToolsTarget = DevToolsShim.createTargetForTab(tab);
+
   await context.devToolsTarget.makeRemote();
 
   return context.devToolsTarget;
 };
 
 /**
  * Retrieve the devtools target for the devtools extension proxy context
  * (lazily cloned from the target of the toolbox associated to the context
--- a/devtools/client/framework/devtools.js
+++ b/devtools/client/framework/devtools.js
@@ -6,16 +6,17 @@
 
 const {Cu} = require("chrome");
 const Services = require("Services");
 
 const {DevToolsShim} = Cu.import("chrome://devtools-shim/content/DevToolsShim.jsm", {});
 
 // Load gDevToolsBrowser toolbox lazily as they need gDevTools to be fully initialized
 loader.lazyRequireGetter(this, "TargetFactory", "devtools/client/framework/target", true);
+loader.lazyRequireGetter(this, "TabTarget", "devtools/client/framework/target", true);
 loader.lazyRequireGetter(this, "Toolbox", "devtools/client/framework/toolbox", true);
 loader.lazyRequireGetter(this, "ToolboxHostManager", "devtools/client/framework/toolbox-host-manager", true);
 loader.lazyRequireGetter(this, "gDevToolsBrowser", "devtools/client/framework/devtools-browser", true);
 loader.lazyRequireGetter(this, "HUDService", "devtools/client/webconsole/hudservice", true);
 loader.lazyImporter(this, "ScratchpadManager", "resource://devtools/client/scratchpad/scratchpad-manager.jsm");
 
 // Dependencies required for addon sdk compatibility layer.
 loader.lazyRequireGetter(this, "DebuggerServer", "devtools/server/main", true);
@@ -579,16 +580,27 @@ DevTools.prototype = {
    * Create a BrowserToolbox process linked to the provided addon id.
    */
   initBrowserToolboxProcessForAddon: function (addonID) {
     BrowserToolboxProcess.init({ addonID });
   },
 
   /**
    * Compatibility layer for web-extensions. Used by DevToolsShim for
+   * browser/components/extensions/ext-devtools.js
+   *
+   * web-extensions need to use dedicated instances of TabTarget and cannot reuse the
+   * cached instances managed by DevTools target factory.
+   */
+  createTargetForTab: function (tab) {
+    return new TabTarget(tab);
+  },
+
+  /**
+   * Compatibility layer for web-extensions. Used by DevToolsShim for
    * browser/components/extensions/ext-devtools-inspectedWindow.js
    */
   createWebExtensionInspectedWindowFront: function (tabTarget) {
     return new WebExtensionInspectedWindowFront(tabTarget.client, tabTarget.form);
   },
 
   /**
    * Compatibility layer for web-extensions. Used by DevToolsShim for
--- a/devtools/shim/DevToolsShim.jsm
+++ b/devtools/shim/DevToolsShim.jsm
@@ -293,16 +293,17 @@ let addonSdkMethods = [
 
 /**
  * Compatibility layer for webextensions.
  *
  * Those methods are called only after a DevTools webextension was loaded in DevTools,
  * therefore DevTools should always be available when they are called.
  */
 let webExtensionsMethods = [
+  "createTargetForTab",
   "createWebExtensionInspectedWindowFront",
   "getTargetForTab",
   "getTheme",
   "openBrowserConsole",
 ];
 
 for (let method of [...addonSdkMethods, ...webExtensionsMethods]) {
   this.DevToolsShim[method] = function () {