diff options
Diffstat (limited to 'browser/components/sessionstore/test/browser_dying_cache.js')
-rw-r--r-- | browser/components/sessionstore/test/browser_dying_cache.js | 66 |
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; + } +} |