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
--- 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 () {