Bug 528440 - Should skip windows that are closed but not yet destroyed when using nsIWindowMediator. r=zeniko

This commit is contained in:
Dão Gottwald 2009-11-13 18:06:44 +01:00
Родитель 50543d8818
Коммит c164850eaa
1 изменённых файлов: 33 добавлений и 4 удалений

Просмотреть файл

@ -110,6 +110,10 @@ const CAPABILITIES = [
"DNSPrefetch", "Auth" "DNSPrefetch", "Auth"
]; ];
#ifndef XP_WIN
#define BROKEN_WM_Z_ORDER
#endif
Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm");
function debug(aMsg) { function debug(aMsg) {
@ -2598,7 +2602,7 @@ SessionStoreService.prototype = {
while (windowsEnum.hasMoreElements()) { while (windowsEnum.hasMoreElements()) {
var window = windowsEnum.getNext(); var window = windowsEnum.getNext();
if (window.__SSi) { if (window.__SSi && !window.closed) {
aFunc.call(this, window); aFunc.call(this, window);
} }
} }
@ -2609,9 +2613,34 @@ SessionStoreService.prototype = {
* @returns Window reference * @returns Window reference
*/ */
_getMostRecentBrowserWindow: function sss_getMostRecentBrowserWindow() { _getMostRecentBrowserWindow: function sss_getMostRecentBrowserWindow() {
var windowMediator = Cc["@mozilla.org/appshell/window-mediator;1"]. var wm = Cc["@mozilla.org/appshell/window-mediator;1"].
getService(Ci.nsIWindowMediator); getService(Ci.nsIWindowMediator);
return windowMediator.getMostRecentWindow("navigator:browser");
var win = wm.getMostRecentWindow("navigator:browser");
if (!win)
return null;
if (!win.closed)
return win;
#ifdef BROKEN_WM_Z_ORDER
win = null;
var windowsEnum = wm.getEnumerator("navigator:browser");
// this is oldest to newest, so this gets a bit ugly
while (windowsEnum.hasMoreElements()) {
let nextWin = windowsEnum.getNext();
if (!nextWin.closed)
win = nextWin;
}
return win;
#else
var windowsEnum = wm.getZOrderDOMWindowEnumerator("navigator:browser", true);
while (windowsEnum.hasMoreElements()) {
win = windowsEnum.getNext();
if (!win.closed)
return win;
}
return null;
#endif
}, },
/** /**