diff --git a/browser/components/extensions/parent/ext-devtools-panels.js b/browser/components/extensions/parent/ext-devtools-panels.js index c1e357f8379a7..0e46b8370863f 100644 --- a/browser/components/extensions/parent/ext-devtools-panels.js +++ b/browser/components/extensions/parent/ext-devtools-panels.js @@ -156,7 +156,7 @@ class ParentDevToolsPanel extends BaseDevToolsPanel { // panelLabel is used to set the aria-label attribute (See Bug 1570645). panelLabel: title, tooltip: `DevTools Panel added by "${extensionName}" add-on.`, - isToolSupported: toolbox => toolbox.target.isLocalTab, + isToolSupported: toolbox => toolbox.commands.descriptorFront.isLocalTab, build: (window, toolbox) => { if (toolbox !== this.toolbox) { throw new Error( diff --git a/devtools/client/definitions.js b/devtools/client/definitions.js index 504ca5b7dbb30..955f97630317e 100644 --- a/devtools/client/definitions.js +++ b/devtools/client/definitions.js @@ -280,7 +280,9 @@ Tools.performance = { // use the performance panel; about:debugging provides a "Profile performance" button // which can be used instead, without having the overhead of starting a remote toolbox. // Also accept the Browser Toolbox, so that we can profile its process via a second browser toolbox. - return toolbox.target.isLocalTab || toolbox.isBrowserToolbox; + return ( + toolbox.commands.descriptorFront.isLocalTab || toolbox.isBrowserToolbox + ); }, build(frame, toolbox, commands) { return new NewPerformancePanel(frame, toolbox, commands); @@ -490,7 +492,7 @@ exports.ToolboxButtons = [ "toolbox.buttons.responsive", osString == "Darwin" ? "Cmd+Opt+M" : "Ctrl+Shift+M" ), - isToolSupported: toolbox => toolbox.target.isLocalTab, + isToolSupported: toolbox => toolbox.commands.descriptorFront.isLocalTab, onClick(event, toolbox) { const { localTab } = toolbox.commands.descriptorFront; const browserWindow = localTab.ownerDocument.defaultView; diff --git a/devtools/client/framework/test/browser_commands_from_url.js b/devtools/client/framework/test/browser_commands_from_url.js index c3a23f72803f1..aeeff7961bc25 100644 --- a/devtools/client/framework/test/browser_commands_from_url.js +++ b/devtools/client/framework/test/browser_commands_from_url.js @@ -21,7 +21,6 @@ SimpleTest.registerCleanupFunction(() => { function assertTarget(target, url, chrome = false) { is(target.url, url); - is(target.isLocalTab, false); is(target.chrome, chrome); is(target.isBrowsingContext, true); } @@ -45,7 +44,18 @@ add_task(async function() { ); // Descriptor's getTarget will only work if the TargetCommand watches for the first top target await commands.targetCommand.startListening(); + + // For now, we can't spawn a commands flagged as 'local tab' via URL query params + // The only way to has isLocalTab is to create the toolbox via showToolboxForTab + // and spawn the command via CommandsFactory.forTab. + is( + commands.descriptorFront.isLocalTab, + false, + "Even if we refer to a local tab, isLocalTab is false (for now)" + ); + target = await commands.descriptorFront.getTarget(); + assertTarget(target, TEST_URI); await commands.destroy(); diff --git a/devtools/client/framework/test/browser_target_events.js b/devtools/client/framework/test/browser_target_events.js index 3681e93ff3511..77fc6047f23fc 100644 --- a/devtools/client/framework/test/browser_target_events.js +++ b/devtools/client/framework/test/browser_target_events.js @@ -16,11 +16,18 @@ add_task(async function() { gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser); await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); - const target = await createAndAttachTargetForTab(gBrowser.selectedTab); - is(target.localTab, gBrowser.selectedTab, "Target linked to the right tab."); + const commands = await CommandsFactory.forTab(gBrowser.selectedTab); + is( + commands.descriptorFront.localTab, + gBrowser.selectedTab, + "Target linked to the right tab." + ); - const willNavigate = once(target, "will-navigate"); - const navigate = once(target, "navigate"); + await commands.targetCommand.startListening(); + const { targetFront } = commands.targetCommand; + + const willNavigate = once(targetFront, "will-navigate"); + const navigate = once(targetFront, "navigate"); SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => { content.location = "data:text/html,test navigation"; }); @@ -29,8 +36,10 @@ add_task(async function() { await navigate; ok(true, "navigate event received"); - const onTargetDestroyed = once(target, "target-destroyed"); + const onTargetDestroyed = once(targetFront, "target-destroyed"); gBrowser.removeCurrentTab(); await onTargetDestroyed; ok(true, "target destroyed received"); + + await commands.destroy(); }); diff --git a/devtools/client/framework/toolbox-options.js b/devtools/client/framework/toolbox-options.js index 474edf5162960..c0991c46a140c 100644 --- a/devtools/client/framework/toolbox-options.js +++ b/devtools/client/framework/toolbox-options.js @@ -358,7 +358,8 @@ OptionsPanel.prototype = { visibilityswitch: pref, // Only local tabs are currently supported as targets. - isToolSupported: toolbox => toolbox.target.isLocalTab, + isToolSupported: toolbox => + toolbox.commands.descriptorFront.isLocalTab, }) ); } diff --git a/devtools/client/fronts/descriptors/tab.js b/devtools/client/fronts/descriptors/tab.js index 0a1d9c254dc62..c3bbc066491fb 100644 --- a/devtools/client/fronts/descriptors/tab.js +++ b/devtools/client/fronts/descriptors/tab.js @@ -249,7 +249,6 @@ class TabDescriptorFront extends DescriptorMixin( this._targetFront.off("target-destroyed", this._onTargetDestroyed); } this._targetFront = targetFront; - targetFront.setDescriptor(this); targetFront.on("target-destroyed", this._onTargetDestroyed); diff --git a/devtools/client/fronts/targets/target-mixin.js b/devtools/client/fronts/targets/target-mixin.js index 8db2929e01497..57938cac58ec6 100644 --- a/devtools/client/fronts/targets/target-mixin.js +++ b/devtools/client/fronts/targets/target-mixin.js @@ -120,42 +120,6 @@ function TargetMixin(parentClass) { return true; } - /** - * Get the descriptor front for this target. - * - * TODO: Should be removed. This is misleading as only the top level target should have a descriptor. - * This will return null for targets created by the Watcher actor and will still be defined - * by targets created by RootActor methods (listSomething methods). - */ - get descriptorFront() { - if (this.isDestroyed()) { - throw new Error("Descriptor already destroyed for target: " + this); - } - - if (this.isWorkerTarget) { - return this; - } - - if (this._descriptorFront) { - return this._descriptorFront; - } - - if (this.parentFront.typeName.endsWith("Descriptor")) { - return this.parentFront; - } - throw new Error("Missing descriptor for target: " + this); - } - - /** - * Top-level targets created on the server will not be created and managed - * by a descriptor front. Instead they are created by the Watcher actor. - * On the client side we manually re-establish a link between the descriptor - * and the new top-level target. - */ - setDescriptor(descriptorFront) { - this._descriptorFront = descriptorFront; - } - get targetType() { return this._targetType; } @@ -272,24 +236,6 @@ function TargetMixin(parentClass) { return this.client.traits[traitName]; } - get isLocalTab() { - // Worker Target is also the Descriptor, - // so avoid infinite loop. - if (this.isWorkerTarget) { - return false; - } - return !!this.descriptorFront?.isLocalTab; - } - - get localTab() { - // Worker Target is also the Descriptor, - // so avoid infinite loop. - if (this.isWorkerTarget) { - return null; - } - return this.descriptorFront?.localTab || null; - } - // Get a promise of the RootActor's form get root() { return this.client.mainRoot.rootForm; diff --git a/devtools/client/inspector/test/browser_inspector_initialization.js b/devtools/client/inspector/test/browser_inspector_initialization.js index 81c174a07fd0d..efbe88e44ee8a 100644 --- a/devtools/client/inspector/test/browser_inspector_initialization.js +++ b/devtools/client/inspector/test/browser_inspector_initialization.js @@ -38,7 +38,6 @@ async function testToolboxInitialization(tab) { ok(true, "Inspector started, and notification received."); ok(inspector, "Inspector instance is accessible."); - is(inspector.currentTarget.localTab, tab, "Valid target."); await selectNode("p", inspector); await testMarkupView("p", inspector); diff --git a/devtools/client/inspector/test/browser_inspector_pseudoclass-lock.js b/devtools/client/inspector/test/browser_inspector_pseudoclass-lock.js index fd5b25c30f462..d94230a984c24 100644 --- a/devtools/client/inspector/test/browser_inspector_pseudoclass-lock.js +++ b/devtools/client/inspector/test/browser_inspector_pseudoclass-lock.js @@ -20,9 +20,12 @@ const TEST_URL = add_task(async function() { info("Creating the test tab and opening the rule-view"); - let { toolbox, inspector, highlighterTestFront } = await openInspectorForURL( - TEST_URL - ); + let { + tab, + toolbox, + inspector, + highlighterTestFront, + } = await openInspectorForURL(TEST_URL); info("Selecting the ruleview sidebar"); inspector.sidebar.select("ruleview"); @@ -80,7 +83,6 @@ add_task(async function() { ); info("Destroying the toolbox"); - const tab = toolbox.target.localTab; await toolbox.destroy(); // As the toolbox get destroyed, we need to fetch a new test-actor diff --git a/devtools/client/inspector/test/browser_inspector_reload_xul.js b/devtools/client/inspector/test/browser_inspector_reload_xul.js index 5245797dd930f..013c0543aab8f 100644 --- a/devtools/client/inspector/test/browser_inspector_reload_xul.js +++ b/devtools/client/inspector/test/browser_inspector_reload_xul.js @@ -17,7 +17,6 @@ add_task(async function() { async function testToolboxInitialization(tab, inspector, toolbox) { ok(true, "Inspector started, and notification received."); ok(inspector, "Inspector instance is accessible."); - is(inspector.currentTarget.localTab, tab, "Valid target."); await selectNode("#p", inspector); await testMarkupView("#p", inspector); diff --git a/devtools/client/netmonitor/test/head.js b/devtools/client/netmonitor/test/head.js index a03bb617e837f..563bd617da7fb 100644 --- a/devtools/client/netmonitor/test/head.js +++ b/devtools/client/netmonitor/test/head.js @@ -363,7 +363,7 @@ function restartNetMonitor(monitor, { requestCount }) { info("Restarting the specified network monitor."); return (async function() { - const tab = monitor.toolbox.target.localTab; + const tab = monitor.commands.descriptorFront.localTab; const url = tab.linkedBrowser.currentURI.spec; await waitForAllNetworkUpdateEvents(); diff --git a/devtools/client/styleeditor/StyleEditorUI.sys.mjs b/devtools/client/styleeditor/StyleEditorUI.sys.mjs index 3337e1e980f36..02dd6b7d6b212 100644 --- a/devtools/client/styleeditor/StyleEditorUI.sys.mjs +++ b/devtools/client/styleeditor/StyleEditorUI.sys.mjs @@ -1446,8 +1446,8 @@ export class StyleEditorUI extends EventEmitter { * Object with width or/and height properties. */ async #launchResponsiveMode(options = {}) { - const tab = this.currentTarget.localTab; - const win = this.currentTarget.localTab.ownerDocument.defaultView; + const tab = this.#commands.descriptorFront.localTab; + const win = tab.ownerDocument.defaultView; await lazy.ResponsiveUIManager.openIfNeeded(win, tab, { trigger: "style_editor", diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_multiple_windows_and_tabs.js b/devtools/client/webconsole/test/browser/browser_webconsole_multiple_windows_and_tabs.js index 7048e4529e81f..ea7f332e51a18 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_multiple_windows_and_tabs.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_multiple_windows_and_tabs.js @@ -37,7 +37,7 @@ add_task(async function() { for (const tab of tabs) { // Open the console in tab${i}. const hud = await openConsole(tab); - const browser = hud.currentTarget.localTab.linkedBrowser; + const browser = hud.commands.descriptorFront.localTab.linkedBrowser; const message = "message for tab " + tabs.indexOf(tab); // Log a message in the newly opened console. diff --git a/devtools/docs/user/devtoolsapi/index.rst b/devtools/docs/user/devtoolsapi/index.rst index 8d86db110d002..f1673e212873e 100644 --- a/devtools/docs/user/devtoolsapi/index.rst +++ b/devtools/docs/user/devtoolsapi/index.rst @@ -764,7 +764,7 @@ Register a tool }, isToolSupported: function(toolbox) { - return toolbox.target.isLocalTab; + return toolbox.commands.descriptorFront.isLocalTab; }, build: function(iframeWindow, toolbox, node) { diff --git a/toolkit/components/extensions/ExtensionParent.jsm b/toolkit/components/extensions/ExtensionParent.jsm index 98da1f3705499..3d174849873bb 100644 --- a/toolkit/components/extensions/ExtensionParent.jsm +++ b/toolkit/components/extensions/ExtensionParent.jsm @@ -881,9 +881,8 @@ class DevToolsExtensionPageContextParent extends ExtensionPageContextParent { for (const resource of resources) { const { targetFront } = resource; if (targetFront.isTopLevel && resource.name === "dom-complete") { - const url = targetFront.localTab.linkedBrowser.currentURI.spec; for (const listener of this._onNavigatedListeners) { - listener(url); + listener(targetFront.url); } } }