diff options
Diffstat (limited to 'browser/base/content/test/tabs/browser_adoptTab_failure.js')
-rw-r--r-- | browser/base/content/test/tabs/browser_adoptTab_failure.js | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/browser/base/content/test/tabs/browser_adoptTab_failure.js b/browser/base/content/test/tabs/browser_adoptTab_failure.js new file mode 100644 index 0000000000..f20f4c0c56 --- /dev/null +++ b/browser/base/content/test/tabs/browser_adoptTab_failure.js @@ -0,0 +1,107 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +// 'adoptTab' aborts when swapBrowsersAndCloseOther returns false. +// That's usually a bug, but this function forces it to happen in order to check +// that callers will behave as good as possible when it happens accidentally. +function makeAdoptTabFailOnceFor(gBrowser, tab) { + const original = gBrowser.swapBrowsersAndCloseOther; + gBrowser.swapBrowsersAndCloseOther = function (aOurTab, aOtherTab) { + if (tab !== aOtherTab) { + return original.call(gBrowser, aOurTab, aOtherTab); + } + gBrowser.swapBrowsersAndCloseOther = original; + return false; + }; +} + +add_task(async function test_adoptTab() { + const tab = await addTab(); + const win2 = await BrowserTestUtils.openNewBrowserWindow(); + const gBrowser2 = win2.gBrowser; + + makeAdoptTabFailOnceFor(gBrowser2, tab); + is(gBrowser2.adoptTab(tab), null, "adoptTab returns null in case of failure"); + ok(gBrowser2.adoptTab(tab), "adoptTab returns new tab in case of success"); + + await BrowserTestUtils.closeWindow(win2); +}); + +add_task(async function test_replaceTabsWithWindow() { + const nonAdoptableTab = await addTab("data:text/plain,nonAdoptableTab"); + const auxiliaryTab = await addTab("data:text/plain,auxiliaryTab"); + const selectedTab = await addTab("data:text/plain,selectedTab"); + gBrowser.selectedTabs = [selectedTab, nonAdoptableTab, auxiliaryTab]; + + const windowOpenedPromise = BrowserTestUtils.waitForNewWindow(); + const win2 = gBrowser.replaceTabsWithWindow(selectedTab); + await BrowserTestUtils.waitForEvent(win2, "DOMContentLoaded"); + const gBrowser2 = win2.gBrowser; + makeAdoptTabFailOnceFor(gBrowser2, nonAdoptableTab); + await windowOpenedPromise; + + // nonAdoptableTab couldn't be adopted, but the new window should have adopted + // the other 2 tabs, and they should be in the proper order. + is(gBrowser2.tabs.length, 2); + is(gBrowser2.tabs[0].label, "data:text/plain,auxiliaryTab"); + is(gBrowser2.tabs[1].label, "data:text/plain,selectedTab"); + + gBrowser.removeTab(nonAdoptableTab); + await BrowserTestUtils.closeWindow(win2); +}); + +add_task(async function test_on_drop() { + const nonAdoptableTab = await addTab("data:text/html,<title>nonAdoptableTab"); + const auxiliaryTab = await addTab("data:text/html,<title>auxiliaryTab"); + const selectedTab = await addTab("data:text/html,<title>selectedTab"); + gBrowser.selectedTabs = [selectedTab, nonAdoptableTab, auxiliaryTab]; + + const win2 = await BrowserTestUtils.openNewBrowserWindow(); + const gBrowser2 = win2.gBrowser; + makeAdoptTabFailOnceFor(gBrowser2, nonAdoptableTab); + const initialTab = gBrowser2.tabs[0]; + await dragAndDrop(selectedTab, initialTab, false, win2, false); + + // nonAdoptableTab couldn't be adopted, but the new window should have adopted + // the other 2 tabs, and they should be in the right position. + is(gBrowser2.tabs.length, 3, "There are 3 tabs"); + is(gBrowser2.tabs[0].label, "auxiliaryTab", "auxiliaryTab became tab 0"); + is(gBrowser2.tabs[1].label, "selectedTab", "selectedTab became tab 1"); + is(gBrowser2.tabs[2], initialTab, "initialTab became tab 2"); + is(gBrowser2.selectedTab, gBrowser2.tabs[1], "Tab 1 is selected"); + is(gBrowser2.multiSelectedTabsCount, 2, "Three multiselected tabs"); + ok(gBrowser2.tabs[0].multiselected, "Tab 0 is multiselected"); + ok(gBrowser2.tabs[1].multiselected, "Tab 1 is multiselected"); + ok(!gBrowser2.tabs[2].multiselected, "Tab 2 is not multiselected"); + + gBrowser.removeTab(nonAdoptableTab); + await BrowserTestUtils.closeWindow(win2); +}); + +add_task(async function test_switchToTabHavingURI() { + const nonAdoptableTab = await addTab("data:text/plain,nonAdoptableTab"); + const uri = nonAdoptableTab.linkedBrowser.currentURI; + const win2 = await BrowserTestUtils.openNewBrowserWindow(); + const gBrowser2 = win2.gBrowser; + + is(nonAdoptableTab.closing, false); + is(nonAdoptableTab.selected, false); + is(gBrowser2.tabs.length, 1); + + makeAdoptTabFailOnceFor(gBrowser2, nonAdoptableTab); + win2.switchToTabHavingURI(uri, false, { adoptIntoActiveWindow: true }); + + is(nonAdoptableTab.closing, false); + is(nonAdoptableTab.selected, true); + is(gBrowser2.tabs.length, 1); + + win2.switchToTabHavingURI(uri, false, { adoptIntoActiveWindow: true }); + + is(nonAdoptableTab.closing, true); + is(nonAdoptableTab.selected, false); + is(gBrowser2.tabs.length, 2); + + await BrowserTestUtils.closeWindow(win2); +}); |