Bug 1341361 - reattach listChanged evts in root actor earlier to avoid missing updates;r=jryans draft
authorJulian Descottes <jdescottes@mozilla.com>
Thu, 09 Feb 2017 22:11:01 +0100
changeset 490971 34aecc24b389d34bd088445f58f9f55aec074245
parent 490969 33c9d4c02376826733a4a35687e1e8be21b58f4d
child 547435 b1afe5203f11853cf854d7869e2d2b3b5c6317d3
push id47289
push userjdescottes@mozilla.com
push dateWed, 01 Mar 2017 16:45:02 +0000
reviewersjryans
bugs1341361
milestone54.0a1
Bug 1341361 - reattach listChanged evts in root actor earlier to avoid missing updates;r=jryans The root actor listens to list changes for tabs, addons, workers and service workers. The event listener used for each of these lists was attached too late and could miss updates. This was fixed earlier for tabs to fix an intermittent. This patch applies the same change to addons workers and serviceworkers. MozReview-Commit-ID: K4gKwK9U6Vh
devtools/server/actors/root.js
--- a/devtools/server/actors/root.js
+++ b/devtools/server/actors/root.js
@@ -385,30 +385,31 @@ RootActor.prototype = {
 
   onListAddons: function () {
     let addonList = this._parameters.addonList;
     if (!addonList) {
       return { from: this.actorID, error: "noAddons",
                message: "This root actor has no browser addons." };
     }
 
+    // Reattach the onListChanged listener now that a client requested the list.
+    addonList.onListChanged = this._onAddonListChanged;
+
     return addonList.getList().then((addonActors) => {
       let addonActorPool = new ActorPool(this.conn);
       for (let addonActor of addonActors) {
         addonActorPool.addActor(addonActor);
       }
 
       if (this._addonActorPool) {
         this.conn.removeActorPool(this._addonActorPool);
       }
       this._addonActorPool = addonActorPool;
       this.conn.addActorPool(this._addonActorPool);
 
-      addonList.onListChanged = this._onAddonListChanged;
-
       return {
         "from": this.actorID,
         "addons": addonActors.map(addonActor => addonActor.form())
       };
     });
   },
 
   onAddonListChanged: function () {
@@ -418,28 +419,29 @@ RootActor.prototype = {
 
   onListWorkers: function () {
     let workerList = this._parameters.workerList;
     if (!workerList) {
       return { from: this.actorID, error: "noWorkers",
                message: "This root actor has no workers." };
     }
 
+    // Reattach the onListChanged listener now that a client requested the list.
+    workerList.onListChanged = this._onWorkerListChanged;
+
     return workerList.getList().then(actors => {
       let pool = new ActorPool(this.conn);
       for (let actor of actors) {
         pool.addActor(actor);
       }
 
       this.conn.removeActorPool(this._workerActorPool);
       this._workerActorPool = pool;
       this.conn.addActorPool(this._workerActorPool);
 
-      workerList.onListChanged = this._onWorkerListChanged;
-
       return {
         "from": this.actorID,
         "workers": actors.map(actor => actor.form())
       };
     });
   },
 
   onWorkerListChanged: function () {
@@ -449,28 +451,29 @@ RootActor.prototype = {
 
   onListServiceWorkerRegistrations: function () {
     let registrationList = this._parameters.serviceWorkerRegistrationList;
     if (!registrationList) {
       return { from: this.actorID, error: "noServiceWorkerRegistrations",
                message: "This root actor has no service worker registrations." };
     }
 
+    // Reattach the onListChanged listener now that a client requested the list.
+    registrationList.onListChanged = this._onServiceWorkerRegistrationListChanged;
+
     return registrationList.getList().then(actors => {
       let pool = new ActorPool(this.conn);
       for (let actor of actors) {
         pool.addActor(actor);
       }
 
       this.conn.removeActorPool(this._serviceWorkerRegistrationActorPool);
       this._serviceWorkerRegistrationActorPool = pool;
       this.conn.addActorPool(this._serviceWorkerRegistrationActorPool);
 
-      registrationList.onListChanged = this._onServiceWorkerRegistrationListChanged;
-
       return {
         "from": this.actorID,
         "registrations": actors.map(actor => actor.form())
       };
     });
   },
 
   onServiceWorkerRegistrationListChanged: function () {