From 36d22d82aa202bb199967e9512281e9a53db42c9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 21:33:14 +0200 Subject: Adding upstream version 115.7.0esr. Signed-off-by: Daniel Baumann --- .../sessionstore/test/browser_dying_cache.js | 80 ++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 browser/components/sessionstore/test/browser_dying_cache.js (limited to 'browser/components/sessionstore/test/browser_dying_cache.js') 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 0000000000..3b8a5b1197 --- /dev/null +++ b/browser/components/sessionstore/test/browser_dying_cache.js @@ -0,0 +1,80 @@ +"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(async function test() { + // Open a new window. + let win = await promiseNewWindowLoaded(); + + // Load some URL in the current tab. + let flags = Ci.nsIWebNavigation.LOAD_FLAGS_REPLACE_HISTORY; + BrowserTestUtils.loadURIString(win.gBrowser.selectedBrowser, "about:robots", { + flags, + }); + await promiseBrowserLoaded(win.gBrowser.selectedBrowser); + + // Open a second tab and close the first one. + let tab = BrowserTestUtils.addTab(win.gBrowser, "about:mozilla"); + await promiseBrowserLoaded(tab.linkedBrowser); + await TabStateFlusher.flush(tab.linkedBrowser); + await promiseRemoveTabAndSessionState(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.setCustomWindowValue(win, "foo", "bar"); + checkWindowState(win); + + // Close our window. + await 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, {}), + /Window is not tracked/, + "we're not allowed to modify state data anymore" + ); + Assert.throws( + () => ss.setCustomWindowValue(win, "foo", "baz"), + /Window is not tracked/, + "we're not allowed to modify state data anymore" + ); +}); + +function checkWindowState(window) { + let { + windows: [{ tabs }], + } = 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.getClosedTabCountForWindow(window), 1, "the window has one closed tab"); + let [ + { + state: { + entries: [{ url }], + }, + }, + ] = ss.getClosedTabDataForWindow(window); + is(url, "about:robots", "the closed tab is about:robots"); + + is(ss.getCustomWindowValue(window, "foo"), "bar", "correct extData value"); +} + +function shouldThrow(f) { + try { + f(); + } catch (e) { + return true; + } + return null; +} -- cgit v1.2.3