keep long living references to timers

This commit is contained in:
foudfou 2013-03-10 17:29:32 +01:00
parent b8b3b838cb
commit a7c753e5b3
3 changed files with 41 additions and 32 deletions

View File

@ -31,6 +31,7 @@ let log = firetray.Logging.getLogger("firetray.Handler");
firetray.Handler = {
initialized: false,
timers: {},
inBrowserApp: false,
inMailApp: false,
appHasChat: false,
@ -106,7 +107,9 @@ firetray.Handler = {
}
}
if (this.isChatEnabled()) {
let chatIsEnabled = this.isChatEnabled();
log.info('isChatEnabled='+chatIsEnabled);
if (chatIsEnabled) {
Cu.import("resource://firetray/FiretrayMessaging.jsm"); // needed for existsChatAccount
Cu.import("resource://firetray/FiretrayChat.jsm");
firetray.Utils.addObservers(firetray.Handler, [
@ -145,11 +148,9 @@ firetray.Handler = {
},
isChatEnabled: function() {
let chatIsEnabled = (this.appHasChat &&
Services.prefs.getBoolPref("mail.chat.enabled") &&
firetray.Utils.prefService.getBoolPref("chat_icon_enable"));
log.info('isChatEnabled='+chatIsEnabled);
return chatIsEnabled;
return this.appHasChat &&
Services.prefs.getBoolPref("mail.chat.enabled") &&
firetray.Utils.prefService.getBoolPref("chat_icon_enable");
},
tryCloseLibs: function() {
@ -192,16 +193,17 @@ firetray.Handler = {
case "before-first-paint":
log.debug("before-first-paint: "+subject.baseURI);
firetray.Utils.removeObservers(firetray.Handler, [ "before-first-paint" ]);
firetray.Utils.timer(FIRETRAY_DELAY_BROWSER_STARTUP_MILLISECONDS,
Ci.nsITimer.TYPE_ONE_SHOT, function() {
if (firetray.Utils.prefService.getBoolPref('start_hidden')) {
log.debug("start_hidden");
firetray.Handler.hideAllWindows();
}
firetray.Handler.timers['before-first-paint'] =
firetray.Utils.timer(FIRETRAY_DELAY_BROWSER_STARTUP_MILLISECONDS,
Ci.nsITimer.TYPE_ONE_SHOT, function() {
if (firetray.Utils.prefService.getBoolPref('start_hidden')) {
log.debug("start_hidden");
firetray.Handler.hideAllWindows();
}
firetray.Handler.appStarted = true;
log.debug("*** appStarted ***");
});
firetray.Handler.appStarted = true;
log.debug("*** appStarted ***");
});
break;
case "xpcom-will-shutdown":
@ -327,11 +329,12 @@ firetray.Handler = {
// FIXME: obviously we need to wait to avoid seg fault on jsapi.cpp:827
// 827 if (t->data.requestDepth) {
firetray.Utils.timer(FIRETRAY_DELAY_NOWAIT_MILLISECONDS,
Ci.nsITimer.TYPE_ONE_SHOT, function() {
for(var key in firetray.Handler.windows) break;
firetray.Handler.windows[key].chromeWin.open(home);
});
firetray.Handler.timers['open-browser-window'] =
firetray.Utils.timer(FIRETRAY_DELAY_NOWAIT_MILLISECONDS,
Ci.nsITimer.TYPE_ONE_SHOT, function() {
for(var key in firetray.Handler.windows) break;
firetray.Handler.windows[key].chromeWin.open(home);
});
} catch (x) { log.error(x); }
},
@ -346,12 +349,13 @@ firetray.Handler = {
quitApplication: function() {
try {
firetray.Utils.timer(FIRETRAY_DELAY_NOWAIT_MILLISECONDS,
Ci.nsITimer.TYPE_ONE_SHOT, function() {
let appStartup = Cc['@mozilla.org/toolkit/app-startup;1']
.getService(Ci.nsIAppStartup);
appStartup.quit(Ci.nsIAppStartup.eAttemptQuit);
});
firetray.Handler.timers['quit-application'] =
firetray.Utils.timer(FIRETRAY_DELAY_NOWAIT_MILLISECONDS,
Ci.nsITimer.TYPE_ONE_SHOT, function() {
let appStartup = Cc['@mozilla.org/toolkit/app-startup;1']
.getService(Ci.nsIAppStartup);
appStartup.quit(Ci.nsIAppStartup.eAttemptQuit);
});
} catch (x) { log.error(x); }
},
@ -467,11 +471,12 @@ firetray.VersionChangeHandler = {
}
if (tabmail) {
firetray.Utils.timer(FIRETRAY_DELAY_BROWSER_STARTUP_MILLISECONDS,
Ci.nsITimer.TYPE_ONE_SHOT, function() {
log.debug("openMailTab");
tabmail.openTab("contentTab", {contentPage: url});
});
firetray.Handler.timers['open-mail-tab'] =
firetray.Utils.timer(FIRETRAY_DELAY_BROWSER_STARTUP_MILLISECONDS,
Ci.nsITimer.TYPE_ONE_SHOT, function() {
log.debug("openMailTab");
tabmail.openTab("contentTab", {contentPage: url});
});
}
},

View File

@ -27,7 +27,6 @@ let log = firetray.Logging.getLogger("firetray.Messaging");
firetray.Messaging = {
initialized: false,
cleaningTimer: null,
currentMsgCount: null,
newMsgCount: null,
observedTopics: {},

View File

@ -225,6 +225,11 @@ firetray.Utils = {
return list;
},
/*
* keep a long-living reference to the returned timer, if you don't want to
* see it GC'ed ! see
* http://www.joshmatthews.net/blog/2011/03/nsitimer-anti-pattern/
*/
timer: function(delay, timerType, callback) {
var timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
timer.initWithCallback({ notify: callback },