Bug 1363845 - Talos pageloader changes to support 'time to first non-blank paint' measurement for tp6; r=jmaher draft
authorRob Wood <rwood@mozilla.com>
Mon, 24 Jul 2017 13:19:03 -0400
changeset 615173 d55891ea083b53de427947ab5c28ca967a699391
parent 615105 07484bfdb96bc7297c404e377eea93f1d8ca4442
child 639095 85c0e96ddf1d6f5737691412007618c517ffed1a
push id70260
push userrwood@mozilla.com
push dateTue, 25 Jul 2017 15:44:37 +0000
reviewersjmaher
bugs1363845
milestone56.0a1
Bug 1363845 - Talos pageloader changes to support 'time to first non-blank paint' measurement for tp6; r=jmaher MozReview-Commit-ID: 4FX1uyMqtLh
testing/talos/talos/cmdline.py
testing/talos/talos/config.py
testing/talos/talos/pageloader/chrome/pageloader.js
testing/talos/talos/pageloader/components/tp-cmdline.js
testing/talos/talos/pageloader/install.rdf
testing/talos/talos/pageloader/pageloader-signed.xpi
testing/talos/talos/run_tests.py
testing/talos/talos/test.py
--- a/testing/talos/talos/cmdline.py
+++ b/testing/talos/talos/cmdline.py
@@ -120,17 +120,17 @@ def create_parser(mach_interface=False):
     add_arg('--setpref', action='append', default=[], dest="extraPrefs",
             metavar="PREF=VALUE",
             help="defines an extra user preference")
     add_arg('--mitmproxy',
             help='Test uses mitmproxy to serve the pages, specify the '
                  'path and name of the mitmdump file to playback')
     add_arg('--mitmdumpPath',
             help="Path to mitmproxy's mitmdump playback tool")
-    add_arg("--firstNonBlankPaint", action='store_true', dest="first_non_blank_paint",
+    add_arg("--firstNonBlankPaint", action='store_true', dest="fnbpaint",
             help="Wait for firstNonBlankPaint event before recording the time")
     add_arg('--webServer', dest='webserver',
             help="DEPRECATED")
     if not mach_interface:
         add_arg('--develop', action='store_true', default=False,
                 help="useful for running tests on a developer machine."
                      " Doesn't upload to the graph servers.")
     add_arg("--cycles", type=int,
--- a/testing/talos/talos/config.py
+++ b/testing/talos/talos/config.py
@@ -34,16 +34,17 @@ DEFAULTS = dict(
         resolution=1,
         rss=False,
         mainthread=False,
         shutdown=False,
         timeout=3600,
         tpchrome=True,
         tpcycles=10,
         tpmozafterpaint=False,
+        fnbpaint=False,
         firstpaint=False,
         userready=False,
         testeventmap=[],
         base_vs_ref=False,
         tpdisable_e10s=False,
         tpnoisy=True,
         tppagecycles=1,
         tploadnocache=False,
@@ -202,16 +203,17 @@ GLOBAL_OVERRIDES = (
     'mainthread',
     'shutdown',
     'tpcycles',
     'tpdelay',
     'tppagecycles',
     'tpmanifest',
     'tptimeout',
     'tpmozafterpaint',
+    'fnbpaint',
     'firstpaint',
     'userready',
 )
 
 
 CONF_VALIDATORS = []
 
 
@@ -356,23 +358,26 @@ def build_manifest(config, manifestName)
     # return new manifest
     return newManifestName
 
 
 def get_test(config, global_overrides, counters, test_instance):
     mozAfterPaint = getattr(test_instance, 'tpmozafterpaint', None)
     firstPaint = getattr(test_instance, 'firstpaint', None)
     userReady = getattr(test_instance, 'userready', None)
+    firstNonBlankPaint = getattr(test_instance, 'fnbpaint', None)
 
     test_instance.update(**global_overrides)
 
     # update original value of mozAfterPaint, this could be 'false',
     # so check for None
     if mozAfterPaint is not None:
         test_instance.tpmozafterpaint = mozAfterPaint
+    if firstNonBlankPaint is not None:
+        test_instance.fnbpaint = firstNonBlankPaint
     if firstPaint is not None:
         test_instance.firstpaint = firstPaint
     if userReady is not None:
         test_instance.userready = userReady
 
     # fix up url
     url = getattr(test_instance, 'url', None)
     if url:
--- a/testing/talos/talos/pageloader/chrome/pageloader.js
+++ b/testing/talos/talos/pageloader/chrome/pageloader.js
@@ -38,16 +38,17 @@ var report;
 var noisy = false;
 var timeout = -1;
 var delay = 250;
 var running = false;
 var forceCC = true;
 var reportRSS = true;
 
 var useMozAfterPaint = false;
+var useFNBPaint = false;
 var gPaintWindow = window;
 var gPaintListener = false;
 var loadNoCache = false;
 var scrollTest = false;
 var gDisableE10S = false;
 var gUseE10S = false;
 var profilingInfo = false;
 
@@ -144,16 +145,17 @@ function plInit() {
     if (args.numPageCycles) numPageCycles = parseInt(args.numPageCycles);
     if (args.width) winWidth = parseInt(args.width);
     if (args.height) winHeight = parseInt(args.height);
     if (args.filter) pageFilterRegexp = new RegExp(args.filter);
     if (args.noisy) noisy = true;
     if (args.timeout) timeout = parseInt(args.timeout);
     if (args.delay) delay = parseInt(args.delay);
     if (args.mozafterpaint) useMozAfterPaint = true;
+    if (args.fnbpaint) useFNBPaint = true;
     if (args.rss) reportRSS = true;
     if (args.loadnocache) loadNoCache = true;
     if (args.scrolltest) scrollTest = true;
     if (args.disableE10S) gDisableE10S = true;
     if (args.profilinginfo) profilingInfo = JSON.parse(args.profilinginfo)
 
     if (profilingInfo) {
       TalosParentProfiler.initFromObject(profilingInfo);
@@ -257,46 +259,66 @@ function plInit() {
         browserWindow.focus();
 
         content = browserWindow.getBrowser();
         gUseE10S = !gDisableE10S || (plPageFlags() & EXECUTE_SCROLL_TEST) ||
                     (content.selectedBrowser &&
                     content.selectedBrowser.getAttribute("remote") == "true")
 
         // Load the frame script for e10s / IPC message support
-        if (gUseE10S) {
-          let contentScript = "data:,function _contentLoadHandler(e) { " +
-            "  if (e.originalTarget.defaultView == content) { " +
-            "    content.wrappedJSObject.tpRecordTime = function(t, s, n) { sendAsyncMessage('PageLoader:RecordTime', { time: t, startTime: s, testName: n }); }; ";
-          if (useMozAfterPaint) {
-            contentScript += "" +
-            "function _contentPaintHandler() { " +
-            "  var utils = content.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindowUtils); " +
-            "  if (utils.isMozAfterPaintPending) { " +
-            "    addEventListener('MozAfterPaint', function(e) { " +
-            "      removeEventListener('MozAfterPaint', arguments.callee, true); " +
-            "      sendAsyncMessage('PageLoader:LoadEvent', {}); " +
-            "    }, true); " +
-            "  } else { " +
-            "    sendAsyncMessage('PageLoader:LoadEvent', {}); " +
-            "  } " +
-            "}; " +
-            "content.setTimeout(_contentPaintHandler, 0); ";
-          } else {
-            contentScript += "    sendAsyncMessage('PageLoader:LoadEvent', {}); ";
-          }
+        let contentScript = "data:,function _contentLoadHandler(e) { " +
+          "  if (e.originalTarget.defaultView == content) { " +
+          "    content.wrappedJSObject.tpRecordTime = function(t, s, n) { sendAsyncMessage('PageLoader:RecordTime', { time: t, startTime: s, testName: n }); }; ";
+        if (useFNBPaint) {
           contentScript += "" +
-            "  }" +
-            "} " +
-            "addEventListener('load', _contentLoadHandler, true); ";
-          content.selectedBrowser.messageManager.loadFrameScript(contentScript, 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://talos-powers-content/content/TalosContentProfiler.js", false, true);
+          "var gRetryCounter = 0; " +
+          "function _contentFNBPaintHandler() { " +
+          "  x = content.window.performance.timing.timeToNonBlankPaint; " +
+          "  if (typeof x == 'undefined') { " +
+          "    sendAsyncMessage('PageLoader:FNBPaintError', {}); " +
+          "  } " +
+          "  if (x > 0) { " +
+          "    sendAsyncMessage('PageLoader:LoadEvent', { 'fnbpaint': x }); " +
+          "  } else { " +
+          "    gRetryCounter += 1; " +
+          "    if (gRetryCounter <= 10) { " +
+          "      dump('fnbpaint is not yet available (0), retry number ' + gRetryCounter + '...\\n'); " +
+          "      content.setTimeout(_contentFNBPaintHandler, 100); " +
+          "    } else { " +
+          "      dump('unable to get a value for fnbpaint after ' + gRetryCounter + ' retries\\n'); " +
+          "      sendAsyncMessage('PageLoader:FNBPaintError', {}); " +
+          "    } " +
+          "  } " +
+          "}; " +
+          "content.setTimeout(_contentFNBPaintHandler, 0); ";
+        } else if (useMozAfterPaint) {
+          contentScript += "" +
+          "function _contentPaintHandler() { " +
+          "  var utils = content.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindowUtils); " +
+          "  if (utils.isMozAfterPaintPending) { " +
+          "    addEventListener('MozAfterPaint', function(e) { " +
+          "      removeEventListener('MozAfterPaint', arguments.callee, true); " +
+          "      sendAsyncMessage('PageLoader:LoadEvent', {}); " +
+          "    }, true); " +
+          "  } else { " +
+          "    sendAsyncMessage('PageLoader:LoadEvent', {}); " +
+          "  } " +
+          "}; " +
+          "content.setTimeout(_contentPaintHandler, 0); ";
+        } else {
+          contentScript += "    sendAsyncMessage('PageLoader:LoadEvent', {}); ";
         }
+        contentScript += "" +
+          "  }" +
+          "} " +
+          "addEventListener('load', _contentLoadHandler, true); ";
+        content.selectedBrowser.messageManager.loadFrameScript(contentScript, 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);
 
         if (reportRSS) {
           initializeMemoryCollector(plLoadPage, 100);
         } else {
           setTimeout(plLoadPage, 100);
         }
       }, 500);
     };
@@ -311,16 +333,17 @@ function plInit() {
 function plPageFlags() {
   return pages[pageIndex].flags;
 }
 
 var ContentListener = {
   receiveMessage(message) {
     switch (message.name) {
       case "PageLoader:LoadEvent": return plLoadHandlerMessage(message);
+      case "PageLoader:FNBPaintError": return plFNBPaintErrorMessage(message);
       case "PageLoader:RecordTime": return plRecordTimeMessage(message);
     }
     return undefined;
   },
 };
 
 // load the current page, start timing
 var removeLastAddedListener = null;
@@ -337,54 +360,31 @@ function plLoadPage() {
     removeLastAddedListener = null;
   }
 
   if (removeLastAddedMsgListener) {
     removeLastAddedMsgListener();
     removeLastAddedMsgListener = null;
   }
 
-  if ((plPageFlags() & TEST_DOES_OWN_TIMING) && !gUseE10S) {
-    // if the page does its own timing, use a capturing handler
-    // to make sure that we can set up the function for content to call
-
-    content.addEventListener("load", plLoadHandlerCapturing, true);
-    removeLastAddedListener = function() {
-      content.removeEventListener("load", plLoadHandlerCapturing, true);
-      if (useMozAfterPaint) {
-        content.removeEventListener("MozAfterPaint", plPaintedCapturing, true);
-        gPaintListener = false;
-      }
-    };
-  } else if (!gUseE10S) {
-    // if the page doesn't do its own timing, use a bubbling handler
-    // to make sure that we're called after the page's own onload() handling
-
-    // XXX we use a capturing event here too -- load events don't bubble up
-    // to the <browser> element.  See bug 390263.
-    content.addEventListener("load", plLoadHandler, true);
-    removeLastAddedListener = function() {
-      content.removeEventListener("load", plLoadHandler, true);
-      if (useMozAfterPaint) {
-        gPaintWindow.removeEventListener("MozAfterPaint", plPainted, true);
-        gPaintListener = false;
-      }
-    };
+  // messages to watch for page load
+  let mm = content.selectedBrowser.messageManager;
+  mm.addMessageListener("PageLoader:LoadEvent", ContentListener);
+  mm.addMessageListener("PageLoader:RecordTime", ContentListener);
+  if (useFNBPaint) {
+    mm.addMessageListener("PageLoader:FNBPaintError", ContentListener);
   }
 
-  // If the test browser is remote (e10s / IPC) we need to use messages to watch for page load
-  if (gUseE10S) {
-    let mm = content.selectedBrowser.messageManager;
-    mm.addMessageListener("PageLoader:LoadEvent", ContentListener);
-    mm.addMessageListener("PageLoader:RecordTime", ContentListener);
-    removeLastAddedMsgListener = function() {
-      mm.removeMessageListener("PageLoader:LoadEvent", ContentListener);
-      mm.removeMessageListener("PageLoader:RecordTime", ContentListener);
-    };
-  }
+  removeLastAddedMsgListener = function() {
+    mm.removeMessageListener("PageLoader:LoadEvent", ContentListener);
+    mm.removeMessageListener("PageLoader:RecordTime", ContentListener);
+    if (useFNBPaint) {
+      mm.removeMessageListener("PageLoader:FNBPaintError", ContentListener);
+    }
+  };
 
   failTimeout.register(loadFail, timeout);
 
   // record which page we are about to open
   TalosParentProfiler.mark("Opening " + pages[pageIndex].url.path);
 
   if (reportRSS) {
     collectMemory(startAndLoadURI, pageName);
@@ -648,41 +648,52 @@ function waitForPainted() {
 }
 
 function plPainted() {
   gPaintWindow.removeEventListener("MozAfterPaint", plPainted, true);
   gPaintListener = false;
   _loadHandler();
 }
 
-function _loadHandler() {
+function _loadHandler(fnbpaint = 0) {
   failTimeout.clear();
+  var end_time = 0;
 
-  var end_time = Date.now();
-  var time = (end_time - start_time);
+  if (fnbpaint !== 0) {
+    // window.performance.timing.timeToNonBlankPaint is a timestamp
+    end_time = fnbpaint;
+  } else {
+    end_time = Date.now();
+  }
+
+  var duration = (end_time - start_time);
 
   TalosParentProfiler.pause("Bubbling load handler fired.");
 
   // does this page want to do its own timing?
   // if so, we shouldn't be here
   if (plPageFlags() & TEST_DOES_OWN_TIMING) {
     dumpLine("tp: Bubbling onload handler used with page that does its own timing?");
     plStop(true);
   }
 
-  plRecordTime(time);
+  plRecordTime(duration);
 
   if (doRenderTest)
     runRenderTest();
 
   plNextPage();
 }
 
 // the core handler for remote (e10s) browser
-function plLoadHandlerMessage() {
+function plLoadHandlerMessage(message) {
+  let fnbpaint = 0;
+  if (message.json.fnbpaint !== undefined) {
+    fnbpaint = message.json.fnbpaint;
+  }
   failTimeout.clear();
 
   if ((plPageFlags() & EXECUTE_SCROLL_TEST)) {
     // Let the page settle down after its load event, then execute the scroll test.
     setTimeout(sendScroll, 500);
   } else if ((plPageFlags() & TEST_DOES_OWN_TIMING)) {
     var time;
 
@@ -700,32 +711,38 @@ function plLoadHandlerMessage() {
 
     if (time !== undefined) {
       plRecordTime(time);
       if (doRenderTest)
         runRenderTest();
       plNextPage();
     }
   } else {
-    _loadHandler();
+    _loadHandler(fnbpaint);
   }
 }
 
 // the record time handler used for remote (e10s) browser
 function plRecordTimeMessage(message) {
   gTime = message.json.time;
   gStartTime = message.json.startTime;
   recordedName = message.json.testName;
 
   if (useMozAfterPaint) {
     gStartTime = message.json.startTime;
   }
   _loadHandlerCapturing();
 }
 
+// error retrieving fnbpaint
+function plFNBPaintErrorMessage(message) {
+  dumpLine("Abort: firstNonBlankPaint value is not available after loading the page");
+  plStop(true);
+}
+
 function runRenderTest() {
   const redrawsPerSample = 500;
 
   if (!Ci.nsIDOMWindowUtils)
     return;
 
   var win;
 
@@ -773,27 +790,31 @@ function plStopAll(force) {
 
   if (reportRSS) {
     stopMemCollector();
   }
 
   if (content) {
     content.removeEventListener("load", plLoadHandlerCapturing, true);
     content.removeEventListener("load", plLoadHandler, true);
-    if (useMozAfterPaint)
+
+    if (useMozAfterPaint) {
       content.removeEventListener("MozAfterPaint", plPaintedCapturing, true);
       content.removeEventListener("MozAfterPaint", plPainted, true);
+    }
 
-    if (gUseE10S) {
-      let mm = content.selectedBrowser.messageManager;
-      mm.removeMessageListener("PageLoader:LoadEvent", ContentListener);
-      mm.removeMessageListener("PageLoader:RecordTime", ContentListener);
+    let mm = content.selectedBrowser.messageManager;
+    mm.removeMessageListener("PageLoader:LoadEvent", ContentListener);
+    mm.removeMessageListener("PageLoader:RecordTime", ContentListener);
 
-      mm.loadFrameScript("data:,removeEventListener('load', _contentLoadHandler, true);", false, true);
+    if (useFNBPaint) {
+      mm.removeMessageListener("PageLoader:FNBPaintError", ContentListener);
     }
+
+    mm.loadFrameScript("data:,removeEventListener('load', _contentLoadHandler, true);", false, true);
   }
 
   if (MozillaFileLogger && MozillaFileLogger._foStream)
     MozillaFileLogger.close();
 
   goQuitApplication();
 }
 
--- a/testing/talos/talos/pageloader/components/tp-cmdline.js
+++ b/testing/talos/talos/pageloader/components/tp-cmdline.js
@@ -92,16 +92,17 @@ PageLoaderCmdLineHandler.prototype =
       args.height = cmdLine.handleFlagWithParam("tpheight", false);
       args.profilinginfo = cmdLine.handleFlagWithParam("tpprofilinginfo", false);
       args.offline = cmdLine.handleFlag("tpoffline", false);
       args.noisy = cmdLine.handleFlag("tpnoisy", false);
       args.timeout = cmdLine.handleFlagWithParam("tptimeout", false);
       args.delay = cmdLine.handleFlagWithParam("tpdelay", false);
       args.noForceCC = cmdLine.handleFlag("tpnoforcecc", false);
       args.mozafterpaint = cmdLine.handleFlag("tpmozafterpaint", false);
+      args.fnbpaint = cmdLine.handleFlag("fnbpaint", false);
       args.loadnocache = cmdLine.handleFlag("tploadnocache", false);
       args.scrolltest = cmdLine.handleFlag("tpscrolltest", false);
       args.disableE10s = cmdLine.handleFlag("tpdisable_e10s", false);
       args.rss = cmdLine.handleFlag("rss", false);
     } catch (e) {
       return;
     }
 
@@ -111,36 +112,37 @@ PageLoaderCmdLineHandler.prototype =
     Services.ww.openWindow(null, chromeURL, "_blank",
                             "chrome,dialog=no,all", args);
 
     // Don't pass command line to the default app processor
     cmdLine.preventDefault = true;
   },
 
   helpInfo:
-  "  -tp <file>         Run pageload perf tests on given manifest\n" +
-  "  -tpfilter str      Only include pages from manifest that contain str (regexp)\n" +
-  "  -tpcycles n        Loop through pages n times\n" +
-  "  -tppagecycles n    Loop through each page n times before going onto the next page\n" +
-  "  -tpstart n         Start at index n in the manifest\n" +
-  "  -tpend n           End with index n in the manifest\n" +
-  "  -tpchrome          Test with normal browser chrome\n" +
-  "  -tprender          Run render-only benchmark for each page\n" +
-  "  -tpwidth width     Width of window\n" +
-  "  -tpheight height   Height of window\n" +
-  "  -tbprofilinginfo   A JSON object describing profiler settings\n" +
-  "  -tpoffline         Force offline mode\n" +
-  "  -tpnoisy           Dump the name of the last loaded page to console\n" +
-  "  -tptimeout         Max amount of time given for a page to load, quit if exceeded\n" +
-  "  -tpdelay           Amount of time to wait between each pageload\n" +
-  "  -tpnoforcecc       Don't force cycle collection between each pageload\n" +
-  "  -tpmozafterpaint   Measure Time after recieving MozAfterPaint event instead of load event\n" +
-  "  -tpscrolltest      Unknown\n" +
-  "  -tpdisable_e10s    disable pageloader e10s code path\n" +
-  "  -rss               Dump RSS after each page is loaded\n"
+  "  -tp <file>             Run pageload perf tests on given manifest\n" +
+  "  -tpfilter str          Only include pages from manifest that contain str (regexp)\n" +
+  "  -tpcycles n            Loop through pages n times\n" +
+  "  -tppagecycles n        Loop through each page n times before going onto the next page\n" +
+  "  -tpstart n             Start at index n in the manifest\n" +
+  "  -tpend n               End with index n in the manifest\n" +
+  "  -tpchrome              Test with normal browser chrome\n" +
+  "  -tprender              Run render-only benchmark for each page\n" +
+  "  -tpwidth width         Width of window\n" +
+  "  -tpheight height       Height of window\n" +
+  "  -tbprofilinginfo       A JSON object describing profiler settings\n" +
+  "  -tpoffline             Force offline mode\n" +
+  "  -tpnoisy               Dump the name of the last loaded page to console\n" +
+  "  -tptimeout             Max amount of time given for a page to load, quit if exceeded\n" +
+  "  -tpdelay               Amount of time to wait between each pageload\n" +
+  "  -tpnoforcecc           Don't force cycle collection between each pageload\n" +
+  "  -tpmozafterpaint       Measure Time after recieving MozAfterPaint event instead of load event\n" +
+  "  -fnbpaint  Measure time after a first non-blank paint has occurred\n" +
+  "  -tpscrolltest          Unknown\n" +
+  "  -tpdisable_e10s        disable pageloader e10s code path\n" +
+  "  -rss                   Dump RSS after each page is loaded\n"
 
 };
 
 
 var PageLoaderCmdLineFactory =
 {
   createInstance(outer, iid) {
     if (outer != null) {
--- a/testing/talos/talos/pageloader/install.rdf
+++ b/testing/talos/talos/pageloader/install.rdf
@@ -1,15 +1,15 @@
 <?xml version="1.0"?>
 
 <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
      xmlns:em="http://www.mozilla.org/2004/em-rdf#">
   <Description about="urn:mozilla:install-manifest">
     <em:id>pageloader@mozilla.org</em:id>
-    <em:version>1.0.19</em:version>
+    <em:version>1.0.22</em:version>
     <em:targetApplication>
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
         <em:minVersion>44.0</em:minVersion>
         <em:maxVersion>*</em:maxVersion>
       </Description>
     </em:targetApplication>
     <!-- Front End MetaData -->
index a763e390731f5379ddf5fa77090550009a002d13..798826525491b3d762503a422b1481f140238d19
GIT binary patch
literal 30804
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
T#9tpk{`Fe^HS?^T|GN5Lrf&Lt
--- a/testing/talos/talos/run_tests.py
+++ b/testing/talos/talos/run_tests.py
@@ -56,21 +56,22 @@ def buildCommandLine(test):
         for cycle_var in ['tppagecycles', 'tpcycles', 'cycles']:
             if test[cycle_var] > 2:
                 test[cycle_var] = 2
 
     # build pageloader command from options
     url = ['-tp', test['tpmanifest']]
     CLI_bool_options = ['tpchrome', 'tpmozafterpaint', 'tpdisable_e10s',
                         'tpnoisy', 'rss', 'tprender', 'tploadnocache',
-                        'tpscrolltest']
+                        'tpscrolltest', 'fnbpaint']
     CLI_options = ['tpcycles', 'tppagecycles', 'tpdelay', 'tptimeout']
     for key in CLI_bool_options:
         if test.get(key):
             url.append('-%s' % key)
+
     for key in CLI_options:
         value = test.get(key)
         if value:
             url.extend(['-%s' % key, str(value)])
 
     # XXX we should actually return the list but since we abuse
     # the url as a command line flag to pass to firefox all over the place
     # will just make a string for now
@@ -117,16 +118,21 @@ def run_tests(config, browser_config):
         browser_config['extra_args'] = '--no-remote'
 
     # with addon signing for production talos, we want to develop without it
     if browser_config['develop'] or browser_config['branch_name'] == 'Try':
         browser_config['preferences']['xpinstall.signatures.required'] = False
 
     browser_config['preferences']['extensions.allow-non-mpc-extensions'] = True
 
+    # if using firstNonBlankPaint, must turn on pref for it
+    if test.get('fnbpaint', False):
+        LOG.info("Using firstNonBlankPaint, so turning on pref for it")
+        browser_config['preferences']['dom.performance.time_to_non_blank_paint.enabled'] = True
+
     # set defaults
     testdate = config.get('testdate', '')
 
     # get the process name from the path to the browser
     if not browser_config['process']:
         browser_config['process'] = \
             os.path.basename(browser_config['browser_path'])
 
@@ -217,19 +223,16 @@ def run_tests(config, browser_config):
         # mitmproxy cert setup needs path to mozharness install; mozharness has set this
         # value in the SCRIPTSPATH env var for us in mozharness/mozilla/testing/talos.py
         scripts_path = os.environ.get('SCRIPTSPATH')
         LOG.info('scripts_path: %s' % str(scripts_path))
         mitmproxy.install_mitmproxy_cert(mitmproxy_proc,
                                          browser_config['browser_path'],
                                          str(scripts_path))
 
-    if config.get('first_non_blank_paint', False):
-        browser_config['firstNonBlankPaint'] = True
-
     testname = None
     # run the tests
     timer = utils.Timer()
     LOG.suite_start(tests=[test['name'] for test in tests])
     try:
         for test in tests:
             testname = test['name']
             LOG.test_start(testname)
--- a/testing/talos/talos/test.py
+++ b/testing/talos/talos/test.py
@@ -99,16 +99,17 @@ class TsBase(Test):
         'gecko_profile_entries',
         'gecko_profile_startup',
         'preferences',
         'xperf_counters',
         'xperf_providers',
         'xperf_user_providers',
         'xperf_stackwalk',
         'tpmozafterpaint',
+        'fnbpaint',
         'firstpaint',
         'userready',
         'testeventmap',
         'base_vs_ref',
         'extensions',
         'filters',
         'setup',
         'cleanup',
@@ -228,17 +229,17 @@ class tresize(TsBase):
 
 class PageloaderTest(Test):
     """abstract base class for a Talos Pageloader test"""
     tpmanifest = None  # test manifest
     tpcycles = 1  # number of time to run each page
     cycles = None
     timeout = None
     keys = ['tpmanifest', 'tpcycles', 'tppagecycles', 'tprender', 'tpchrome',
-            'tpmozafterpaint', 'tploadnocache', 'firstpaint', 'userready',
+            'tpmozafterpaint', 'fnbpaint', 'tploadnocache', 'firstpaint', 'userready',
             'testeventmap', 'base_vs_ref', 'rss', 'mainthread', 'resolution', 'cycles',
             'gecko_profile', 'gecko_profile_interval', 'gecko_profile_entries',
             'tptimeout', 'win_counters', 'w7_counters', 'linux_counters', 'mac_counters',
             'tpscrolltest', 'xperf_counters', 'timeout', 'shutdown', 'responsiveness',
             'profile_path', 'xperf_providers', 'xperf_user_providers', 'xperf_stackwalk',
             'filters', 'preferences', 'extensions', 'setup', 'cleanup',
             'lower_is_better', 'alert_threshold', 'unit', 'webextensions']
 
@@ -249,16 +250,17 @@ class QuantumPageloadTest(PageloaderTest
     """
     tpcycles = 1
     tppagecycles = 25
     gecko_profile_interval = 1
     gecko_profile_entries = 2000000
     filters = filter.ignore_first.prepare(5) + filter.median.prepare()
     unit = 'ms'
     lower_is_better = True
+    fnbpaint = True
 
 
 @register_test()
 class tpaint(PageloaderTest):
     """
     Tests the amount of time it takes the open a new window. This test does
     not include startup time. Multiple test windows are opened in succession,
     results reported are the average amount of time required to create and
@@ -548,17 +550,16 @@ class tp5o_scroll(PageloaderTest):
     """
     Tests scroll (like tscrollx does, including ASAP) but on the tp5o pageset.
     """
     tpmanifest = '${talos}/tests/tp5n/tp5o.manifest'
     tpcycles = 1
     tppagecycles = 12
     gecko_profile_interval = 2
     gecko_profile_entries = 2000000
-
     tpscrolltest = True
     """ASAP mode"""
     tpmozafterpaint = False
     preferences = {'layout.frame_rate': 0,
                    'docshell.event_starvation_delay_hint': 1,
                    'dom.send_after_paint_to_content': False,
                    'layout.css.scroll-behavior.spring-constant': "'10'",
                    'toolkit.framesRecording.bufferSize': 10000}