From 23a6fab072a5e8f60ed6d722c2940e7d65d9cd09 Mon Sep 17 00:00:00 2001 From: "jminta%gmail.com" Date: Thu, 10 Aug 2006 00:30:24 +0000 Subject: [PATCH] Bug 343246 Quickly fired alarms don't always appear in the same window 1r=lilmatt, 2r=dmose --- .../components/lightningAlarmMonitor.js | 16 ++++++++-- calendar/resources/content/calAlarmMonitor.js | 29 +++++++++++++------ 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/calendar/lightning/components/lightningAlarmMonitor.js b/calendar/lightning/components/lightningAlarmMonitor.js index df543d3aef9e..26291bbeb66e 100644 --- a/calendar/lightning/components/lightningAlarmMonitor.js +++ b/calendar/lightning/components/lightningAlarmMonitor.js @@ -43,25 +43,37 @@ function getAlarmService() } var alarmServiceObserver = { + // This is a work-around for the fact that there is a delay between when + // we call openWindow and when it appears via getMostRecentWindow. If an + // alarm is fired in that time-frame, it will actually end up in another window. + _WindowOpening: null, + onAlarm: function(event) { var wmediator = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(Components.interfaces.nsIWindowMediator); var calAlarmWindow = wmediator.getMostRecentWindow("calendarAlarmWindow"); - if (!calAlarmWindow) { + if (!calAlarmWindow && !this._WindowOpening) { var windowWatcher = Components.classes["@mozilla.org/embedcomp/window-watcher;1"].getService(CI.nsIWindowWatcher); - calAlarmWindow = windowWatcher.openWindow(null, + this._WindowOpening = windowWatcher.openWindow(null, "chrome://calendar/content/calendar-alarm-dialog.xul", "_blank", "chrome,dialog=yes,all", null); } + if (this._WindowOpening) { + calAlarmWindow = this._WindowOpening; + } if ("addAlarm" in calAlarmWindow) { calAlarmWindow.addAlarm(event); } else { + // The window isn't open yet + var alarmObserver = this; var addAlarm = function() { calAlarmWindow.addAlarm(event); + // Now the window is open + alarmObserver._WindowOpening = null; } calAlarmWindow.addEventListener("load", addAlarm, false); } diff --git a/calendar/resources/content/calAlarmMonitor.js b/calendar/resources/content/calAlarmMonitor.js index c2b15fd767f8..392008512cd8 100644 --- a/calendar/resources/content/calAlarmMonitor.js +++ b/calendar/resources/content/calAlarmMonitor.js @@ -44,6 +44,11 @@ function getAlarmService() } var alarmServiceObserver = { + // This is a work-around for the fact that there is a delay between when + // we call openWindow and when it appears via getMostRecentWindow. If an + // alarm is fired in that time-frame, it will actually end up in another window. + _WindowOpening: null, + onAlarm: function( event ) { //If an event has alarm email address, we assume the alarm is of email @@ -68,26 +73,32 @@ var alarmServiceObserver = { var wMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(Components.interfaces.nsIWindowMediator); - var gAlarmWindow = wMediator.getMostRecentWindow("calendarAlarmWindow"); - if( !gAlarmWindow ) { + var openAlarmWindow = wMediator.getMostRecentWindow("calendarAlarmWindow"); + if(!openAlarmWindow && !this._WindowOpening) { var wWatcher = Components.classes["@mozilla.org/embedcomp/window-watcher;1"] .getService(Components.interfaces.nsIWindowWatcher); - gAlarmWindow = wWatcher.openWindow(null, + this._WindowOpening = wWatcher.openWindow(null, "chrome://calendar/content/calendar-alarm-dialog.xul", "_blank", "chrome,dialog=yes,all", null); - } - gAlarmWindow.focus(); - if ("addAlarm" in gAlarmWindow) { - gAlarmWindow.addAlarm(event); + if (this._WindowOpening) { + openAlarmWindow = this._WindowOpening; + } + openAlarmWindow.focus(); + if ("addAlarm" in openAlarmWindow) { + openAlarmWindow.addAlarm(event); } else { + // The window isn't open yet + var alarmObserver = this; var addAlarm = function() { - gAlarmWindow.addAlarm( event ); + openAlarmWindow.addAlarm( event ); + // Now the window is open + alarmObserver._WindowOpening = null; } - gAlarmWindow.addEventListener("load", addAlarm, false); + openAlarmWindow.addEventListener("load", addAlarm, false); } } };