diff --git a/devtools/client/responsive.html/browser/swap.js b/devtools/client/responsive.html/browser/swap.js index ba78a0a18467..d00bbbbe199d 100644 --- a/devtools/client/responsive.html/browser/swap.js +++ b/devtools/client/responsive.html/browser/swap.js @@ -5,6 +5,7 @@ "use strict"; const { Ci } = require("chrome"); +const { E10SUtils } = require("resource://gre/modules/E10SUtils.jsm"); const { tunnelToInnerBrowser } = require("./tunnel"); function debug(msg) { @@ -89,9 +90,32 @@ function swapToInnerBrowser({ tab, containerURL, getInnerBrowser }) { } }; + // Wait for a browser to load into a new frame loader. + function loadURIWithNewFrameLoader(browser, uri, options) { + return new Promise(resolve => { + gBrowser.addEventListener("XULFrameLoaderCreated", resolve, { once: true }); + browser.loadURI(uri, options); + }); + } + return { async start() { + // In some cases, such as a preloaded browser used for about:newtab, browser code + // will force a new frameloader on next navigation to ensure balanced process + // assignment. If this case will happen here, navigate to about:blank first to get + // this out of way so that we stay within one process while RDM is open. + let { newFrameloader } = E10SUtils.shouldLoadURIInBrowser( + tab.linkedBrowser, + "about:blank" + ); + if (newFrameloader) { + debug(`Tab will force a new frameloader on navigation, load about:blank first`); + await loadURIWithNewFrameLoader(tab.linkedBrowser, "about:blank", { + flags: Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_HISTORY, + }); + } + tab.isResponsiveDesignMode = true; // Hide the browser content temporarily while things move around to avoid displaying