Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Errors

/* Any copyright is dedicated to the Public Domain.
"use strict";
const FocusManager = Services.focus;
const SITE_URL_1 =
getRootDirectory(gTestPath).replace(
) + "empty.html";
const SITE_URL_2 =
getRootDirectory(gTestPath).replace(
) + "empty.html";
// Test ensures that when a page goes to BFCache, it won't
// accidentally update the active browsing context to null to
// the parent process.
add_task(async function () {
// Load Site 1
const tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, SITE_URL_1);
BrowserTestUtils.startLoadingURIString(tab.linkedBrowser, SITE_URL_2);
// Navigated to Site 2 in the same tab
await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
const pageNavigatedBackToSite1 = BrowserTestUtils.waitForContentEvent(
tab.linkedBrowser,
"pageshow"
);
tab.linkedBrowser.goBack();
// Navigated site 1 by going back
await pageNavigatedBackToSite1;
const pageHideForSite1Run = SpecialPowers.spawn(tab.linkedBrowser, [], () => {
return new Promise(r => {
content.addEventListener("pagehide", function () {
const start = Date.now();
// block the main thread for 2 seconds.
while (Date.now() - start < 2000) {
r();
}
});
});
});
let pageNavigatedBackToSite2 = BrowserTestUtils.waitForContentEvent(
tab.linkedBrowser,
"pageshow"
);
// Navigate to site 2 again by going forward.
//
// In a buggy Firefox build, this navigation would trigger
// two activeBrowsingContextInChrome updates. One from
// site 1 to set it to nullptr, and one from the site 2
// to itself.
tab.linkedBrowser.goForward();
await pageNavigatedBackToSite2;
// Forcefully to make site 1 to update activeBrowsingContextInChrome
// after site 2.
await pageHideForSite1Run;
// Give the parent process some opportunities to update
// the activeBrowsingContextInChrome via IPC.
await new Promise(r => {
/* eslint-disable mozilla/no-arbitrary-setTimeout */
setTimeout(r, 2000);
});
Assert.ok(
!!FocusManager.activeContentBrowsingContext,
"active browsing context in content should be non-null"
);
BrowserTestUtils.removeTab(tab);
});