summaryrefslogtreecommitdiffstats
path: root/dom/base/test/browser_aboutnewtab_process_selection.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/base/test/browser_aboutnewtab_process_selection.js')
-rw-r--r--dom/base/test/browser_aboutnewtab_process_selection.js137
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..ad59077105
--- /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.startLoadingURIString(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);
+});