diff -r 000000000000 -r 6474c204b198 browser/components/sessionstore/test/browser_dying_cache.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browser/components/sessionstore/test/browser_dying_cache.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,80 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +function test() { + TestRunner.run(); +} + +/** + * 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. + */ + +function runTests() { + // Open a new window. + let win = OpenBrowserWindow(); + yield whenDelayedStartupFinished(win, next); + + // Load some URL in the current tab. + let flags = Ci.nsIWebNavigation.LOAD_FLAGS_REPLACE_HISTORY; + win.gBrowser.selectedBrowser.loadURIWithFlags("about:robots", flags); + yield whenBrowserLoaded(win.gBrowser.selectedBrowser); + + // Open a second tab and close the first one. + let tab = win.gBrowser.addTab("about:mozilla"); + yield whenBrowserLoaded(tab.linkedBrowser); + SyncHandlers.get(tab.linkedBrowser).flush(); + win.gBrowser.removeTab(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 and wait a tick. + whenWindowClosed(win); + yield win.close(); + + // 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. + ok(shouldThrow(() => ss.setWindowState(win, {})), + "we're not allowed to modify state data anymore"); + ok(shouldThrow(() => 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; + } +} + +function whenWindowClosed(window) { + window.addEventListener("SSWindowClosing", function onClosing() { + window.removeEventListener("SSWindowClosing", onClosing); + executeSoon(next); + }); +}