/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; this.EXPORTED_SYMBOLS = ["RecentWindow"]; const Cu = Components.utils; Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/PrivateBrowsingUtils.jsm"); #ifndef XP_WIN #define BROKEN_WM_Z_ORDER #endif this.RecentWindow = { /* * Get the most recent browser window. * * @param aOptions an object accepting the arguments for the search. * * private: true to restrict the search to private windows * only, false to restrict the search to non-private only. * Omit the property to search in both groups. * * allowPopups: true if popup windows are permissable. */ getMostRecentBrowserWindow: function RW_getMostRecentBrowserWindow(aOptions) { let checkPrivacy = typeof aOptions == "object" && "private" in aOptions; let allowPopups = typeof aOptions == "object" && !!aOptions.allowPopups; function isSuitableBrowserWindow(win) { return (!win.closed && (allowPopups || win.toolbar.visible) && (!checkPrivacy || PrivateBrowsingUtils.permanentPrivateBrowsing || PrivateBrowsingUtils.isWindowPrivate(win) == aOptions.private)); } #ifdef BROKEN_WM_Z_ORDER let win = Services.wm.getMostRecentWindow("navigator:browser"); // if we're lucky, this isn't a popup, and we can just return this if (win && !isSuitableBrowserWindow(win)) { win = null; let windowList = Services.wm.getEnumerator("navigator:browser"); // this is oldest to newest, so this gets a bit ugly while (windowList.hasMoreElements()) { let nextWin = windowList.getNext(); if (isSuitableBrowserWindow(nextWin)) win = nextWin; } } return win; #else let windowList = Services.wm.getZOrderDOMWindowEnumerator("navigator:browser", true); while (windowList.hasMoreElements()) { let win = windowList.getNext(); if (isSuitableBrowserWindow(win)) return win; } return null; #endif } };