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: let tests = []; michael@0: michael@0: let getContentWindow = function (aWindow) { michael@0: return aWindow.TabView.getContentWindow(); michael@0: } michael@0: michael@0: let assertOneSingleGroupItem = function (aWindow) { michael@0: is(getContentWindow(aWindow).GroupItems.groupItems.length, 1, 'There is one single groupItem'); michael@0: } michael@0: michael@0: let assertNumberOfVisibleTabs = function (aWindow, numTabs) { michael@0: is(aWindow.gBrowser.visibleTabs.length, numTabs, 'There should be ' + numTabs + ' visible tabs'); michael@0: } michael@0: michael@0: let next = function (aWindow) { michael@0: while (aWindow.gBrowser.tabs.length-1) michael@0: aWindow.gBrowser.removeTab(aWindow.gBrowser.tabs[1]); michael@0: michael@0: hideTabView(function() { michael@0: let callback = tests.shift(); michael@0: michael@0: if (!callback) { michael@0: executeSoon(function() { michael@0: assertOneSingleGroupItem(aWindow); michael@0: aWindow.close(); michael@0: finish(); michael@0: }); michael@0: } else { michael@0: assertOneSingleGroupItem(aWindow); michael@0: callback(aWindow); michael@0: } michael@0: }, aWindow); michael@0: } michael@0: michael@0: // [624265] testing undo close tab michael@0: let testUndoCloseTabs = function (aWindow) { michael@0: aWindow.gBrowser.loadOneTab('http://mochi.test:8888/', {inBackground: true}); michael@0: aWindow.gBrowser.loadOneTab('http://mochi.test:8888/', {inBackground: true}); michael@0: michael@0: afterAllTabsLoaded(function () { michael@0: assertNumberOfVisibleTabs(aWindow, 3); michael@0: michael@0: aWindow.gBrowser.removeTab(aWindow.gBrowser.tabs[1]); michael@0: aWindow.gBrowser.selectedTab = aWindow.gBrowser.tabs[1]; michael@0: michael@0: restoreTab(function () { michael@0: assertNumberOfVisibleTabs(aWindow, 3); michael@0: assertOneSingleGroupItem(aWindow); michael@0: next(aWindow); michael@0: }, 0, aWindow); michael@0: }, aWindow); michael@0: } michael@0: michael@0: // [623792] duplicating tab via middle click on reload button michael@0: let testDuplicateTab = function (aWindow) { michael@0: aWindow.gBrowser.loadOneTab('http://mochi.test:8888/', {inBackground: true}); michael@0: michael@0: afterAllTabsLoaded(function () { michael@0: // Valid choices for 'where' are window|tabshifted|tab michael@0: aWindow.duplicateTabIn(aWindow.gBrowser.selectedTab, 'tab'); michael@0: michael@0: afterAllTabsLoaded(function () { michael@0: assertNumberOfVisibleTabs(aWindow, 3); michael@0: assertOneSingleGroupItem(aWindow); michael@0: next(aWindow); michael@0: }, aWindow); michael@0: }, aWindow); michael@0: } michael@0: michael@0: // [623792] duplicating tabs via middle click on forward/back buttons michael@0: let testBackForwardDuplicateTab = function (aWindow) { michael@0: let tab = aWindow.gBrowser.loadOneTab('http://mochi.test:8888/#1', {inBackground: true}); michael@0: aWindow.gBrowser.selectedTab = tab; michael@0: michael@0: afterAllTabsLoaded(function () { michael@0: tab.linkedBrowser.loadURI('http://mochi.test:8888/#2'); michael@0: michael@0: afterAllTabsLoaded(function () { michael@0: ok(aWindow.gBrowser.canGoBack, 'browser can go back in history'); michael@0: aWindow.BrowserBack({button: 1}); michael@0: michael@0: afterAllTabsLoaded(function () { michael@0: assertNumberOfVisibleTabs(aWindow, 3); michael@0: michael@0: ok(aWindow.gBrowser.canGoForward, 'browser can go forward in history'); michael@0: aWindow.BrowserForward({button: 1}); michael@0: michael@0: afterAllTabsLoaded(function () { michael@0: assertNumberOfVisibleTabs(aWindow, 4); michael@0: assertOneSingleGroupItem(aWindow); michael@0: next(aWindow); michael@0: }, aWindow); michael@0: }, aWindow); michael@0: }, aWindow); michael@0: }, aWindow); michael@0: } michael@0: michael@0: // [624102] check state after return from private browsing michael@0: let testPrivateBrowsing = function (aWindow) { michael@0: aWindow.gBrowser.loadOneTab('http://mochi.test:8888/#1', {inBackground: true}); michael@0: aWindow.gBrowser.loadOneTab('http://mochi.test:8888/#2', {inBackground: true}); michael@0: michael@0: let cw = getContentWindow(aWindow); michael@0: let box = new cw.Rect(20, 20, 250, 200); michael@0: let groupItem = new cw.GroupItem([], {bounds: box, immediately: true}); michael@0: cw.UI.setActive(groupItem); michael@0: michael@0: aWindow.gBrowser.selectedTab = aWindow.gBrowser.loadOneTab('http://mochi.test:8888/#3', {inBackground: true}); michael@0: aWindow.gBrowser.loadOneTab('http://mochi.test:8888/#4', {inBackground: true}); michael@0: michael@0: afterAllTabsLoaded(function () { michael@0: assertNumberOfVisibleTabs(aWindow, 2); michael@0: michael@0: enterAndLeavePrivateBrowsing(function () { michael@0: assertNumberOfVisibleTabs(aWindow, 2); michael@0: aWindow.gBrowser.selectedTab = aWindow.gBrowser.tabs[0]; michael@0: closeGroupItem(cw.GroupItems.groupItems[1], function() { michael@0: next(aWindow); michael@0: }); michael@0: }); michael@0: }, aWindow); michael@0: } michael@0: michael@0: function testOnWindow(aIsPrivate, aCallback) { michael@0: let win = OpenBrowserWindow({private: aIsPrivate}); michael@0: win.addEventListener("load", function onLoad() { michael@0: win.removeEventListener("load", onLoad, false); michael@0: executeSoon(function() { aCallback(win) }); michael@0: }, false); michael@0: } michael@0: michael@0: function enterAndLeavePrivateBrowsing(callback) { michael@0: testOnWindow(true, function (aWindow) { michael@0: aWindow.close(); michael@0: callback(); michael@0: }); michael@0: } michael@0: michael@0: waitForExplicitFinish(); michael@0: michael@0: // Tests for #624265 michael@0: tests.push(testUndoCloseTabs); michael@0: michael@0: // Tests for #623792 michael@0: tests.push(testDuplicateTab); michael@0: tests.push(testBackForwardDuplicateTab); michael@0: michael@0: // Tests for #624102 michael@0: tests.push(testPrivateBrowsing); michael@0: michael@0: testOnWindow(false, function(aWindow) { michael@0: loadTabView(function() { michael@0: next(aWindow); michael@0: }, aWindow); michael@0: }); michael@0: } michael@0: michael@0: function loadTabView(callback, aWindow) { michael@0: showTabView(function () { michael@0: hideTabView(callback, aWindow); michael@0: }, aWindow); michael@0: }