Bug 1425311 - Add pageloader support for multiple hero measurements per page (WIP) draft
authorRob Wood <rwood@mozilla.com>
Wed, 07 Feb 2018 16:41:32 -0500
changeset 752320 6cd96f3c2b0609aee7835c89908fd52bd608d51a
parent 752319 1889332abc68656da75d1c9f0253e27b95f140ad
push id98222
push userrwood@mozilla.com
push dateWed, 07 Feb 2018 21:45:39 +0000
bugs1425311
milestone60.0a1
Bug 1425311 - Add pageloader support for multiple hero measurements per page (WIP) MozReview-Commit-ID: piGUOyR1hQ
testing/talos/talos/pageloader/chrome/lh_hero.js
testing/talos/talos/pageloader/chrome/pageloader.js
testing/talos/talos/run_tests.py
testing/talos/talos/test.py
--- 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'