mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-19 00:05:36 +00:00
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:
parent
9ba0e21272
commit
35d83dbe5a
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user