Bug 1425311 - Add pageloader support for multiple hero measurements per page (WIP)
MozReview-Commit-ID: piGUOyR1hQ
--- a/testing/talos/talos/pageloader/chrome/lh_hero.js
+++ b/testing/talos/talos/pageloader/chrome/lh_hero.js
@@ -1,14 +1,18 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
function _contentHeroHandler() {
+ // we need to find out what hero element tags we are observing, this is talos 'heroList'
+ dump("* RW * about to ask for hero list\n");
+ sendAsyncMessage("PageLoader:GetHeroList");
+
var obs = null;
var el = content.window.document.querySelector("[elementtiming]");
if (el) {
function callback(entries, observer) {
entries.forEach(entry => {
sendAsyncMessage("PageLoader:LoadEvent",
{"time": Date.now(), // eslint-disable-line
"name": "tphero"});
@@ -25,10 +29,22 @@ function _contentHeroHandler() {
}
} else {
var err = "Could not find a tag with an elmenttiming attr on the page";
sendAsyncMessage("PageLoader:Error", {"msg": err});
}
return obs;
}
+// handle receiving hero element list
+try {
+ function handleMessageFromChrome(message) {
+ var payload = message.data.details;
+ // testScroll(payload.target, payload.stepSize, "PageLoader:RecordTime", payload.opt_numSteps);
+ dump("\n* RW * received payload!!");
+ var heroList = payload.measure;
+ dump(heroList);
+ }
+ dump("\n* RW * adding message listener for PageLoader:HeroList\n");
+ addMessageListener("PageLoader:HeroList", handleMessageFromChrome);
+} catch (e) {}
addEventListener("load", contentLoadHandlerCallback(_contentHeroHandler), true); // eslint-disable-line no-undef
--- a/testing/talos/talos/pageloader/chrome/pageloader.js
+++ b/testing/talos/talos/pageloader/chrome/pageloader.js
@@ -27,16 +27,17 @@ var report;
var timeout = -1;
var delay = 250;
var running = false;
var forceCC = true;
var useMozAfterPaint = false;
var useFNBPaint = false;
var useHero = false;
+var heroList = null;
var gPaintWindow = window;
var gPaintListener = false;
var loadNoCache = false;
var scrollTest = false;
var profilingInfo = false;
var baseVsRef = false;
var useBrowserChrome = false;
@@ -125,17 +126,22 @@ function plInit() {
dumpLine("tp abort: talos.tpmanifest browser pref is not set");
plStop(true);
}
NUM_CYCLES = Services.prefs.getIntPref("talos.tpcycles", 1);
numPageCycles = Services.prefs.getIntPref("talos.tppagecycles", 1);
timeout = Services.prefs.getIntPref("talos.tptimeout", -1);
useMozAfterPaint = Services.prefs.getBoolPref("talos.tpmozafterpaint", false);
- useHero = Services.prefs.getBoolPref("talos.tphero", false);
+ heroList = Services.prefs.getCharPref("talos.tphero", null);
+ dumpLine("* RW * heroList is");
+ dumpLine(heroList);
+ if (heroList !== null) {
+ useHero = true;
+ }
useFNBPaint = Services.prefs.getBoolPref("talos.fnbpaint", false);
loadNoCache = Services.prefs.getBoolPref("talos.tploadnocache", false);
scrollTest = Services.prefs.getBoolPref("talos.tpscrolltest", false);
useBrowserChrome = Services.prefs.getBoolPref("talos.tpchrome", false);
// for pageloader tests the profiling info is found in an env variable
// because it is not available early enough to set it as a browser pref
var env = Components.classes["@mozilla.org/process/environment;1"].
@@ -230,16 +236,17 @@ function plInit() {
// pick the right load handler
if (useFNBPaint) {
content.selectedBrowser.messageManager.loadFrameScript("chrome://pageloader/content/lh_fnbpaint.js", false, true);
} else if (useMozAfterPaint) {
content.selectedBrowser.messageManager.loadFrameScript("chrome://pageloader/content/lh_moz.js", false, true);
} else if (useHero) {
content.selectedBrowser.messageManager.loadFrameScript("chrome://pageloader/content/lh_hero.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("chrome://pageloader/content/tscroll.js", false, true);
content.selectedBrowser.messageManager.loadFrameScript("chrome://pageloader/content/Profiler.js", false, true);
@@ -261,16 +268,17 @@ function plPageFlags() {
var ContentListener = {
receiveMessage(message) {
switch (message.name) {
case "PageLoader:LoadEvent": return plLoadHandlerMessage(message);
case "PageLoader:Error": return plErrorMessage(message);
case "PageLoader:RecordTime": return plRecordTimeMessage(message);
case "PageLoader:IdleCallbackSet": return plIdleCallbackSet();
case "PageLoader:IdleCallbackReceived": return plIdleCallbackReceived();
+ case "PageLoader:GetHeroList": return plGetHeroList();
}
return undefined;
},
};
// load the current page, start timing
var removeLastAddedListener = null;
var removeLastAddedMsgListener = null;
@@ -293,23 +301,25 @@ function plLoadPage() {
// messages to watch for page load
let mm = content.selectedBrowser.messageManager;
mm.addMessageListener("PageLoader:LoadEvent", ContentListener);
mm.addMessageListener("PageLoader:RecordTime", ContentListener);
mm.addMessageListener("PageLoader:IdleCallbackSet", ContentListener);
mm.addMessageListener("PageLoader:IdleCallbackReceived", ContentListener);
mm.addMessageListener("PageLoader:Error", ContentListener);
+ mm.addMessageListener("PageLoader:GetHeroList", ContentListener);
removeLastAddedMsgListener = function() {
mm.removeMessageListener("PageLoader:LoadEvent", ContentListener);
mm.removeMessageListener("PageLoader:RecordTime", ContentListener);
mm.removeMessageListener("PageLoader:IdleCallbackSet", ContentListener);
mm.removeMessageListener("PageLoader:IdleCallbackReceived", ContentListener);
mm.removeMessageListener("PageLoader:Error", ContentListener);
+ mm.removeMessageListener("PageLoader:GetHeroList", ContentListener);
};
failTimeout.register(loadFail, timeout);
// record which page we are about to open
TalosParentProfiler.mark("Opening " + pages[pageIndex].url.pathQueryRef);
startAndLoadURI(pageName);
}
@@ -333,16 +343,24 @@ function getTestName() { // returns tp5n
var pageName = pages[pageIndex].url.spec;
let parts = pageName.split("/");
if (parts.length > 4) {
return parts[4];
}
return "pageloader";
}
+function plGetHeroList() {
+ // content is requesting the list of hero element tags to be measured
+ dumpLine("* RW * we have been asked for the hero list!");
+ let details = {measure: heroList};
+ let mm = content.selectedBrowser.messageManager;
+ mm.sendAsyncMessage("PageLoader:HeroList", { details });
+}
+
function getCurrentPageShortName() {
// this is also used by gecko profiling for the profile
// file name; so ensure it is valid on Windows/Linux/OSX
var pageName = pages[pageIndex].url.spec;
let parts = pageName.split("/");
if (parts.length > 5) {
if (parts[5].indexOf("?" != -1)) {
// page name is something like 'tpaint.html?auto=1'
@@ -728,16 +746,17 @@ function plStopAll(force) {
content.removeEventListener("MozAfterPaint", plPaintedCapturing, true);
content.removeEventListener("MozAfterPaint", plPainted, true);
}
let mm = content.selectedBrowser.messageManager;
mm.removeMessageListener("PageLoader:LoadEvent", ContentListener);
mm.removeMessageListener("PageLoader:RecordTime", ContentListener);
mm.removeMessageListener("PageLoader:Error", ContentListener);
+ mm.removeMessageListener("PageLoader:GetHeroList", ContentListener);
if (isIdleCallbackPending) {
mm.removeMessageListener("PageLoader:IdleCallbackSet", ContentListener);
mm.removeMessageListener("PageLoader:IdleCallbackReceived", ContentListener);
}
mm.loadFrameScript("data:,removeEventListener('load', _contentLoadHandler, true);", false, true);
}
--- a/testing/talos/talos/run_tests.py
+++ b/testing/talos/talos/run_tests.py
@@ -48,30 +48,35 @@ def set_tp_preferences(test, browser_con
# if profiling is on, override tppagecycles to prevent test hanging
if test['gecko_profile']:
LOG.info("Gecko profiling is enabled so talos is reducing the number "
"of cycles, please disregard reported numbers")
for cycle_var in ['tppagecycles', 'tpcycles', 'cycles']:
if test[cycle_var] > 2:
test[cycle_var] = 2
- CLI_bool_options = ['tpchrome', 'tphero', 'tpmozafterpaint', 'tploadnocache', 'tpscrolltest',
+ CLI_bool_options = ['tpchrome', 'tpmozafterpaint', 'tploadnocache', 'tpscrolltest',
'fnbpaint']
CLI_options = ['tpcycles', 'tppagecycles', 'tptimeout', 'tpmanifest']
for key in CLI_bool_options:
if key in test:
_pref_name = "talos.%s" % key
test['preferences'][_pref_name] = test.get(key)
for key in CLI_options:
value = test.get(key)
if value:
_pref_name = "talos.%s" % key
test['preferences'][_pref_name] = value
+ # for tphero, it's a list of hero element tags to measure; convert to string
+ _tphero = test.get('tphero', None)
+ if _tphero is not None:
+ test['preferences']['talos.tphero'] = ','.join(_tphero)
+
def setup_webserver(webserver):
"""use mozhttpd to setup a webserver"""
LOG.info("starting webserver on %r" % webserver)
host, port = webserver.split(':')
return mozhttpd.MozHttpd(host=host, port=int(port), docroot=here)
--- a/testing/talos/talos/test.py
+++ b/testing/talos/talos/test.py
@@ -887,17 +887,18 @@ class perf_reftest_singletons(Pageloader
@register_test()
class tp6_google(QuantumPageloadTest):
"""
Quantum Pageload Test - Google
"""
tpmanifest = '${talos}/tests/quantum_pageload/quantum_pageload_google.manifest'
fnbpaint = False
- tphero = True
+ # list of hero elementtiming tags that we want to measure
+ tphero = ["hero1", "hero2"]
@register_test()
class tp6_google_heavy(tp6_google):
"""
tp6_google test ran against a heavy-user profile
"""
profile = 'simple'