diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /browser/components/sessionstore/test/browser_dying_cache.js | |
parent | Initial commit. (diff) | |
download | firefox-43a97878ce14b72f0981164f87f2e35e14151312.tar.xz firefox-43a97878ce14b72f0981164f87f2e35e14151312.zip |
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'browser/components/sessionstore/test/browser_dying_cache.js')
-rw-r--r-- | browser/components/sessionstore/test/browser_dying_cache.js | 80 |
1 files changed, 80 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 0000000000..ad2da69b9d --- /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.loadURI(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.getClosedTabCount(window), 1, "the window has one closed tab"); + let [ + { + state: { + entries: [{ url }], + }, + }, + ] = ss.getClosedTabData(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; +} |