notificationDaemon: Work around JS interpreter bug

The "id" variable was being sporadically reset to null, and as far as
Florian and I could determine, this is actually a Spidermonkey bug.

The issue has something to do with:

1) use of "let" for the variable
2) Nesting a dynamic closure inside of a for() loop

Work around it here for now - I tried to create a minimized test case
to hand to the Spidermonkey developers, but failed.  A big part of
the problem is it's only sporadically reproducible.
This commit is contained in:
Colin Walters 2011-08-25 09:20:00 -04:00
parent ca2678446d
commit b76efe17d6

View File

@ -305,7 +305,7 @@ NotificationDaemon.prototype = {
ndata.notification = notification; ndata.notification = notification;
notification.connect('destroy', Lang.bind(this, notification.connect('destroy', Lang.bind(this,
function(n, reason) { function(n, reason) {
delete this._notifications[id]; delete this._notifications[ndata.id];
let notificationClosedReason; let notificationClosedReason;
switch (reason) { switch (reason) {
case MessageTray.NotificationDestroyedReason.EXPIRED: case MessageTray.NotificationDestroyedReason.EXPIRED:
@ -318,11 +318,11 @@ NotificationDaemon.prototype = {
notificationClosedReason = NotificationClosedReason.APP_CLOSED; notificationClosedReason = NotificationClosedReason.APP_CLOSED;
break; break;
} }
this._emitNotificationClosed(id, notificationClosedReason); this._emitNotificationClosed(ndata.id, notificationClosedReason);
})); }));
notification.connect('action-invoked', Lang.bind(this, notification.connect('action-invoked', Lang.bind(this,
function(n, actionId) { function(n, actionId) {
this._emitActionInvoked(id, actionId); this._emitActionInvoked(ndata.id, actionId);
})); }));
} else { } else {
notification.update(summary, body, { icon: iconActor, notification.update(summary, body, { icon: iconActor,
@ -336,7 +336,7 @@ NotificationDaemon.prototype = {
if (actions[i] == 'default') if (actions[i] == 'default')
notification.connect('clicked', Lang.bind(this, notification.connect('clicked', Lang.bind(this,
function() { function() {
this._emitActionInvoked(id, "default"); this._emitActionInvoked(ndata.id, "default");
})); }));
else else
notification.addButton(actions[i], actions[i + 1]); notification.addButton(actions[i], actions[i + 1]);