summaryrefslogtreecommitdiffstats
path: root/browser/components/sessionstore/test/browser_dying_cache.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/sessionstore/test/browser_dying_cache.js')
-rw-r--r--browser/components/sessionstore/test/browser_dying_cache.js66
1 files changed, 66 insertions, 0 deletions
diff --git a/browser/components/sessionstore/test/browser_dying_cache.js b/browser/components/sessionstore/test/browser_dying_cache.js
new file mode 100644
index 000000000..c573aa5d4
--- /dev/null
+++ b/browser/components/sessionstore/test/browser_dying_cache.js
@@ -0,0 +1,66 @@
+"use strict";
+
+/**
+ * This test ensures that after closing a window we keep its state data around
+ * as long as something keeps a reference to it. It should only be possible to
+ * read data after closing - writing should fail.
+ */
+
+add_task(function* test() {
+ // Open a new window.
+ let win = yield promiseNewWindowLoaded();
+
+ // Load some URL in the current tab.
+ let flags = Ci.nsIWebNavigation.LOAD_FLAGS_REPLACE_HISTORY;
+ win.gBrowser.selectedBrowser.loadURIWithFlags("about:robots", flags);
+ yield promiseBrowserLoaded(win.gBrowser.selectedBrowser);
+
+ // Open a second tab and close the first one.
+ let tab = win.gBrowser.addTab("about:mozilla");
+ yield promiseBrowserLoaded(tab.linkedBrowser);
+ yield TabStateFlusher.flush(tab.linkedBrowser);
+ yield promiseRemoveTab(win.gBrowser.tabs[0]);
+
+ // Make sure our window is still tracked by sessionstore
+ // and the window state is as expected.
+ ok("__SSi" in win, "window is being tracked by sessionstore");
+ ss.setWindowValue(win, "foo", "bar");
+ checkWindowState(win);
+
+ let state = ss.getWindowState(win);
+ let closedTabData = ss.getClosedTabData(win);
+
+ // Close our window.
+ yield BrowserTestUtils.closeWindow(win);
+
+ // SessionStore should no longer track our window
+ // but it should still report the same state.
+ ok(!("__SSi" in win), "sessionstore does no longer track our window");
+ checkWindowState(win);
+
+ // Make sure we're not allowed to modify state data.
+ Assert.throws(() => ss.setWindowState(win, {}),
+ "we're not allowed to modify state data anymore");
+ Assert.throws(() => ss.setWindowValue(win, "foo", "baz"),
+ "we're not allowed to modify state data anymore");
+});
+
+function checkWindowState(window) {
+ let {windows: [{tabs}]} = JSON.parse(ss.getWindowState(window));
+ is(tabs.length, 1, "the window has a single tab");
+ is(tabs[0].entries[0].url, "about:mozilla", "the tab is about:mozilla");
+
+ is(ss.getClosedTabCount(window), 1, "the window has one closed tab");
+ let [{state: {entries: [{url}]}}] = JSON.parse(ss.getClosedTabData(window));
+ is(url, "about:robots", "the closed tab is about:robots");
+
+ is(ss.getWindowValue(window, "foo"), "bar", "correct extData value");
+}
+
+function shouldThrow(f) {
+ try {
+ f();
+ } catch (e) {
+ return true;
+ }
+}