summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/tabs/browser_adoptTab_failure.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/base/content/test/tabs/browser_adoptTab_failure.js')
-rw-r--r--browser/base/content/test/tabs/browser_adoptTab_failure.js107
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);
+});