summaryrefslogtreecommitdiffstats
path: root/browser/components/sessionstore/test/browser_closed_objects_changed_notifications_tabs.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/sessionstore/test/browser_closed_objects_changed_notifications_tabs.js')
-rw-r--r--browser/components/sessionstore/test/browser_closed_objects_changed_notifications_tabs.js136
1 files changed, 136 insertions, 0 deletions
diff --git a/browser/components/sessionstore/test/browser_closed_objects_changed_notifications_tabs.js b/browser/components/sessionstore/test/browser_closed_objects_changed_notifications_tabs.js
new file mode 100644
index 0000000000..7ad3955034
--- /dev/null
+++ b/browser/components/sessionstore/test/browser_closed_objects_changed_notifications_tabs.js
@@ -0,0 +1,136 @@
+"use strict";
+
+/**
+ * This test is for the sessionstore-closed-objects-changed notifications.
+ */
+
+const MAX_TABS_UNDO_PREF = "browser.sessionstore.max_tabs_undo";
+const TOPIC = "sessionstore-closed-objects-changed";
+
+let notificationsCount = 0;
+
+async function openWindow(url) {
+ let win = await promiseNewWindowLoaded();
+ let flags = Ci.nsIWebNavigation.LOAD_FLAGS_REPLACE_HISTORY;
+ BrowserTestUtils.loadURIString(win.gBrowser.selectedBrowser, url, { flags });
+ await promiseBrowserLoaded(win.gBrowser.selectedBrowser, true, url);
+ return win;
+}
+
+async function closeWindow(win) {
+ await awaitNotification(() => BrowserTestUtils.closeWindow(win));
+}
+
+async function openAndCloseWindow(url) {
+ let win = await openWindow(url);
+ await closeWindow(win);
+}
+
+async function openTab(window, url) {
+ let tab = await BrowserTestUtils.openNewForegroundTab(window.gBrowser, url);
+ await TabStateFlusher.flush(tab.linkedBrowser);
+ return tab;
+}
+
+async function openAndCloseTab(window, url) {
+ let tab = await openTab(window, url);
+ await promiseRemoveTabAndSessionState(tab);
+}
+
+function countingObserver() {
+ notificationsCount++;
+}
+
+function assertNotificationCount(count) {
+ is(
+ notificationsCount,
+ count,
+ "The expected number of notifications was received."
+ );
+}
+
+async function awaitNotification(callback) {
+ let notification = TestUtils.topicObserved(TOPIC);
+ executeSoon(callback);
+ await notification;
+}
+
+add_task(async function test_closedObjectsChangedNotifications() {
+ // Create a closed window so that when we do the purge we can expect a notification.
+ await openAndCloseWindow("about:robots");
+
+ // Forget any previous closed windows or tabs from other tests that may have
+ // run in the same session.
+ await awaitNotification(() =>
+ Services.obs.notifyObservers(null, "browser:purge-session-history")
+ );
+
+ // Add an observer to count the number of notifications.
+ Services.obs.addObserver(countingObserver, TOPIC);
+
+ // Open a new window.
+ let win = await openWindow("about:robots");
+
+ info("Opening and closing a tab.");
+ await openAndCloseTab(win, "about:mozilla");
+ assertNotificationCount(1);
+
+ info("Opening and closing a second tab.");
+ await openAndCloseTab(win, "about:mozilla");
+ assertNotificationCount(2);
+
+ info(`Changing the ${MAX_TABS_UNDO_PREF} pref.`);
+ registerCleanupFunction(function () {
+ Services.prefs.clearUserPref(MAX_TABS_UNDO_PREF);
+ });
+ await awaitNotification(() =>
+ Services.prefs.setIntPref(MAX_TABS_UNDO_PREF, 1)
+ );
+ assertNotificationCount(3);
+
+ info("Undoing close of remaining closed tab.");
+ let tab = SessionStore.undoCloseTab(win, 0);
+ await promiseTabRestored(tab);
+ assertNotificationCount(4);
+
+ info("Closing tab again.");
+ await promiseRemoveTabAndSessionState(tab);
+ assertNotificationCount(5);
+
+ info("Purging session history.");
+ await awaitNotification(() =>
+ Services.obs.notifyObservers(null, "browser:purge-session-history")
+ );
+ assertNotificationCount(6);
+
+ info("Opening and closing another tab.");
+ await openAndCloseTab(win, "http://example.com/");
+ assertNotificationCount(7);
+
+ info("Purging domain data with no matches.");
+ Services.obs.notifyObservers(
+ null,
+ "browser:purge-session-history-for-domain",
+ "mozilla.com"
+ );
+ assertNotificationCount(7);
+
+ info("Purging domain data with matches.");
+ await awaitNotification(() =>
+ Services.obs.notifyObservers(
+ null,
+ "browser:purge-session-history-for-domain",
+ "example.com"
+ )
+ );
+ assertNotificationCount(8);
+
+ info("Opening and closing another tab.");
+ await openAndCloseTab(win, "http://example.com/");
+ assertNotificationCount(9);
+
+ await closeWindow(win);
+ assertNotificationCount(10);
+
+ Services.obs.removeObserver(countingObserver, TOPIC);
+});