Bug 600812 - Dragging tab between groups doesn't work [r=ian, a=dolske]
authorTim Taubert <tim.taubert@gmx.de>
Fri, 21 Jan 2011 22:12:12 +0100
changeset 61158 979d2ebe8b7e521807d7cd43d9a42c2d885092c0
parent 61152 26e88d430849a4620fcf266f256a07af8c880b31
child 61159 b38ba02fdeb4cb44a36743be8e4ac25374d472e0
push idunknown
push userunknown
push dateunknown
reviewersian, dolske
bugs600812
milestone2.0b10pre
Bug 600812 - Dragging tab between groups doesn't work [r=ian, a=dolske]
browser/base/content/tabview/groupitems.js
browser/base/content/test/tabview/Makefile.in
browser/base/content/test/tabview/browser_tabview_bug600812.js
--- a/browser/base/content/tabview/groupitems.js
+++ b/browser/base/content/tabview/groupitems.js
@@ -1475,18 +1475,25 @@ GroupItem.prototype = Utils.extend(new I
         dropSpaceTimer = null;
         // If we drop this item before the timed rearrange was executed,
         // we won't have an accurate dropIndex value. Get that now.
         let dropPos = drag.info.item.getBounds().center();
         dropIndex = self.arrange({dropPos: dropPos,
                                   addTab: drag.info.item.parent != self,
                                   animate: true});
       }
+
+      // remove the item from its parent if that's not the current groupItem.
+      // this may occur when dragging too quickly so the out event is not fired.
+      var groupItem = drag.info.item.parent;
+      if (groupItem && self !== groupItem)
+        groupItem.remove(drag.info.$el, {dontClose: true});
+
       if (dropIndex !== false)
-        options = {index: dropIndex}
+        options = {index: dropIndex};
       this.add(drag.info.$el, options);
       GroupItems.setActiveGroupItem(this);
       dropIndex = false;
     };
     this.dropOptions.out = function GroupItem_dropOptions_out(event) {
       dropIndex = false;
       if (this._dropSpaceActive)
         this._dropSpaceActive = false;
--- a/browser/base/content/test/tabview/Makefile.in
+++ b/browser/base/content/test/tabview/Makefile.in
@@ -67,16 +67,17 @@ include $(topsrcdir)/config/rules.mk
                  browser_tabview_bug595943.js \
                  browser_tabview_bug596781.js \
                  browser_tabview_bug597248.js \
                  browser_tabview_bug597360.js \
                  browser_tabview_bug597399.js \
                  browser_tabview_bug598600.js \
                  browser_tabview_bug599626.js \
                  browser_tabview_bug600645.js \
+                 browser_tabview_bug600812.js \
                  browser_tabview_bug604098.js \
                  browser_tabview_bug606657.js \
                  browser_tabview_bug606905.js \
                  browser_tabview_bug608037.js \
                  browser_tabview_bug608184.js \
                  browser_tabview_bug608158.js \
                  browser_tabview_bug610242.js \
                  browser_tabview_bug616967.js \
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/tabview/browser_tabview_bug600812.js
@@ -0,0 +1,79 @@
+/* ***** 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 a test for bug 600812.
+ *
+ * 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):
+ * Tim Taubert <tim.taubert@gmx.de>
+ *
+ * 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() {
+  let cw;
+
+  let createGroupItem = function () {
+    let bounds = new cw.Rect(20, 20, 150, 150);
+    let groupItem = new cw.GroupItem([], {bounds: bounds, immediately: true});
+
+    cw.GroupItems.setActiveGroupItem(groupItem);
+    gBrowser.loadOneTab('about:blank', {inBackground: true});
+
+    return groupItem;
+  }
+
+  let testVeryQuickDragAndDrop = function () {
+    let sourceGroup = cw.GroupItems.groupItems[0];
+    let targetGroup = createGroupItem();
+
+    sourceGroup.pushAway(true);
+    targetGroup.pushAway(true);
+
+    let sourceTab = sourceGroup.getChild(0).container;
+    EventUtils.synthesizeMouseAtCenter(sourceTab, {type: 'mousedown'}, cw);
+
+    let targetTab = targetGroup.getChild(0).container;
+    EventUtils.synthesizeMouseAtCenter(targetTab, {type: 'mousemove'}, cw);
+    EventUtils.synthesizeMouseAtCenter(targetTab, {type: 'mouseup'}, cw);
+
+    is(targetGroup.getChildren().length, 2, 'target group has two tabs');
+    is(cw.GroupItems.groupItems.length, 1, 'sourceGroup was closed');
+    isnot(cw.GroupItems.groupItems[0], sourceGroup, 'sourceGroup was closed');
+
+    targetGroup.getChild(0).close();
+    hideTabView(finish);
+  }
+
+  waitForExplicitFinish();
+
+  showTabView(function () {
+    cw = TabView.getContentWindow();
+    afterAllTabsLoaded(testVeryQuickDragAndDrop);
+  });
+}