diff -r 000000000000 -r 6474c204b198 browser/components/tabview/test/browser_tabview_bug610208.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browser/components/tabview/test/browser_tabview_bug610208.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,242 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +function test() { + requestLongerTimeout(4); + let cw; + let win; + let groupItem; + + let next = function () { + let test = tests.shift(); + + if (test) { + test(); + return; + } + + win.close(); + finish(); + } + + let closeTabItemManually = function (tabItem) { + EventUtils.synthesizeMouseAtCenter(tabItem.container, {button: 1}, cw); + } + + let prepareTest = function (testName) { + let originalBounds = groupItem.getChild(0).getBounds(); + + let tabItem = groupItem.getChild(1); + let bounds = tabItem.getBounds(); + closeTabItemManually(tabItem); + + ok(originalBounds.equals(groupItem.getChild(0).getBounds()), testName + ': tabs did not change their size'); + ok(bounds.equals(groupItem.getChild(1).getBounds()), testName + ': third tab is now on second tab\'s previous position'); + + return originalBounds; + } + + let cleanUpTest = function (testName, originalBounds, callback) { + // Use setTimeout here because the groupItem.arrange() call uses + // animation to re-arrange the tabItems. + win.setTimeout(function () { + ok(!originalBounds.equals(groupItem.getChild(0).getBounds()), testName + ': tabs changed their size'); + + // cleanup + cw.UI.setActive(groupItem); + win.gBrowser.loadOneTab('about:blank', {inBackground: true}); + afterAllTabsLoaded(callback, win); + }, 500); + } + + let tests = []; + + // focus group title's input field to cause item arrange + let testFocusTitle = function () { + let originalBounds = prepareTest('testFocusTitle'); + + let target = groupItem.$titleShield[0]; + EventUtils.synthesizeMouseAtCenter(target, {}, cw); + + cleanUpTest('testFocusTitle', originalBounds, next); + } + + // hide tabview to cause item arrange + let testHideTabView = function () { + let originalBounds = prepareTest('testHideTabView'); + + hideTabView(function () { + cleanUpTest('testHideTabView', originalBounds, function () { + showTabView(next, win); + }); + }, win); + } + + // (undo) close a group to cause item arrange + let testCloseGroupUndo = function () { + let originalBounds = prepareTest('testCloseGroupUndo'); + + hideGroupItem(groupItem, function () { + unhideGroupItem(groupItem, function () { + cleanUpTest('testCloseGroupUndo', originalBounds, next); + }); + }); + } + + // leave the group's container with the mouse to cause item arrange + let testMouseOut = function () { + let originalBounds = prepareTest('testMouseOut'); + let doc = cw.document.documentElement; + let bounds = groupItem.getBounds(); + + EventUtils.synthesizeMouse(doc, bounds.right - 5, bounds.bottom - 5, {type: 'mousemove'}, cw); + ok(originalBounds.equals(groupItem.getChild(0).getBounds()), 'testMouseOut: tabs did not change their size'); + + EventUtils.synthesizeMouse(doc, bounds.right + 1, bounds.bottom + 1, {type: 'mousemove'}, cw); + cleanUpTest('testMouseOut', originalBounds, next); + } + + // sort item (drag it around) in its group to cause item arrange + let testSortInGroup = function () { + let originalBounds = prepareTest('testSortInGroup'); + let target = groupItem.getChild(0).container; + + // simulate drag/drop sorting + EventUtils.synthesizeMouse(target, 20, 20, {type: 'mousedown'}, cw); + EventUtils.synthesizeMouse(target, 40, 20, {type: 'mousemove'}, cw); + EventUtils.synthesizeMouse(target, 20, 20, {type: 'mouseup'}, cw); + + cleanUpTest('testSortInGroup', originalBounds, next); + } + + // arrange items when the containing group is resized + let testResizeGroup = function () { + let originalBounds = prepareTest('testResizeGroup'); + let oldBounds = groupItem.getBounds(); + let resizer = groupItem.$resizer[0]; + + // simulate drag/drop resizing + EventUtils.synthesizeMouse(resizer, 5, 5, {type: 'mousedown'}, cw); + EventUtils.synthesizeMouse(resizer, 40, 20, {type: 'mousemove'}, cw); + EventUtils.synthesizeMouse(resizer, 20, 20, {type: 'mouseup'}, cw); + + // reset group size + groupItem.setBounds(oldBounds); + groupItem.setUserSize(); + + cleanUpTest('testResizeGroup', originalBounds, next); + } + + // make sure we don't freeze item size when removing an item from a stack + let testRemoveWhileStacked = function () { + let oldBounds = groupItem.getBounds(); + groupItem.setSize(250, 250, true); + groupItem.setUserSize(); + + ok(!groupItem.isStacked(), 'testRemoveWhileStacked: group is not stacked'); + + let originalBounds; + let tabItem = groupItem.getChild(0); + + // add new tabs to let the group stack + while (!groupItem.isStacked()) { + originalBounds = tabItem.getBounds(); + win.gBrowser.addTab(); + } + + afterAllTabsLoaded(function () { + tabItem.close(); + ok(!groupItem.isStacked(), 'testRemoveWhileStacked: group is not stacked'); + + let bounds = groupItem.getChild(0).getBounds(); + ok(originalBounds.equals(bounds), 'testRemoveWhileStacked: tabs did not change their size'); + + // reset group size + groupItem.setBounds(oldBounds); + groupItem.setUserSize(); + + next(); + }, win); + } + + // 1) make sure item size is frozen when removing an item in expanded mode + // 2) make sure item size stays frozen while moving the mouse in the expanded + // layer + let testExpandedMode = function () { + let oldBounds = groupItem.getBounds(); + groupItem.setSize(100, 100, true); + groupItem.setUserSize(); + + ok(groupItem.isStacked(), 'testExpandedMode: group is stacked'); + + groupItem.addSubscriber('expanded', function onGroupExpanded() { + groupItem.removeSubscriber('expanded', onGroupExpanded); + onExpanded(); + }); + + groupItem.addSubscriber('collapsed', function onGroupCollapsed() { + groupItem.removeSubscriber('collapsed', onGroupCollapsed); + onCollapsed(); + }); + + let onExpanded = function () { + let originalBounds = groupItem.getChild(0).getBounds(); + let tabItem = groupItem.getChild(1); + let bounds = tabItem.getBounds(); + + while (groupItem.getChildren().length > 2) + closeTabItemManually(groupItem.getChild(1)); + + ok(originalBounds.equals(groupItem.getChild(0).getBounds()), 'testExpandedMode: tabs did not change their size'); + + // move the mouse over the expanded layer + let trayBounds = groupItem.expanded.bounds; + let target = groupItem.expanded.$tray[0]; + EventUtils.synthesizeMouse(target, trayBounds.right - 5, trayBounds.bottom -5, {type: 'mousemove'}, cw); + + ok(originalBounds.equals(groupItem.getChild(0).getBounds()), 'testExpandedMode: tabs did not change their size'); + groupItem.collapse(); + } + + let onCollapsed = function () { + // reset group size + groupItem.setBounds(oldBounds); + groupItem.setUserSize(); + + next(); + } + + groupItem.expand(); + } + + tests.push(testFocusTitle); + tests.push(testHideTabView); + tests.push(testCloseGroupUndo); + tests.push(testMouseOut); + tests.push(testSortInGroup); + tests.push(testResizeGroup); + tests.push(testRemoveWhileStacked); + tests.push(testExpandedMode); + + waitForExplicitFinish(); + + newWindowWithTabView(function (tvwin) { + win = tvwin; + + registerCleanupFunction(function () { + if (!win.closed) + win.close(); + }); + + cw = win.TabView.getContentWindow(); + + groupItem = cw.GroupItems.groupItems[0]; + groupItem.setSize(400, 200, true); + groupItem.setUserSize(); + + for (let i=0; i<3; i++) + win.gBrowser.loadOneTab('about:blank', {inBackground: true}); + + afterAllTabsLoaded(next, win); + }); +}