Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

"use strict";
// A page that holds cookieStore and receives cookie changes while it is in
// the bfcache must not be leaked once its bfcache entry is evicted.
const TEST_URL_OTHER_SITE =
"https://example.org/" + TEST_PATH + "file_empty.html";
async function forceGCAndCC(browser) {
await SpecialPowers.spawn(browser, [], () => {
for (let i = 0; i < 3; i++) {
Cu.forceGC();
Cu.forceCC();
}
});
}
function getDeadWindowReports(marker) {
let mgr = Cc["@mozilla.org/memory-reporter-manager;1"].getService(
Ci.nsIMemoryReporterManager
);
let paths = new Set();
return new Promise(resolve => {
mgr.getReports(
(process, path) => {
if (
path.startsWith("explicit/window-objects/top(none)/") &&
path.includes(marker)
) {
paths.add(path.split("/window(")[1]?.split(")/")[0]);
}
},
null,
() => resolve([...paths]),
null,
false
);
});
}
add_task(async function test_bfcached_page_with_cookie_changes_is_freed() {
await SpecialPowers.pushPrefEnv({
set: [["dom.ipc.processCount.webIsolated", 1]],
});
let anchorTab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
TEST_TOP_PAGE
);
let marker = "bfcache-leak-" + Math.random().toString(36).slice(2);
let tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
TEST_TOP_PAGE + "?" + marker
);
await SpecialPowers.spawn(tab.linkedBrowser, [], () => {
content.wrappedJSObject.store = content.wrappedJSObject.cookieStore;
});
let loaded = BrowserTestUtils.browserLoaded(
tab.linkedBrowser,
false,
TEST_URL_OTHER_SITE
);
BrowserTestUtils.startLoadingURIString(
tab.linkedBrowser,
TEST_URL_OTHER_SITE
);
await loaded;
await SpecialPowers.spawn(anchorTab.linkedBrowser, [], () => {
for (let i = 0; i < 10; i++) {
content.document.cookie = `bfcache_leak_${i}=${i}`;
}
});
await TestUtils.waitForTick();
BrowserTestUtils.removeTab(tab);
await forceGCAndCC(anchorTab.linkedBrowser);
let dead = await getDeadWindowReports(marker);
Assert.deepEqual(dead, [], "The evicted bfcache page was freed");
await SpecialPowers.spawn(anchorTab.linkedBrowser, [], () => {
for (let i = 0; i < 10; i++) {
content.document.cookie = `bfcache_leak_${i}=; max-age=0`;
}
});
BrowserTestUtils.removeTab(anchorTab);
});