Bug 791911 - Listen for our child message managers dying and remove them from our list of managers to 'broadcast' to. r=gwagner

--HG--
extra : rebase_source : 407eb90d797c410db1a80a59ca2e52b42b68af87
This commit is contained in:
Blake Kaplan 2012-10-02 17:24:53 -04:00
parent 068ee6378f
commit a2b7792d24
2 changed files with 23 additions and 39 deletions

View File

@ -112,8 +112,6 @@ DOMWifiManager.prototype = {
this._onConnectionInfoUpdate = null; this._onConnectionInfoUpdate = null;
this._onEnabled = null; this._onEnabled = null;
this._onDisabled = null; this._onDisabled = null;
this._mm.sendAsyncMessage("WifiManager:managerFinished");
}, },
_sendMessageForRequest: function(name, data, request) { _sendMessageForRequest: function(name, data, request) {

View File

@ -1385,7 +1385,7 @@ function WifiWorker() {
"WifiManager:associate", "WifiManager:forget", "WifiManager:associate", "WifiManager:forget",
"WifiManager:wps", "WifiManager:getState", "WifiManager:wps", "WifiManager:getState",
"WifiManager:setPowerSavingMode", "WifiManager:setPowerSavingMode",
"WifiManager:managerFinished"]; "child-process-shutdown"];
messages.forEach((function(msgName) { messages.forEach((function(msgName) {
this._mm.addMessageListener(msgName, this); this._mm.addMessageListener(msgName, this);
@ -1996,15 +1996,10 @@ WifiWorker.prototype = {
_domManagers: [], _domManagers: [],
_fireEvent: function(message, data) { _fireEvent: function(message, data) {
// TODO (bug 791911): Managers don't correctly tell us when they're getting this._domManagers.forEach(function(manager) {
// destroyed, so prune dead managers here. // Note: We should never have a dead message manager here because we
this._domManagers = this._domManagers.filter(function(obj) { // observe our child message managers shutting down, below.
try { manager.sendAsyncMessage("WifiManager:" + message, data);
obj.manager.sendAsyncMessage("WifiManager:" + message, data);
return true;
} catch(e) {
return false;
}
}); });
}, },
@ -2014,12 +2009,24 @@ WifiWorker.prototype = {
}, },
receiveMessage: function MessageManager_receiveMessage(aMessage) { receiveMessage: function MessageManager_receiveMessage(aMessage) {
if (!aMessage.target.assertPermission("wifi-manage")) { let msg = aMessage.data || {};
msg.manager = aMessage.target;
// Note: By the time we receive child-process-shutdown, the child process
// has already forgotten its permissions so we do this before the
// permissions check.
if (aMessage.name === "child-process-shutdown") {
let i;
if ((i = this._domManagers.indexOf(msg.manager)) != -1) {
this._domManagers.splice(i, 1);
}
return; return;
} }
let msg = aMessage.json || {}; if (!aMessage.target.assertPermission("wifi-manage")) {
msg.manager = aMessage.target; return;
}
switch (aMessage.name) { switch (aMessage.name) {
case "WifiManager:getNetworks": case "WifiManager:getNetworks":
@ -2041,39 +2048,18 @@ WifiWorker.prototype = {
this.setPowerSavingMode(msg); this.setPowerSavingMode(msg);
break; break;
case "WifiManager:getState": { case "WifiManager:getState": {
let net = this.currentNetwork ? netToDOM(this.currentNetwork) : null;
let i; let i;
for (i = 0; i < this._domManagers.length; ++i) { if ((i = this._domManagers.indexOf(msg.manager)) === -1) {
let obj = this._domManagers[i]; this._domManagers.push(msg.manager);
if (obj.manager === msg.manager) {
obj.count++;
break;
}
}
if (i === this._domManagers.length) {
this._domManagers.push({ manager: msg.manager, count: 1 });
} }
let net = this.currentNetwork ? netToDOM(this.currentNetwork) : null;
return { network: net, return { network: net,
connectionInfo: this._lastConnectionInfo, connectionInfo: this._lastConnectionInfo,
enabled: WifiManager.enabled, enabled: WifiManager.enabled,
status: translateState(WifiManager.state), status: translateState(WifiManager.state),
macAddress: this.macAddress }; macAddress: this.macAddress };
} }
case "WifiManager:managerFinished": {
for (let i = 0; i < this._domManagers.length; ++i) {
let obj = this._domManagers[i];
if (obj.manager === msg.manager) {
if (--obj.count === 0) {
this._domManagers.splice(i, 1);
}
break;
}
}
break;
}
} }
}, },