diff options
Diffstat (limited to 'dom/base/test/browser_aboutnewtab_process_selection.js')
-rw-r--r-- | dom/base/test/browser_aboutnewtab_process_selection.js | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/dom/base/test/browser_aboutnewtab_process_selection.js b/dom/base/test/browser_aboutnewtab_process_selection.js new file mode 100644 index 0000000000..101f408483 --- /dev/null +++ b/dom/base/test/browser_aboutnewtab_process_selection.js @@ -0,0 +1,137 @@ +const TEST_URL = "http://www.example.com/browser/dom/base/test/dummy.html"; +const TEST_URL_2 = "http://example.org/browser/dom/base/test/dummy.html"; +const PRELOADED_STATE = "preloaded"; + +var ppmm = Services.ppmm; + +add_task(async function () { + // We want to count processes in this test, so let's disable the pre-allocated process manager. + await SpecialPowers.pushPrefEnv({ + set: [ + ["dom.ipc.processPrelaunch.enabled", false], + ["dom.ipc.processCount", 10], + ["dom.ipc.processCount.webIsolated", 10], + ["dom.ipc.keepProcessesAlive.web", 10], + ], + }); +}); + +add_task(async function () { + // This test is only relevant in e10s. + if (!gMultiProcessBrowser) { + return; + } + + ppmm.releaseCachedProcesses(); + + // Wait for the preloaded browser to load. + await BrowserTestUtils.maybeCreatePreloadedBrowser(gBrowser); + + // Store the number of processes. + let expectedChildCount = ppmm.childCount; + + // Open 3 tabs using the preloaded browser. + let tabs = []; + for (let i = 0; i < 3; i++) { + BrowserOpenTab(); + tabs.unshift(gBrowser.selectedTab); + await BrowserTestUtils.maybeCreatePreloadedBrowser(gBrowser); + + // Check that the process count did not change. + is( + ppmm.childCount, + expectedChildCount, + "Preloaded browser should not create a new content process." + ); + } + + // Navigate to a content page from the parent side. + // + // We should create a new content process. + expectedChildCount += 1; + BrowserTestUtils.loadURIString(tabs[0].linkedBrowser, TEST_URL); + await BrowserTestUtils.browserLoaded(tabs[0].linkedBrowser, false, TEST_URL); + is( + ppmm.childCount, + expectedChildCount, + "Navigating away from the preloaded browser (parent side) should create a new content process." + ); + + // Navigate to the same content page from the child side. + // + // We should create a new content process. + expectedChildCount += 1; + await BrowserTestUtils.switchTab(gBrowser, tabs[1]); + await SpecialPowers.spawn(tabs[1].linkedBrowser, [TEST_URL], url => { + content.location.href = url; + }); + await BrowserTestUtils.browserLoaded(tabs[1].linkedBrowser, false, TEST_URL); + is( + ppmm.childCount, + expectedChildCount, + "Navigating away from the preloaded browser (child side, same-origin) should create a new content process." + ); + + // Navigate to a new content page from the child side. + // + // We should create a new content process. + expectedChildCount += 1; + await BrowserTestUtils.switchTab(gBrowser, tabs[2]); + await ContentTask.spawn(tabs[2].linkedBrowser, TEST_URL_2, url => { + content.location.href = url; + }); + await BrowserTestUtils.browserLoaded( + tabs[2].linkedBrowser, + false, + TEST_URL_2 + ); + is( + ppmm.childCount, + expectedChildCount, + "Navigating away from the preloaded browser (child side, cross-origin) should create a new content process." + ); + + for (let tab of tabs) { + BrowserTestUtils.removeTab(tab); + } + + // Make sure the preload browser does not keep any of the new processes alive. + NewTabPagePreloading.removePreloadedBrowser(window); + + // Since we kept alive all the processes, we can shut down the ones that do + // not host any tabs reliably. + ppmm.releaseCachedProcesses(); +}); + +add_task(async function preloaded_state_attribute() { + // Wait for a preloaded browser to exist, use it, and then create another one + await BrowserTestUtils.maybeCreatePreloadedBrowser(gBrowser); + let preloadedTabState = + gBrowser.preloadedBrowser.getAttribute("preloadedState"); + is( + preloadedTabState, + PRELOADED_STATE, + "Sanity check that the first preloaded browser has the correct attribute" + ); + + BrowserOpenTab(); + await BrowserTestUtils.maybeCreatePreloadedBrowser(gBrowser); + + // Now check that the tabs have the correct browser attributes set + is( + gBrowser.selectedBrowser.hasAttribute("preloadedState"), + false, + "The opened tab consumed the preloaded browser and removed the attribute" + ); + + preloadedTabState = gBrowser.preloadedBrowser.getAttribute("preloadedState"); + is( + preloadedTabState, + PRELOADED_STATE, + "The preloaded browser has the correct attribute" + ); + + // Remove tabs and preloaded browsers + BrowserTestUtils.removeTab(gBrowser.selectedTab); + NewTabPagePreloading.removePreloadedBrowser(window); +}); |