summaryrefslogtreecommitdiffstats
path: root/browser/components/sessionstore/test/browser_undoCloseById_targetWindow.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/sessionstore/test/browser_undoCloseById_targetWindow.js')
-rw-r--r--browser/components/sessionstore/test/browser_undoCloseById_targetWindow.js93
1 files changed, 93 insertions, 0 deletions
diff --git a/browser/components/sessionstore/test/browser_undoCloseById_targetWindow.js b/browser/components/sessionstore/test/browser_undoCloseById_targetWindow.js
new file mode 100644
index 0000000000..62e3da89ea
--- /dev/null
+++ b/browser/components/sessionstore/test/browser_undoCloseById_targetWindow.js
@@ -0,0 +1,93 @@
+"use strict";
+
+/**
+ * This test verifies SessionStore.undoCloseById behavior when passed the targetWindow argument
+ */
+
+async function openWindow(url) {
+ let win = await promiseNewWindowLoaded();
+ let flags = Ci.nsIWebNavigation.LOAD_FLAGS_REPLACE_HISTORY;
+ BrowserTestUtils.startLoadingURIString(win.gBrowser.selectedBrowser, url, {
+ flags,
+ });
+ await promiseBrowserLoaded(win.gBrowser.selectedBrowser, true, url);
+ return win;
+}
+
+async function closeWindow(win) {
+ TestUtils.waitForTick();
+ let sessionStoreUpdated = TestUtils.topicObserved(
+ "sessionstore-closed-objects-changed"
+ );
+ await BrowserTestUtils.closeWindow(win);
+ await sessionStoreUpdated;
+}
+
+function forgetTabsAndWindows() {
+ // Clear the lists of closed windows and tabs.
+ forgetClosedWindows();
+ while (SessionStore.getClosedTabCount(window)) {
+ SessionStore.forgetClosedTab(window, 0);
+ }
+}
+
+add_task(async function test_undoCloseById_with_targetWindow() {
+ forgetTabsAndWindows();
+ // Test that a tab closed in (currently open) window B, will correctly be opened in target window A.
+ // And that the closed record should be correctly removed from window B
+ const winA = window;
+ // Open a new window.
+ const winB = await openWindow("about:robots");
+ await SimpleTest.promiseFocus(winB);
+ // Open and close a tab in the 2nd window
+ await openAndCloseTab(winB, "about:mozilla");
+ is(
+ SessionStore.lastClosedObjectType,
+ "tab",
+ "The last closed object is a tab"
+ );
+ // Record the first closedId created.
+ const closedId = SessionStore.getClosedTabData(winB)[0].closedId;
+ let tabRestored = BrowserTestUtils.waitForNewTab(
+ winA.gBrowser,
+ "about:mozilla"
+ );
+
+ // Restore the tab into the first window, not the window it was closed in
+ SessionStore.undoCloseById(closedId, undefined, winA);
+ await tabRestored;
+ is(winA.gBrowser.selectedBrowser.currentURI.spec, "about:mozilla");
+
+ // Verify the closed tab data is removed from the source window
+ is(
+ SessionStore.getClosedTabData(winB).length,
+ 0,
+ "Record removed from the source window's closed tab data"
+ );
+
+ BrowserTestUtils.removeTab(winA.gBrowser.selectedTab);
+ await closeWindow(winB);
+});
+
+add_task(async function test_undoCloseById_with_nonExistent_targetWindow() {
+ // Test that restoring a tab to a non-existent targetWindow throws
+ forgetTabsAndWindows();
+ await openAndCloseTab(window, "about:mozilla");
+ is(
+ SessionStore.lastClosedObjectType,
+ "tab",
+ "The last closed object is a tab"
+ );
+ // Record the first closedId created.
+ const closedId = SessionStore.getClosedTabData(window)[0].closedId;
+
+ // get a reference to a window that will be closed
+ const newWin = await BrowserTestUtils.openNewBrowserWindow();
+ await SimpleTest.promiseFocus(newWin);
+ await BrowserTestUtils.closeWindow(newWin);
+
+ // Expect an exception trying to restore a tab to a non-existent window
+ Assert.throws(() => {
+ SessionStore.undoCloseById(closedId, undefined, newWin);
+ }, /NS_ERROR_ILLEGAL_VALUE/);
+});