From a136b48055aaa3967a43f111eb3accccd0378ca2 Mon Sep 17 00:00:00 2001 From: Sean Dunn Date: Mon, 27 Sep 2010 16:12:00 -0700 Subject: [PATCH] Bug 595930 - "closing a group breaks the keyboard shortcut for toggling panorama" [r+a=dietrich] --HG-- extra : rebase_source : aacd0e1a2bcda5319bdd24a335cda5f904d1dd99 --- browser/base/content/tabview/groupitems.js | 3 + browser/base/content/tabview/ui.js | 19 +++++ browser/base/content/test/tabview/Makefile.in | 1 + .../test/tabview/browser_tabview_bug595930.js | 85 +++++++++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 browser/base/content/test/tabview/browser_tabview_bug595930.js diff --git a/browser/base/content/tabview/groupitems.js b/browser/base/content/tabview/groupitems.js index f4dda054672..3b7d7dc43e5 100644 --- a/browser/base/content/tabview/groupitems.js +++ b/browser/base/content/tabview/groupitems.js @@ -568,6 +568,7 @@ GroupItem.prototype = Utils.extend(new Item(), new Subscribable(), { // 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(); @@ -588,6 +589,8 @@ GroupItem.prototype = Utils.extend(new Item(), new Subscribable(), { if (!this.locked.close) this.close(); } + // Find closest tab to make active + UI.setActiveTab( UI.getClosestTab(closeCenter) ); }, // ---------- diff --git a/browser/base/content/tabview/ui.js b/browser/base/content/tabview/ui.js index 0f897acf989..fcad80f7329 100644 --- a/browser/base/content/tabview/ui.js +++ b/browser/base/content/tabview/ui.js @@ -761,6 +761,25 @@ let UI = { groupsNumber.setAttribute("groups", numberOfGroups); }, + // ---------- + // Function: getClosestTab + // Convenience function to get the next tab closest to the entered position + getClosestTab: function UI_getClosestTab(tabCenter) { + let cl = null; + let clDist; + for each(item in TabItems.getItems()) { + if (item.parent && item.parent.hidden) { + continue; + } + let testDist = tabCenter.distance(item.bounds.center()); + if (cl==null || testDist < clDist) { + cl = item; + clDist = testDist; + } + } + return cl; + }, + // ---------- // Function: _setTabViewFrameKeyHandlers // Sets up the key handlers for navigating between tabs within the TabView UI. diff --git a/browser/base/content/test/tabview/Makefile.in b/browser/base/content/test/tabview/Makefile.in index 880c22c7fba..0b56f1bad67 100644 --- a/browser/base/content/test/tabview/Makefile.in +++ b/browser/base/content/test/tabview/Makefile.in @@ -54,6 +54,7 @@ _BROWSER_FILES = \ browser_tabview_bug595191.js \ browser_tabview_bug595518.js \ browser_tabview_bug595804.js \ + browser_tabview_bug595930.js \ browser_tabview_bug595943.js \ browser_tabview_dragdrop.js \ browser_tabview_exit_button.js \ diff --git a/browser/base/content/test/tabview/browser_tabview_bug595930.js b/browser/base/content/test/tabview/browser_tabview_bug595930.js new file mode 100644 index 00000000000..243107c437c --- /dev/null +++ b/browser/base/content/test/tabview/browser_tabview_bug595930.js @@ -0,0 +1,85 @@ +/* ***** 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 tabview test for bug 587040. + * + * 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): + * Raymond Lee + * + * 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(); + + window.addEventListener("tabviewshown", onTabViewWindowLoaded, false); + TabView.toggle(); +} + +function onTabViewWindowLoaded() { + window.removeEventListener("tabviewshown", onTabViewWindowLoaded, false); + + ok(TabView.isVisible(), "Tab View is visible"); + + let [originalTab] = gBrowser.visibleTabs; + let contentWindow = document.getElementById("tab-view").contentWindow; + + // create group which we'll close + let box1 = new contentWindow.Rect(310, 10, 300, 300); + let group1 = new contentWindow.GroupItem([], { bounds: box1 }); + ok(group1.isEmpty(), "This group is empty"); + contentWindow.GroupItems.setActiveGroupItem(group1); + let tab1 = gBrowser.loadOneTab("about:blank#1", {inBackground: true}); + let tab1Item = tab1.tabItem; + ok(group1.getChildren().some(function(child) child == tab1Item), "The tab was made in our new group"); + is(group1.getChildren().length, 1, "Only one tab in the first group"); + + group1.addSubscriber(group1, "close", function() { + group1.removeSubscriber(group1, "close"); + + let onTabViewHidden = function() { + window.removeEventListener("tabviewhidden", onTabViewHidden, false); + // assert that we're no longer in tab view + ok(!TabView.isVisible(), "Tab View is hidden"); + finish(); + }; + window.addEventListener("tabviewhidden", onTabViewHidden, false); + + EventUtils.synthesizeKey("e", {accelKey : true}, contentWindow); + }); + + // Get rid of the group and its children + group1.closeAll(); + + // close undo group + let closeButton = group1.$undoContainer.find(".close"); + EventUtils.sendMouseEvent( + { type: "click" }, closeButton[0], contentWindow); +} +