gecko-dev/docshell/test/browser/browser_frameloader_swap_with_bfcache.js
Olli Pettay 67eda3a866 Bug 1697838, explictly evict bfcache when doing a frameloader swap r=peterv
This is in practice the behavior already, because swap is really a move and removing the old tab, and
when removing the other tab, the bfcached frameloaders are destroyed. But they stay still in the session history.
So this patch clears session history explicitly.

As long as we have message managers, we can't really support bfcache in this case, since we can't swap message managers,
there are no corresponding managers on the other side.
Message managers need to stay always in the original window, since the listeners are from there.

WindowActors do move with frameloader/browsingcontext, but that leads easily to memory leaks.
https://bugzilla.mozilla.org/show_bug.cgi?id=1697918 is about that and it has nothing to do with bfcache.

Differential Revision: https://phabricator.services.mozilla.com/D108273
2021-03-24 18:57:14 +00:00

38 lines
1.4 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
add_task(async function test() {
if (
!SpecialPowers.Services.appinfo.sessionHistoryInParent ||
!SpecialPowers.Services.prefs.getBoolPref("fission.bfcacheInParent")
) {
ok(
true,
"This test is currently only for the bfcache in the parent process."
);
return;
}
const uri =
"data:text/html,<script>onpageshow = function(e) { document.documentElement.setAttribute('persisted', e.persisted); }; </script>";
let tab1 = await BrowserTestUtils.openNewForegroundTab(gBrowser, uri, true);
let browser1 = tab1.linkedBrowser;
let tab2 = await BrowserTestUtils.openNewForegroundTab(gBrowser, uri, true);
let browser2 = tab2.linkedBrowser;
BrowserTestUtils.loadURI(browser2, uri + "nextpage");
await BrowserTestUtils.browserLoaded(browser2, false);
gBrowser.swapBrowsersAndCloseOther(tab1, tab2);
is(tab1.linkedBrowser, browser1, "Tab's browser should stay the same.");
browser1.goBack(false);
await BrowserTestUtils.browserLoaded(browser1, false);
let persisted = await SpecialPowers.spawn(browser1, [], async function() {
return content.document.documentElement.getAttribute("persisted");
});
is(persisted, "false", "BFCache should be evicted when swapping browsers.");
BrowserTestUtils.removeTab(tab1);
});