From d047441e4db7ff70de662c1ca104252821e02259 Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Wed, 5 Dec 2012 20:59:26 -0500 Subject: [PATCH] Bug 817337 - Add a JS module to get the most recent browser window, with the option of restricting the search to include only private windows; r=dao --- browser/components/nsBrowserGlue.js | 37 ++-------------- browser/modules/Makefile.in | 4 +- browser/modules/RecentWindow.jsm | 65 +++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 34 deletions(-) create mode 100644 browser/modules/RecentWindow.jsm diff --git a/browser/components/nsBrowserGlue.js b/browser/components/nsBrowserGlue.js index 6de45d8fed7b..f1cac7339ae4 100644 --- a/browser/components/nsBrowserGlue.js +++ b/browser/components/nsBrowserGlue.js @@ -53,6 +53,9 @@ XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils", XPCOMUtils.defineLazyModuleGetter(this, "KeywordURLResetPrompter", "resource:///modules/KeywordURLResetPrompter.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "RecentWindow", + "resource:///modules/RecentWindow.jsm"); + const PREF_PLUGINS_NOTIFYUSER = "plugins.update.notifyUser"; const PREF_PLUGINS_UPDATEURL = "plugins.update.url"; @@ -1584,41 +1587,9 @@ BrowserGlue.prototype = { } }, -#ifndef XP_WIN -#define BROKEN_WM_Z_ORDER -#endif - // this returns the most recent non-popup browser window getMostRecentBrowserWindow: function BG_getMostRecentBrowserWindow() { - function isFullBrowserWindow(win) { - return !win.closed && - win.toolbar.visible; - } - -#ifdef BROKEN_WM_Z_ORDER - var win = Services.wm.getMostRecentWindow("navigator:browser"); - - // if we're lucky, this isn't a popup, and we can just return this - if (win && !isFullBrowserWindow(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 (isFullBrowserWindow(nextWin)) - win = nextWin; - } - } - return win; -#else - var windowList = Services.wm.getZOrderDOMWindowEnumerator("navigator:browser", true); - while (windowList.hasMoreElements()) { - let win = windowList.getNext(); - if (isFullBrowserWindow(win)) - return win; - } - return null; -#endif + return RecentWindow.getMostRecentBrowserWindow(); }, #ifdef MOZ_SERVICES_SYNC diff --git a/browser/modules/Makefile.in b/browser/modules/Makefile.in index edd840e0ee43..5f16d63dd327 100644 --- a/browser/modules/Makefile.in +++ b/browser/modules/Makefile.in @@ -28,11 +28,13 @@ EXTRA_JS_MODULES = \ KeywordURLResetPrompter.jsm \ $(NULL) +EXTRA_PP_JS_MODULES = RecentWindow.jsm + ifeq ($(MOZ_WIDGET_TOOLKIT),windows) EXTRA_JS_MODULES += \ WindowsPreviewPerTab.jsm \ $(NULL) -EXTRA_PP_JS_MODULES = \ +EXTRA_PP_JS_MODULES += \ WindowsJumpLists.jsm \ $(NULL) endif diff --git a/browser/modules/RecentWindow.jsm b/browser/modules/RecentWindow.jsm new file mode 100644 index 000000000000..6bddd93e1511 --- /dev/null +++ b/browser/modules/RecentWindow.jsm @@ -0,0 +1,65 @@ +/* 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. + * Set the private property to true in order to restrict the + * search to private windows only, or to false in order to + * restrict the search to non-private windows only. To search + * in both groups, don't specify the private property. + */ + getMostRecentBrowserWindow: function RW_getMostRecentBrowserWindow(aOptions) { + let checkPrivacy = typeof aOptions == "object" && + "private" in aOptions; + + function isSuitableBrowserWindow(win) { + return (!win.closed && + win.toolbar.visible && + (!checkPrivacy || + 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 + } +}; +