1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
"use strict";
/**
* This test is for the sessionstore-closed-objects-changed notifications.
*/
requestLongerTimeout(2);
const MAX_WINDOWS_UNDO_PREF = "browser.sessionstore.max_windows_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);
}
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 know to 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);
info("Opening and closing initial window.");
await openAndCloseWindow("about:robots");
assertNotificationCount(1);
// Store state with a single closed window for use in later tests.
let closedState = Cu.cloneInto(JSON.parse(ss.getBrowserState()), {});
info("Undoing close of initial window.");
let win = SessionStore.undoCloseWindow(0);
await promiseDelayedStartupFinished(win);
assertNotificationCount(2);
// Open a second window.
let win2 = await openWindow("about:mozilla");
info("Closing both windows.");
await closeWindow(win);
assertNotificationCount(3);
await closeWindow(win2);
assertNotificationCount(4);
info(`Changing the ${MAX_WINDOWS_UNDO_PREF} pref.`);
registerCleanupFunction(function () {
Services.prefs.clearUserPref(MAX_WINDOWS_UNDO_PREF);
});
await awaitNotification(() =>
Services.prefs.setIntPref(MAX_WINDOWS_UNDO_PREF, 1)
);
assertNotificationCount(5);
info("Forgetting a closed window.");
await awaitNotification(() => SessionStore.forgetClosedWindow());
assertNotificationCount(6);
info("Opening and closing another window.");
await openAndCloseWindow("about:robots");
assertNotificationCount(7);
info("Setting browser state to trigger change onIdleDaily.");
let state = Cu.cloneInto(JSON.parse(ss.getBrowserState()), {});
state._closedWindows[0].closedAt = 1;
await promiseBrowserState(state);
assertNotificationCount(8);
info("Sending idle-daily");
await awaitNotification(() =>
Services.obs.notifyObservers(null, "idle-daily")
);
assertNotificationCount(9);
info("Opening and closing another window.");
await openAndCloseWindow("about:robots");
assertNotificationCount(10);
info("Purging session history.");
await awaitNotification(() =>
Services.obs.notifyObservers(null, "browser:purge-session-history")
);
assertNotificationCount(11);
info("Setting window state.");
win = await openWindow("about:mozilla");
await awaitNotification(() => SessionStore.setWindowState(win, closedState));
assertNotificationCount(12);
Services.obs.removeObserver(countingObserver, TOPIC);
await BrowserTestUtils.closeWindow(win);
});
|