Bug 1392531 - create dedicated tab target instance for web-extensions;r=ochameau,rpl
MozReview-Commit-ID: G7EOfYnZuZw
--- 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 () {