Bug 565667 - 'Tools' > 'Add-ons' only works when browser window is in the foreground [r=dao, a=dietrich]
authorPaul O’Shannessy <paul@oshannessy.com>
Tue, 22 Feb 2011 11:02:22 -0800
changeset 62929 59beb0363569ebbce51350a82c82f2950c7e0773
parent 62928 7e2360c48bbac8ad5fd846e9ae9684d6f429318f
child 62930 88afdccd3ba6f404de469427675fe931610d6ab2
push id1
push userroot
push dateTue, 10 Dec 2013 15:46:25 +0000
reviewersdao, dietrich
bugs565667
milestone2.0b12pre
Bug 565667 - 'Tools' > 'Add-ons' only works when browser window is in the foreground [r=dao, a=dietrich]
browser/base/content/browser.js
browser/base/content/test/Makefile.in
browser/base/content/test/browser_bug565667.js
browser/base/content/utilityOverlay.js
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -8394,58 +8394,60 @@ var LightWeightThemeWebInstaller = {
 /**
  * Switch to a tab that has a given URI, and focusses its browser window.
  * If a matching tab is in this window, it will be switched to. Otherwise, other
  * windows will be searched.
  *
  * @param aURI
  *        URI to search for
  * @param aOpenNew
- *        True to open a new tab and switch to it, if no existing tab is found
+ *        True to open a new tab and switch to it, if no existing tab is found.
+ *        If no suitable window is found, a new one will be opened.
  * @return True if an existing tab was found, false otherwise
  */
 function switchToTabHavingURI(aURI, aOpenNew) {
+  // This will switch to the tab in aWindow having aURI, if present.
   function switchIfURIInWindow(aWindow) {
-    if (!("gBrowser" in aWindow))
-      return false;
     let browsers = aWindow.gBrowser.browsers;
     for (let i = 0; i < browsers.length; i++) {
       let browser = browsers[i];
       if (browser.currentURI.equals(aURI)) {
         // Focus the matching window & tab
         aWindow.focus();
         aWindow.gBrowser.tabContainer.selectedIndex = i;
         return true;
       }
     }
     return false;
   }
 
   // This can be passed either nsIURI or a string.
   if (!(aURI instanceof Ci.nsIURI))
-    aURI = makeURI(aURI);
+    aURI = Services.io.newURI(aURI, null, null);
+
+  let isBrowserWindow = !!window.gBrowser;
 
   // Prioritise this window.
-  if (switchIfURIInWindow(window))
+  if (isBrowserWindow && switchIfURIInWindow(window))
     return true;
 
   let winEnum = Services.wm.getEnumerator("navigator:browser");
   while (winEnum.hasMoreElements()) {
     let browserWin = winEnum.getNext();
     // Skip closed (but not yet destroyed) windows,
     // and the current window (which was checked earlier).
     if (browserWin.closed || browserWin == window)
       continue;
     if (switchIfURIInWindow(browserWin))
       return true;
   }
 
   // No opened tab has that url.
   if (aOpenNew) {
-    if (isTabEmpty(gBrowser.selectedTab))
+    if (isBrowserWindow && isTabEmpty(gBrowser.selectedTab))
       gBrowser.selectedBrowser.loadURI(aURI.spec);
     else
       openUILinkIn(aURI.spec, "tab");
   }
 
   return false;
 }
 
--- a/browser/base/content/test/Makefile.in
+++ b/browser/base/content/test/Makefile.in
@@ -253,16 +253,17 @@ endif
 #                 browser_popupUI.js \
 
 ifneq (cocoa,$(MOZ_WIDGET_TOOLKIT))
 _BROWSER_FILES += \
 		browser_bug462289.js \
 		$(NULL)
 else
 _BROWSER_FILES += \
+		browser_bug565667.js \
 		browser_customize.js \
 		$(NULL)
 
 # TODO: Activate after carbon test plugin lands, bug 628651
 # 		browser_maconly_carbon_mismatch_plugin.js \
 
 endif
 
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/browser_bug565667.js
@@ -0,0 +1,92 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is bug 565667 test.
+ *
+ * The Initial Developer of the Original Code is
+ * Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2010
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Paul O’Shannessy <paul@oshannessy.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+let fm = Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager);
+
+function test() {
+  waitForExplicitFinish();
+  // Open the javascript console. It has the mac menu overlay, so browser.js is
+  // loaded in it.
+  let consoleWin = window.open("chrome://global/content/console.xul", "_blank",
+                               "chrome,extrachrome,menubar,resizable,scrollbars,status,toolbar");
+  testWithOpenWindow(consoleWin);
+}
+
+function testWithOpenWindow(consoleWin) {
+  // Add a tab so we don't open the url into the current tab
+  let newTab = gBrowser.addTab("http://example.com");
+  gBrowser.selectedTab = newTab;
+
+  let numTabs = gBrowser.tabs.length;
+
+  waitForFocus(function() {
+    // Sanity check
+    is(fm.activeWindow, consoleWin,
+       "the console window is focused");
+
+    gBrowser.tabContainer.addEventListener("TabOpen", function(aEvent) {
+      gBrowser.tabContainer.removeEventListener("TabOpen", arguments.callee, true);
+      let browser = aEvent.originalTarget.linkedBrowser;
+      browser.addEventListener("pageshow", function(event) {
+        if (event.target.location.href != "about:addons")
+          return;
+        browser.removeEventListener("pageshow", arguments.callee, true);
+
+        is(fm.activeWindow, window,
+           "the browser window was focused");
+        is(browser.currentURI.spec, "about:addons",
+           "about:addons was loaded in the window");
+        is(gBrowser.tabs.length, numTabs + 1,
+           "a new tab was added");
+
+        // Cleanup.
+        executeSoon(function() {
+          consoleWin.close();
+          gBrowser.removeTab(gBrowser.selectedTab);
+          gBrowser.removeTab(newTab);
+          finish();
+        });
+      }, true);
+    }, true);
+
+    // Open the addons manager, uses switchToTabHavingURI.
+    consoleWin.BrowserOpenAddonsMgr();
+  }, consoleWin);
+}
+
+// Ideally we'd also check that the case for no open windows works, but we can't
+// due to limitations with the testing framework.
--- a/browser/base/content/utilityOverlay.js
+++ b/browser/base/content/utilityOverlay.js
@@ -201,17 +201,17 @@ function openLinkIn(url, where, params) 
     saveURL(url, null, null, true, null, aReferrerURI);
     return;
   }
   const Cc = Components.classes;
   const Ci = Components.interfaces;
 
   var w = getTopWin();
   if ((where == "tab" || where == "tabshifted") &&
-      w.document.documentElement.getAttribute("chromehidden")) {
+      w && w.document.documentElement.getAttribute("chromehidden")) {
     w = getTopWin(true);
     aRelatedToCurrent = false;
   }
 
   if (!w || where == "window") {
     var sa = Cc["@mozilla.org/supports-array;1"].
              createInstance(Ci.nsISupportsArray);