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