From 3eb564654ac68c9f57dd4ce7468236dcfbf2c0f5 Mon Sep 17 00:00:00 2001 From: Alexandre Poirot Date: Mon, 21 Oct 2013 10:35:00 +0100 Subject: [PATCH] Bug 918695 - Only instanciate one singleton target per app r=paul --- toolkit/devtools/apps/app-actor-front.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/toolkit/devtools/apps/app-actor-front.js b/toolkit/devtools/apps/app-actor-front.js index 30bbb08ec86..2024a6c3f1e 100644 --- a/toolkit/devtools/apps/app-actor-front.js +++ b/toolkit/devtools/apps/app-actor-front.js @@ -15,6 +15,8 @@ const PR_TRUNCATE = 0x20; const CHUNK_SIZE = 10000; +const appTargets = new Map(); + function addDirToZip(writer, dir, basePath) { let files = dir.directoryEntries; @@ -212,6 +214,13 @@ function installHosted(client, webappsActor, appId, metadata, manifest) { exports.installHosted = installHosted; function getTargetForApp(client, webappsActor, manifestURL) { + // Ensure always returning the exact same JS object for a target + // of the same app in order to show only one toolbox per app and + // avoid re-creating lot of objects twice. + let existingTarget = appTargets.get(manifestURL); + if (existingTarget) + return promise.resolve(existingTarget); + let deferred = promise.defer(); let request = { to: webappsActor, @@ -230,6 +239,10 @@ function getTargetForApp(client, webappsActor, manifestURL) { devtools.TargetFactory.forRemoteTab(options).then((target) => { target.isApp = true; + appTargets.set(manifestURL, target); + target.on("close", () => { + appTargets.delete(manifestURL); + }); deferred.resolve(target) }, (error) => { deferred.reject(error);