diff -r 000000000000 -r 6474c204b198 browser/components/tabview/test/browser_tabview_bug587503.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browser/components/tabview/test/browser_tabview_bug587503.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,112 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +function test() { + waitForExplicitFinish(); + + function moveTabOutOfGroup(aTab, aGroup, aCW, aCallback) { + let tabPos = aTab.getBounds().center(); + let groupPos = aGroup.getBounds(); + let groupPosX = (groupPos.left + groupPos.right) / 2; + let groupPosY = groupPos.bottom + 200; + let offsetX = Math.round(groupPosX - tabPos.x); + let offsetY = Math.round(groupPosY - tabPos.y); + + simulateDragDrop(aTab, offsetX, offsetY, aCW); + } + + function moveTabInGroup(aTab, aIndexTo, aGroup, aCW) { + let tabTo = aGroup.getChild(aIndexTo); + let tabPos = aTab.getBounds().center(); + let tabToPos = tabTo.getBounds().center(); + let offsetX = Math.round(tabToPos.x - tabPos.x); + let offsetY = Math.round(tabToPos.y - tabPos.y); + + simulateDragDrop(aTab, offsetX, offsetY, aCW); + } + + function getTabNumbers(aGroup) { + return aGroup.getChildren().map(function (child) { + let url = child.tab.linkedBrowser.currentURI.spec; + return url.replace("about:blank#", ""); + }).join(","); + } + + function moveTabs(aGroup, aCW) { + // Test 1: Move the last tab to the third position. + let tab = aGroup.getChild(6); + moveTabInGroup(tab, 2, aGroup, aCW); + is(getTabNumbers(aGroup), "0,1,6,2,3,4,5", "Validate tab positions in test 1."); + + // Test 2: Move the second tab to the end of the list. + tab = aGroup.getChild(1); + moveTabInGroup(tab, 6, aGroup, aCW); + is(getTabNumbers(aGroup), "0,6,2,3,4,5,1", "Validate tab positions in test 2."); + + // Test 3: Move the fifth tab outside the group. + tab = aGroup.getChild(4); + moveTabOutOfGroup(tab, aGroup, aCW); + is(getTabNumbers(aGroup), "0,6,2,3,5,1", "Validate tab positions in test 3."); + is(aCW.GroupItems.groupItems.length, 3, "Validate group count in test 3."); + + // This test is disabled because it is fragile -- see bug 797975 + if (false) { + // Test 4: Move the fifth tab back into the group, on the second row. + waitForTransition(tab, function() { + moveTabInGroup(tab, 4, aGroup, aCW); + is(getTabNumbers(aGroup), "0,6,2,3,4,5,1", "Validate tab positions in test 4."); + is(aCW.GroupItems.groupItems.length, 2, "Validate group count in test 4."); + closeGroupItem(aGroup, function() { hideTabView(finish) }); + }); + } else { + closeGroupItem(aGroup, function() { hideTabView(finish) }); + } + } + + function createGroup(win) { + registerCleanupFunction(function() win.close()); + let cw = win.TabView.getContentWindow(); + let group = createGroupItemWithTabs(win, 400, 430, 100, [ + "about:blank#0", "about:blank#1", "about:blank#2", "about:blank#3", + "about:blank#4", "about:blank#5", "about:blank#6" + ]); + let groupSize = group.getChildren().length; + + is(cw.GroupItems.groupItems.length, 2, "Validate group count in tab view."); + ok(!group.shouldStack(groupSize), "Check that group should not stack."); + is(group._columns, 3, "Check the there should be three columns."); + + moveTabs(group, cw); + } + + newWindowWithTabView(createGroup); +} + +function simulateDragDrop(aTab, aOffsetX, aOffsetY, aCW) { + let target = aTab.container; + let rect = target.getBoundingClientRect(); + let startX = (rect.right - rect.left) / 2; + let startY = (rect.bottom - rect.top) / 2; + let steps = 2; + let incrementX = aOffsetX / steps; + let incrementY = aOffsetY / steps; + + EventUtils.synthesizeMouse( + target, startX, startY, { type: "mousedown" }, aCW); + for (let i = 1; i <= steps; i++) { + EventUtils.synthesizeMouse( + target, incrementX + startX, incrementY + startY, + { type: "mousemove" }, aCW); + }; + EventUtils.synthesizeMouseAtCenter(target, { type: "mouseup" }, aCW); +} + +function waitForTransition(aTab, aCallback) { + let groupContainer = aTab.parent.container; + groupContainer.addEventListener("transitionend", function onTransitionEnd(aEvent) { + if (aEvent.target == groupContainer) { + groupContainer.removeEventListener("transitionend", onTransitionEnd); + executeSoon(aCallback); + } + }); +}