Bug 627736 - fix tab focusing after closing a group in panorama [r=ian, a=beltzner]
authorMichael Yoshitaka Erlewine <mitcho@mitcho.com>
Tue, 25 Jan 2011 14:14:10 -0500
changeset 61281 6253431ae03f5688ecdd8095fe5c235d640fab8b
parent 61280 43da3bf218c3fcb5a7336441df70b5dc259fef29
child 61282 c8ea68010263bf8963d532375625b656a55d0046
push id18292
push usereakhgari@mozilla.com
push dateTue, 25 Jan 2011 20:23:34 +0000
treeherdermozilla-central@0fb025a84958 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersian, beltzner
bugs627736
milestone2.0b10pre
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 627736 - fix tab focusing after closing a group in panorama [r=ian, a=beltzner]
browser/base/content/tabview/groupitems.js
browser/base/content/test/tabview/Makefile.in
browser/base/content/test/tabview/browser_tabview_bug627736.js
--- a/browser/base/content/tabview/groupitems.js
+++ b/browser/base/content/tabview/groupitems.js
@@ -562,17 +562,16 @@ GroupItem.prototype = Utils.extend(new I
     }
     this.deleteData();
   },
 
   // ----------
   // Function: closeAll
   // Closes the groupItem and all of its children.
   closeAll: function GroupItem_closeAll() {
-    let closeCenter = this.getBounds().center();
     if (this._children.length > 0) {
       this._children.forEach(function(child) {
         iQ(child.container).hide();
       });
 
       iQ(this.container).animate({
          opacity: 0,
          "-moz-transform": "scale(.3)",
@@ -583,16 +582,26 @@ GroupItem.prototype = Utils.extend(new I
         }
       });
 
       this._createUndoButton();
     } else {
       if (!this.locked.close)
         this.close();
     }
+    
+    this._makeClosestTabActive();
+  },
+  
+  // ----------
+  // Function: _makeClosestTabActive
+  // Make the closest tab external to this group active.
+  // Used when closing the group.
+  _makeClosestTabActive: function GroupItem__makeClosestTabActive() {
+    let closeCenter = this.getBounds().center();
     // Find closest tab to make active
     let closestTabItem = UI.getClosestTab(closeCenter);
     UI.setActiveTab(closestTabItem);
 
     // set the active group or orphan tabitem.
     if (closestTabItem) {
       if (closestTabItem.parent) {
         GroupItems.setActiveGroupItem(closestTabItem.parent);
@@ -938,16 +947,17 @@ GroupItem.prototype = Utils.extend(new I
 
       if (typeof item.setResizable == 'function')
         item.setResizable(true, options.immediately);
 
       if (this._children.length == 0 && !this.locked.close && !this.getTitle() && 
           !options.dontClose) {
         if (!GroupItems.getUnclosableGroupItemId()) {
           this.close();
+          this._makeClosestTabActive();
         } else {
           // this.close();  this line is causing the leak but the leak doesn't happen after re-enabling it
         }
       } else if (!options.dontArrange) {
         this.arrange({animate: !options.immediately});
       }
 
       this._sendToSubscribers("childRemoved",{ groupItemId: this.id, item: item });
--- a/browser/base/content/test/tabview/Makefile.in
+++ b/browser/base/content/test/tabview/Makefile.in
@@ -84,16 +84,17 @@ include $(topsrcdir)/config/rules.mk
                  browser_tabview_bug616729.js \
                  browser_tabview_bug616967.js \
                  browser_tabview_bug618828.js \
                  browser_tabview_bug619937.js \
                  browser_tabview_bug622835.js \
                  browser_tabview_bug624265.js \
                  browser_tabview_bug624953.js \
                  browser_tabview_bug625269.js \
+                 browser_tabview_bug627736.js \
                  browser_tabview_dragdrop.js \
                  browser_tabview_exit_button.js \
                  browser_tabview_expander.js \
                  browser_tabview_group.js \
                  browser_tabview_launch.js \
                  browser_tabview_multiwindow_search.js \
                  browser_tabview_orphaned_tabs.js \
                  browser_tabview_privatebrowsing.js \
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/tabview/browser_tabview_bug627736.js
@@ -0,0 +1,95 @@
+/* ***** 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 Panorama bug 627736 (post-group close focus) 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):
+ * Michael Yoshitaka Erlewine <mitcho@mitcho.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 ***** */
+
+function test() {
+  waitForExplicitFinish();
+  newWindowWithTabView(onTabViewWindowLoaded);
+}
+
+function onTabViewWindowLoaded(win) {
+  ok(win.TabView.isVisible(), "Tab View is visible");
+
+  let contentWindow = win.document.getElementById("tab-view").contentWindow;
+  let [originalTab] = win.gBrowser.visibleTabs;
+  let originalGroup = contentWindow.GroupItems.getActiveGroupItem();
+
+  // open a group with a tab, and close either the group or the tab.
+  function openAndClose(groupOrTab, callback) {
+    // let's create a group with a tab.
+    let group = new contentWindow.GroupItem([], {
+      immediately: true,
+      bounds: {left: 20, top: 20, width: 400, height: 400}
+    });
+    contentWindow.GroupItems.setActiveGroupItem(group);
+    win.gBrowser.loadOneTab('about:blank', {inBackground: true});
+  
+    is(group.getChildren().length, 1, "The group has one child now.");
+    let tab = group.getChild(0);
+  
+    function check() {
+      if (groupOrTab == 'group') {
+        group.removeSubscriber(group, "groupHidden", check);
+        group.closeHidden();
+      } else
+        tab.removeSubscriber(tab, "tabRemoved", check);
+  
+      is(contentWindow.GroupItems.getActiveGroupItem(), originalGroup,
+        "The original group is active.");
+      is(contentWindow.UI.getActiveTab(), originalTab._tabViewTabItem,
+        "The original tab is active");
+  
+      callback();
+    }
+  
+    if (groupOrTab == 'group') {
+      group.addSubscriber(group, "groupHidden", check);
+      group.closeAll();
+    } else {
+      tab.addSubscriber(tab, "tabRemoved", check);
+      tab.close();
+    }
+  }
+
+  // PHASE 1: create a group with a tab and close the group.
+  openAndClose("group", function postPhase1() {
+    // PHASE 2: create a group with a tab and close the tab.
+    openAndClose("tab", function postPhase2() {
+      win.close();
+      finish();
+    });
+  });
+}
\ No newline at end of file