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