michael@0: function test() { michael@0: gPrefService.setBoolPref("browser.ctrlTab.previews", true); michael@0: michael@0: gBrowser.addTab(); michael@0: gBrowser.addTab(); michael@0: gBrowser.addTab(); michael@0: michael@0: checkTabs(4); michael@0: michael@0: ctrlTabTest([2] , 1, 0); michael@0: ctrlTabTest([2, 3, 1], 2, 2); michael@0: ctrlTabTest([] , 4, 2); michael@0: michael@0: { michael@0: let selectedIndex = gBrowser.tabContainer.selectedIndex; michael@0: pressCtrlTab(); michael@0: pressCtrlTab(true); michael@0: releaseCtrl(); michael@0: is(gBrowser.tabContainer.selectedIndex, selectedIndex, michael@0: "Ctrl+Tab -> Ctrl+Shift+Tab keeps the selected tab"); michael@0: } michael@0: michael@0: { // test for bug 445369 michael@0: let tabs = gBrowser.tabs.length; michael@0: pressCtrlTab(); michael@0: EventUtils.synthesizeKey("w", { ctrlKey: true }); michael@0: is(gBrowser.tabs.length, tabs - 1, "Ctrl+Tab -> Ctrl+W removes one tab"); michael@0: releaseCtrl(); michael@0: } michael@0: michael@0: { // test for bug 667314 michael@0: let tabs = gBrowser.tabs.length; michael@0: pressCtrlTab(); michael@0: pressCtrlTab(true); michael@0: EventUtils.synthesizeKey("w", { ctrlKey: true }); michael@0: is(gBrowser.tabs.length, tabs - 1, "Ctrl+Tab -> Ctrl+W removes the selected tab"); michael@0: releaseCtrl(); michael@0: } michael@0: michael@0: gBrowser.addTab(); michael@0: checkTabs(3); michael@0: ctrlTabTest([2, 1, 0], 7, 1); michael@0: michael@0: gBrowser.addTab(); michael@0: checkTabs(4); michael@0: michael@0: { // test for bug 445369 michael@0: selectTabs([1, 2, 0]); michael@0: michael@0: let selectedTab = gBrowser.selectedTab; michael@0: let tabToRemove = gBrowser.tabs[1]; michael@0: michael@0: pressCtrlTab(); michael@0: pressCtrlTab(); michael@0: EventUtils.synthesizeKey("w", { ctrlKey: true }); michael@0: ok(!tabToRemove.parentNode, michael@0: "Ctrl+Tab*2 -> Ctrl+W removes the second most recently selected tab"); michael@0: michael@0: pressCtrlTab(true); michael@0: pressCtrlTab(true); michael@0: releaseCtrl(); michael@0: ok(selectedTab.selected, michael@0: "Ctrl+Tab*2 -> Ctrl+W -> Ctrl+Shift+Tab*2 keeps the selected tab"); michael@0: } michael@0: gBrowser.removeTab(gBrowser.tabContainer.lastChild); michael@0: checkTabs(2); michael@0: michael@0: ctrlTabTest([1], 1, 0); michael@0: michael@0: gBrowser.removeTab(gBrowser.tabContainer.lastChild); michael@0: checkTabs(1); michael@0: michael@0: { // test for bug 445768 michael@0: let focusedWindow = document.commandDispatcher.focusedWindow; michael@0: let eventConsumed = true; michael@0: let detectKeyEvent = function (event) { michael@0: eventConsumed = event.defaultPrevented; michael@0: }; michael@0: document.addEventListener("keypress", detectKeyEvent, false); michael@0: pressCtrlTab(); michael@0: document.removeEventListener("keypress", detectKeyEvent, false); michael@0: ok(eventConsumed, "Ctrl+Tab consumed by the tabbed browser if one tab is open"); michael@0: is(focusedWindow, document.commandDispatcher.focusedWindow, michael@0: "Ctrl+Tab doesn't change focus if one tab is open"); michael@0: } michael@0: michael@0: // cleanup michael@0: if (gPrefService.prefHasUserValue("browser.ctrlTab.previews")) michael@0: gPrefService.clearUserPref("browser.ctrlTab.previews"); michael@0: michael@0: /* private utility functions */ michael@0: michael@0: function pressCtrlTab(aShiftKey) michael@0: EventUtils.synthesizeKey("VK_TAB", { ctrlKey: true, shiftKey: !!aShiftKey }); michael@0: michael@0: function releaseCtrl() michael@0: EventUtils.synthesizeKey("VK_CONTROL", { type: "keyup" }); michael@0: michael@0: function isOpen() michael@0: ctrlTab.isOpen; michael@0: michael@0: function checkTabs(aTabs) { michael@0: var tabs = gBrowser.tabs.length; michael@0: if (tabs != aTabs) { michael@0: while (gBrowser.tabs.length > 1) michael@0: gBrowser.removeCurrentTab(); michael@0: throw "expected " + aTabs + " open tabs, got " + tabs; michael@0: } michael@0: } michael@0: michael@0: function selectTabs(tabs) { michael@0: tabs.forEach(function (index) { michael@0: gBrowser.selectedTab = gBrowser.tabs[index]; michael@0: }); michael@0: } michael@0: michael@0: function ctrlTabTest(tabsToSelect, tabTimes, expectedIndex) { michael@0: selectTabs(tabsToSelect); michael@0: michael@0: var indexStart = gBrowser.tabContainer.selectedIndex; michael@0: var tabCount = gBrowser.tabs.length; michael@0: var normalized = tabTimes % tabCount; michael@0: var where = normalized == 1 ? "back to the previously selected tab" : michael@0: normalized + " tabs back in most-recently-selected order"; michael@0: michael@0: for (let i = 0; i < tabTimes; i++) { michael@0: pressCtrlTab(); michael@0: michael@0: if (tabCount > 2) michael@0: is(gBrowser.tabContainer.selectedIndex, indexStart, michael@0: "Selected tab doesn't change while tabbing"); michael@0: } michael@0: michael@0: if (tabCount > 2) { michael@0: ok(isOpen(), michael@0: "With " + tabCount + " tabs open, Ctrl+Tab opens the preview panel"); michael@0: michael@0: releaseCtrl(); michael@0: michael@0: ok(!isOpen(), michael@0: "Releasing Ctrl closes the preview panel"); michael@0: } else { michael@0: ok(!isOpen(), michael@0: "With " + tabCount + " tabs open, Ctrl+Tab doesn't open the preview panel"); michael@0: } michael@0: michael@0: is(gBrowser.tabContainer.selectedIndex, expectedIndex, michael@0: "With "+ tabCount +" tabs open and tab " + indexStart michael@0: + " selected, Ctrl+Tab*" + tabTimes + " goes " + where); michael@0: } michael@0: }