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 --- .../tabs/browser_bfcache_exemption_about_pages.js | 176 +++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 browser/base/content/test/tabs/browser_bfcache_exemption_about_pages.js (limited to 'browser/base/content/test/tabs/browser_bfcache_exemption_about_pages.js') diff --git a/browser/base/content/test/tabs/browser_bfcache_exemption_about_pages.js b/browser/base/content/test/tabs/browser_bfcache_exemption_about_pages.js new file mode 100644 index 0000000000..bcb872604c --- /dev/null +++ b/browser/base/content/test/tabs/browser_bfcache_exemption_about_pages.js @@ -0,0 +1,176 @@ +requestLongerTimeout(2); + +const BASE = getRootDirectory(gTestPath).replace( + "chrome://mochitests/content", + "https://example.com" +); + +async function navigateTo(browser, urls, expectedPersist) { + // Navigate to a bunch of urls + for (let url of urls) { + let loaded = BrowserTestUtils.browserLoaded(browser, false, url); + BrowserTestUtils.loadURIString(browser, url); + await loaded; + } + // When we track pageshow event, save the evt.persisted on a doc element, + // so it can be checked from the test directly. + let pageShowCheck = evt => { + evt.target.ownerGlobal.document.documentElement.setAttribute( + "persisted", + evt.persisted + ); + return true; + }; + is( + browser.canGoBack, + true, + `After navigating to urls=${urls}, we can go back from uri=${browser.currentURI.spec}` + ); + if (expectedPersist) { + // If we expect the page to persist, then the uri we are testing is about:blank. + // Currently we are only testing cases when we go forward to about:blank page, + // because it gets removed from history if it is sandwiched between two + // regular history entries. This means we can't test a scenario such as: + // page X, about:blank, page Y, go back -- about:blank page will be removed, and + // going back from page Y will take us to page X. + + // Go back from about:blank (it will be the last uri in 'urls') + let pageShowPromise = BrowserTestUtils.waitForContentEvent( + browser, + "pageshow" + ); + info(`Navigating back from uri=${browser.currentURI.spec}`); + browser.goBack(); + await pageShowPromise; + info(`Got pageshow event`); + // Now go forward + let forwardPageShow = BrowserTestUtils.waitForContentEvent( + browser, + "pageshow", + false, + pageShowCheck + ); + info(`Navigating forward from uri=${browser.currentURI.spec}`); + browser.goForward(); + await forwardPageShow; + // Check that the page got persisted + let persisted = await SpecialPowers.spawn(browser, [], async function () { + return content.document.documentElement.getAttribute("persisted"); + }); + is( + persisted, + expectedPersist.toString(), + `uri ${browser.currentURI.spec} should have persisted` + ); + } else { + // Go back + let pageShowPromise = BrowserTestUtils.waitForContentEvent( + browser, + "pageshow", + false, + pageShowCheck + ); + info(`Navigating back from uri=${browser.currentURI.spec}`); + browser.goBack(); + await pageShowPromise; + info(`Got pageshow event`); + // Check that the page did not get persisted + let persisted = await SpecialPowers.spawn(browser, [], async function () { + return content.document.documentElement.getAttribute("persisted"); + }); + is( + persisted, + expectedPersist.toString(), + `uri ${browser.currentURI.spec} shouldn't have persisted` + ); + } +} + +add_task(async function testAboutPagesExemptFromBfcache() { + // If Fission is disabled, the pref is no-op. + await SpecialPowers.pushPrefEnv({ set: [["fission.bfcacheInParent", true]] }); + + // Navigate to a bunch of urls, then go back once, check that the penultimate page did not go into BFbache + var browser; + // First page is about:privatebrowsing + const private_test_cases = [ + ["about:blank"], + ["about:blank", "about:privatebrowsing", "about:blank"], + ]; + for (const urls of private_test_cases) { + info(`Private tab - navigate to ${urls} urls`); + let win = await BrowserTestUtils.openNewBrowserWindow({ + private: true, + waitForTabURL: "about:privatebrowsing", + }); + browser = win.gBrowser.selectedTab.linkedBrowser; + await navigateTo(browser, urls, false); + await BrowserTestUtils.closeWindow(win); + } + + // First page is about:blank + const regular_test_cases = [ + ["about:home"], + ["about:home", "about:blank"], + ["about:blank", "about:newtab"], + ]; + for (const urls of regular_test_cases) { + info(`Regular tab - navigate to ${urls} urls`); + let win = await BrowserTestUtils.openNewBrowserWindow(); + let tab = await BrowserTestUtils.openNewForegroundTab({ + gBrowser: win.gBrowser, + opening: "about:newtab", + }); + browser = tab.linkedBrowser; + await navigateTo(browser, urls, false); + BrowserTestUtils.removeTab(tab); + await BrowserTestUtils.closeWindow(win); + } +}); + +// Test that about:blank or pages that have about:* subframes get bfcached. +// TODO bug 1705789: add about:reader tests when we make them bfcache compatible. +add_task(async function testAboutPagesBfcacheAllowed() { + // If Fission is disabled, the pref is no-op. + await SpecialPowers.pushPrefEnv({ set: [["fission.bfcacheInParent", true]] }); + + var browser; + // First page is about:privatebrowsing + // about:privatebrowsing -> about:blank, go back, go forward, - about:blank is bfcached + // about:privatebrowsing -> about:home -> about:blank, go back, go forward, - about:blank is bfcached + // about:privatebrowsing -> file_about_srcdoc.html, go back, go forward - file_about_srcdoc.html is bfcached + const private_test_cases = [ + ["about:blank"], + ["about:home", "about:blank"], + [BASE + "file_about_srcdoc.html"], + ]; + for (const urls of private_test_cases) { + info(`Private tab - navigate to ${urls} urls`); + let win = await BrowserTestUtils.openNewBrowserWindow({ + private: true, + waitForTabURL: "about:privatebrowsing", + }); + browser = win.gBrowser.selectedTab.linkedBrowser; + await navigateTo(browser, urls, true); + await BrowserTestUtils.closeWindow(win); + } + + // First page is about:blank + // about:blank -> about:home -> about:blank, go back, go forward, - about:blank is bfcached + // about:blank -> about:home -> file_about_srcdoc.html, go back, go forward - file_about_srcdoc.html is bfcached + const regular_test_cases = [ + ["about:home", "about:blank"], + ["about:home", BASE + "file_about_srcdoc.html"], + ]; + for (const urls of regular_test_cases) { + info(`Regular tab - navigate to ${urls} urls`); + let win = await BrowserTestUtils.openNewBrowserWindow(); + let tab = await BrowserTestUtils.openNewForegroundTab({ + gBrowser: win.gBrowser, + }); + browser = tab.linkedBrowser; + await navigateTo(browser, urls, true); + BrowserTestUtils.removeTab(tab); + await BrowserTestUtils.closeWindow(win); + } +}); -- cgit v1.2.3