author | Michael Yoshitaka Erlewine <mitcho@mitcho.com> |
Tue, 25 Jan 2011 14:14:10 -0500 | |
changeset 61281 | 6253431ae03f5688ecdd8095fe5c235d640fab8b |
parent 61280 | 43da3bf218c3fcb5a7336441df70b5dc259fef29 |
child 61282 | c8ea68010263bf8963d532375625b656a55d0046 |
push id | 18292 |
push user | eakhgari@mozilla.com |
push date | Tue, 25 Jan 2011 20:23:34 +0000 |
treeherder | mozilla-central@0fb025a84958 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | ian, beltzner |
bugs | 627736 |
milestone | 2.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
|
--- 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