From 17938124b02201a9139be8254e5d06bef34aaf27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Tue, 7 Jan 2020 12:12:09 +0000 Subject: [PATCH] Bug 1600263 - Switch the Application panel to use the new TargetList API r=jdescottes Differential Revision: https://phabricator.services.mozilla.com/D57139 --HG-- extra : moz-landing-system : lando --- devtools/client/application/initializer.js | 63 ++++++++++++++++++---- 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/devtools/client/application/initializer.js b/devtools/client/application/initializer.js index 63dbc625673e..3334417d89b7 100644 --- a/devtools/client/application/initializer.js +++ b/devtools/client/application/initializer.js @@ -44,26 +44,31 @@ const App = createFactory( */ window.Application = { async bootstrap({ toolbox, panel }) { + // bind event handlers to `this` this.handleOnNavigate = this.handleOnNavigate.bind(this); this.updateWorkers = this.updateWorkers.bind(this); this.updateDomain = this.updateDomain.bind(this); this.updateCanDebugWorkers = this.updateCanDebugWorkers.bind(this); + this.onTargetAvailable = this.onTargetAvailable.bind(this); + this.onTargetDestroyed = this.onTargetDestroyed.bind(this); - this.mount = document.querySelector("#mount"); this.toolbox = toolbox; + // NOTE: the client is the same through the lifecycle of the toolbox, even + // though we get it from toolbox.target this.client = toolbox.target.client; this.store = configureStore(); this.actions = bindActionCreators(actions, this.store.dispatch); services.init(this.toolbox); + await l10n.init(["devtools/application.ftl"]); - this.deviceFront = await this.client.mainRoot.getFront("device"); - + await this.updateWorkers(); this.workersListener = new WorkersListener(this.client.mainRoot); this.workersListener.addListener(this.updateWorkers); - this.toolbox.target.on("navigate", this.handleOnNavigate); + this.deviceFront = await this.client.mainRoot.getFront("device"); + await this.updateCanDebugWorkers(); if (this.deviceFront) { this.canDebugWorkersListener = this.deviceFront.on( "can-debug-sw-updated", @@ -71,14 +76,16 @@ window.Application = { ); } - // start up updates for the initial state - this.updateDomain(); - await this.updateCanDebugWorkers(); - await this.updateWorkers(); - - await l10n.init(["devtools/application.ftl"]); + // awaiting for watchTargets will return the targets that are currently + // available, so we can have our first render with all the data ready + await this.toolbox.targetList.watchTargets( + [this.toolbox.targetList.TYPES.FRAME], + this.onTargetAvailable, + this.onTargetDestroyed + ); // Render the root Application component. + this.mount = document.querySelector("#mount"); const app = App({ client: this.client, fluentBundles: l10n.getBundles(), @@ -114,16 +121,50 @@ window.Application = { ); }, + setupTarget(targetFront) { + this.handleOnNavigate(); // update domain and manifest for the new target + targetFront.on("navigate", this.handleOnNavigate); + }, + + cleanUpTarget(targetFront) { + targetFront.off("navigate", this.handleOnNavigate); + }, + + onTargetAvailable({ targetFront, isTopLevel }) { + if (!isTopLevel) { + return; // ignore target frames that are not top level for now + } + + this.setupTarget(targetFront); + }, + + onTargetDestroyed({ targetFront, isTopLevel }) { + if (!isTopLevel) { + return; // ignore target frames that are not top level for now + } + + this.cleanUpTarget(targetFront); + }, + destroy() { this.workersListener.removeListener(); if (this.deviceFront) { this.deviceFront.off("can-debug-sw-updated", this.updateCanDebugWorkers); } - this.toolbox.target.off("navigate", this.updateDomain); + + this.toolbox.targetList.unwatchTargets( + [this.toolbox.targetList.TYPES.FRAME], + this.onTargetAvailable, + this.onTargetDestroyed + ); + + this.cleanUpTarget(this.toolbox.target); unmountComponentAtNode(this.mount); this.mount = null; this.toolbox = null; this.client = null; + this.workersListener = null; + this.deviceFront = null; }, };