Bug 1599579 - Part 6: Handle process switches in talos pageloader.js, r=mconley,perftest-reviewers,Bebe

This is done by reloading framescripts and re-attaching message listeners when
process switch events are fired.

Differential Revision: https://phabricator.services.mozilla.com/D81136
This commit is contained in:
Nika Layzell 2020-06-30 15:55:49 +00:00
parent 9ba0e21272
commit 35d83dbe5a

View File

@ -110,7 +110,7 @@ SingleTimeout.prototype.clear = function() {
var failTimeout = new SingleTimeout(); var failTimeout = new SingleTimeout();
function plInit() { async function plInit() {
if (running) { if (running) {
return; return;
} }
@ -212,118 +212,52 @@ function plInit() {
// get our window out of the way // get our window out of the way
window.resizeTo(10, 10); window.resizeTo(10, 10);
var browserLoadFunc = function(ev) { await new Promise(resolve => {
browserWindow.removeEventListener("load", browserLoadFunc, true); browserWindow.addEventListener("load", resolve, {
capture: true,
once: true,
});
});
// do this half a second after load, because we need to be // do this half a second after load, because we need to be
// able to resize the window and not have it get clobbered // able to resize the window and not have it get clobbered
// by the persisted values // by the persisted values
setTimeout(function() { await new Promise(resolve => setTimeout(resolve, 500));
// Since bug 1261842, the initial browser is remote unless it attempts
// to browse to a URI that should be non-remote (landed at bug 1047603).
//
// However, when it loads a URI that requires a different remote type,
// we lose the load listener and the injected tpRecordTime.remote,
//
// It also probably means that per test (or, in fact, per pageloader browser
// instance which adds the load listener and injects tpRecordTime), all the
// pages should be able to load in the same mode as the initial page - due
// to this reinitialization on the switch.
let remoteType = E10SUtils.getRemoteTypeForURI(
pageUrls[0],
/* remote */ true,
/* fission */ Services.prefs.getBoolPref("fission.autostart")
);
let tabbrowser = browserWindow.gBrowser;
if (remoteType) {
tabbrowser.updateBrowserRemoteness(tabbrowser.selectedBrowser, {
remoteType,
});
} else {
tabbrowser.updateBrowserRemoteness(tabbrowser.selectedBrowser, {
remoteType: E10SUtils.NOT_REMOTE,
});
}
browserWindow.resizeTo(winWidth, winHeight); browserWindow.resizeTo(winWidth, winHeight);
browserWindow.moveTo(0, 0); browserWindow.moveTo(0, 0);
browserWindow.focus(); browserWindow.focus();
content = browserWindow.gBrowser; content = browserWindow.gBrowser;
content.selectedBrowser.messageManager.loadFrameScript(
"chrome://pageloader/content/utils.js",
false,
true
);
// pick the right load handler // Since bug 1261842, the initial browser is remote unless it attempts
if (useFNBPaint) { // to browse to a URI that should be non-remote (landed at bug 1047603).
content.selectedBrowser.messageManager.loadFrameScript( //
"chrome://pageloader/content/lh_fnbpaint.js", // However, when it loads a URI that requires a different remote type,
false, // we lose the load listener and the injected tpRecordTime.remote,
true //
); // This listener will listen for when one of these process switches has
} else if (useMozAfterPaint) { // happened, and re-install these listeners and injected methods into
content.selectedBrowser.messageManager.loadFrameScript( // the new browser tab.
"chrome://pageloader/content/lh_moz.js", //
false, // It also probably means that per test (or, in fact, per pageloader browser
true // instance which adds the load listener and injects tpRecordTime), all the
); // pages should be able to load in the same mode as the initial page - due
} else if (useHero) { // to this reinitialization on the switch.
content.selectedBrowser.messageManager.loadFrameScript( let tab = content.selectedTab;
"chrome://pageloader/content/lh_hero.js", tab.addEventListener("TabRemotenessChange", function(evt) {
false, loadFrameScripts(tab.linkedBrowser);
true });
); loadFrameScripts(tab.linkedBrowser);
} else if (usePDFPaint) {
content.selectedBrowser.messageManager.loadFrameScript(
"chrome://pageloader/content/lh_pdfpaint.js",
false,
true
);
} else {
content.selectedBrowser.messageManager.loadFrameScript(
"chrome://pageloader/content/lh_dummy.js",
false,
true
);
}
content.selectedBrowser.messageManager.loadFrameScript(
"chrome://pageloader/content/talos-content.js",
false
);
content.selectedBrowser.messageManager.loadFrameScript(
"resource://talos-powers/TalosContentProfiler.js",
false,
true
);
content.selectedBrowser.messageManager.loadFrameScript(
"chrome://pageloader/content/tscroll.js",
false,
true
);
content.selectedBrowser.messageManager.loadFrameScript(
"chrome://pageloader/content/Profiler.js",
false,
true
);
if (useA11y) {
content.selectedBrowser.messageManager.loadFrameScript(
"chrome://pageloader/content/a11y.js",
false,
true
);
}
// Ensure that any webextensions that need to do setup have a chance // Ensure that any webextensions that need to do setup have a chance
// to do so. e.g. the 'tabswitch' talos test registers a about:tabswitch // to do so. e.g. the 'tabswitch' talos test registers a about:tabswitch
// handler during initialization, and if we don't wait for that, then // handler during initialization, and if we don't wait for that, then
// attempting to load that URL will result in an error and hang the // attempting to load that URL will result in an error and hang the
// test. // test.
setTimeout(plLoadPage, 2000); for (let extension of WebExtensionPolicy.getActiveExtensions()) {
}, 500); await extension.readyPromise;
}; }
plLoadPage();
browserWindow.addEventListener("load", browserLoadFunc, true);
} catch (e) { } catch (e) {
dumpLine("pageloader exception: " + e); dumpLine("pageloader exception: " + e);
plStop(true); plStop(true);
@ -368,8 +302,30 @@ function plLoadPage() {
removeLastAddedMsgListener = null; removeLastAddedMsgListener = null;
} }
let tab = content.selectedTab;
tab.addEventListener("TabRemotenessChange", evt => {
addMsgListeners(tab.linkedBrowser);
});
addMsgListeners(tab.linkedBrowser);
failTimeout.register(loadFail, timeout);
// record which page we are about to open
TalosParentProfiler.mark("Opening " + pages[pageIndex].url.pathQueryRef);
if (useFNBPaint) {
isFNBPaintPending = true;
}
if (usePDFPaint) {
isPDFPaintPending = true;
}
startAndLoadURI(pageName);
}
function addMsgListeners(browser) {
let mm = browser.messageManager;
// messages to watch for page load // messages to watch for page load
let mm = content.selectedBrowser.messageManager;
mm.addMessageListener("PageLoader:LoadEvent", ContentListener); mm.addMessageListener("PageLoader:LoadEvent", ContentListener);
mm.addMessageListener("PageLoader:RecordTime", ContentListener); mm.addMessageListener("PageLoader:RecordTime", ContentListener);
mm.addMessageListener("PageLoader:IdleCallbackSet", ContentListener); mm.addMessageListener("PageLoader:IdleCallbackSet", ContentListener);
@ -386,19 +342,45 @@ function plLoadPage() {
); );
mm.removeMessageListener("PageLoader:Error", ContentListener); mm.removeMessageListener("PageLoader:Error", ContentListener);
}; };
failTimeout.register(loadFail, timeout); }
// record which page we are about to open
TalosParentProfiler.mark("Opening " + pages[pageIndex].url.pathQueryRef);
function loadFrameScripts(browser) {
let mm = browser.messageManager;
// Load our frame scripts.
mm.loadFrameScript("chrome://pageloader/content/utils.js", false, true);
// pick the right load handler
if (useFNBPaint) { if (useFNBPaint) {
isFNBPaintPending = true; mm.loadFrameScript(
"chrome://pageloader/content/lh_fnbpaint.js",
false,
true
);
} else if (useMozAfterPaint) {
mm.loadFrameScript("chrome://pageloader/content/lh_moz.js", false, true);
} else if (useHero) {
mm.loadFrameScript("chrome://pageloader/content/lh_hero.js", false, true);
} else if (usePDFPaint) {
mm.loadFrameScript(
"chrome://pageloader/content/lh_pdfpaint.js",
false,
true
);
} else {
mm.loadFrameScript("chrome://pageloader/content/lh_dummy.js", false, true);
} }
mm.loadFrameScript("chrome://pageloader/content/talos-content.js", false);
if (usePDFPaint) { mm.loadFrameScript(
isPDFPaintPending = true; "resource://talos-powers/TalosContentProfiler.js",
false,
true
);
mm.loadFrameScript("chrome://pageloader/content/tscroll.js", false, true);
mm.loadFrameScript("chrome://pageloader/content/Profiler.js", false, true);
if (useA11y) {
mm.loadFrameScript("chrome://pageloader/content/a11y.js", false, true);
} }
startAndLoadURI(pageName);
} }
function startAndLoadURI(pageName) { function startAndLoadURI(pageName) {