From a7c753e5b3034b6050604b5b20bbe931af41e6a3 Mon Sep 17 00:00:00 2001 From: foudfou Date: Sun, 10 Mar 2013 17:29:32 +0100 Subject: [PATCH] keep long living references to timers --- src/modules/FiretrayHandler.jsm | 67 +++++++++++++++++-------------- src/modules/FiretrayMessaging.jsm | 1 - src/modules/commons.js | 5 +++ 3 files changed, 41 insertions(+), 32 deletions(-) diff --git a/src/modules/FiretrayHandler.jsm b/src/modules/FiretrayHandler.jsm index b6f2ce4..dd36bb9 100644 --- a/src/modules/FiretrayHandler.jsm +++ b/src/modules/FiretrayHandler.jsm @@ -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}); + }); } }, diff --git a/src/modules/FiretrayMessaging.jsm b/src/modules/FiretrayMessaging.jsm index 5ee47a1..a1d3ee1 100644 --- a/src/modules/FiretrayMessaging.jsm +++ b/src/modules/FiretrayMessaging.jsm @@ -27,7 +27,6 @@ let log = firetray.Logging.getLogger("firetray.Messaging"); firetray.Messaging = { initialized: false, - cleaningTimer: null, currentMsgCount: null, newMsgCount: null, observedTopics: {}, diff --git a/src/modules/commons.js b/src/modules/commons.js index c0637c7..07b939a 100644 --- a/src/modules/commons.js +++ b/src/modules/commons.js @@ -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 },