Merge m-c to inbound. a=merge
authorRyan VanderMeulen <ryanvm@gmail.com>
Wed, 20 Sep 2017 22:27:56 -0400
changeset 668158 6169cd08ca7d5912648e2f640d17d556355eb7a8
parent 668157 540d10078b32f3f2426dc208df2fd710bb5c7ca1 (current diff)
parent 668025 47f7b6c64265bc7bdd22eef7ab71abc97cf3f8bf (diff)
child 668159 aa83d846b65e8c5af0a2723926e25442ce14a7af
push id80945
push usernnethercote@mozilla.com
push dateThu, 21 Sep 2017 07:22:53 +0000
reviewersmerge
milestone57.0a1
Merge m-c to inbound. a=merge
testing/talos/talos/tests/perf-reftest/.eslintrc.json
testing/talos/talos/tests/perf-reftest/bloom-basic-2.html
testing/talos/talos/tests/perf-reftest/coalesce-1.html
testing/talos/talos/tests/perf-reftest/coalesce-ref.html
testing/talos/talos/tests/perf-reftest/perf_reftest.manifest
--- a/testing/talos/talos.json
+++ b/testing/talos/talos.json
@@ -65,17 +65,17 @@
         "svgr-e10s": {
             "tests": ["tsvgx", "tsvgr_opacity", "tart", "tscrollx", "tsvg_static"]
         },
         "svgr-stylo-disabled-e10s": {
             "tests": ["tsvgx", "tsvgr_opacity", "tart", "tscrollx", "tsvg_static"],
             "talos_options": ["--disable-stylo"]
         },
         "perf-reftest-e10s": {
-            "tests": ["perf_reftest"]
+            "tests": ["bloom_basic"]
         },
         "perf-reftest-stylo-disabled-e10s": {
             "tests": ["bloom_basic"],
             "talos_options": ["--disable-stylo"]
         },
         "perf-reftest-singletons-e10s": {
             "tests": ["perf_reftest_singletons"]
         },
--- a/testing/talos/talos/output.py
+++ b/testing/talos/talos/output.py
@@ -87,38 +87,34 @@ class Output(object):
                     # override the list of page results for each run
                     result.results = results
 
                 for result in tresults:
                     filtered_results = \
                         result.values(suite['name'],
                                       test.test_config['filters'])
                     vals.extend([[i['value'], j] for i, j in filtered_results])
-                    subtest_index = 0
                     for val, page in filtered_results:
                         if page == 'NULL':
                             # no real subtests
                             page = test.name()
                         subtest = {
                             'name': page,
                             'value': val['filtered'],
                             'replicates': replicates[page],
                         }
                         # if results are from a comparison test i.e. perf-reftest, it will also
                         # contain replicates for 'base' and 'reference'; we wish to keep those
                         # to reference; actual results were calculated as the difference of those
-                        base_runs = result.results[subtest_index].get('base_runs', None)
-                        ref_runs = result.results[subtest_index].get('ref_runs', None)
+                        base_runs = result.results[0].get('base_runs', None)
+                        ref_runs = result.results[0].get('ref_runs', None)
                         if base_runs and ref_runs:
                             subtest['base_replicates'] = base_runs
                             subtest['ref_replicates'] = ref_runs
-
                         subtests.append(subtest)
-                        subtest_index += 1
-
                         if test.test_config.get('lower_is_better') is not None:
                             subtest['lowerIsBetter'] = \
                                 test.test_config['lower_is_better']
                         if test.test_config.get('alert_threshold') is not None:
                             subtest['alertThreshold'] = \
                                 test.test_config['alert_threshold']
                         if test.test_config.get('unit'):
                             subtest['unit'] = test.test_config['unit']
--- a/testing/talos/talos/pageloader/chrome/pageloader.js
+++ b/testing/talos/talos/pageloader/chrome/pageloader.js
@@ -46,17 +46,16 @@ 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;
-var baseVsRef = false;
 
 var isIdleCallbackPending = false;
 
 // when TEST_DOES_OWN_TIMING, we need to store the time from the page as MozAfterPaint can be slower than pageload
 var gTime = -1;
 var gStartTime = -1;
 var gReference = -1;
 
@@ -198,16 +197,17 @@ function plInit() {
     if (startIndex > endIndex) {
       dumpLine("tp: error: startIndex >= endIndex");
       plStop(true);
     }
 
     pages = pages.slice(startIndex, endIndex + 1);
     pageUrls = pages.map(function(p) { return p.url.spec.toString(); });
     report = new Report();
+
     if (doRenderTest)
       renderReport = new Report();
 
     pageIndex = 0;
     if (profilingInfo) {
       TalosParentProfiler.beginTest(getCurrentPageShortName());
     }
 
@@ -395,17 +395,19 @@ function plLoadPage() {
     mm.removeMessageListener("PageLoader:LoadEvent", ContentListener);
     mm.removeMessageListener("PageLoader:RecordTime", ContentListener);
     mm.removeMessageListener("PageLoader:IdleCallbackSet", ContentListener);
     mm.removeMessageListener("PageLoader:IdleCallbackReceived", 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.pathQueryRef);
 
   if (reportRSS) {
     collectMemory(startAndLoadURI, pageName);
   } else {
     startAndLoadURI(pageName);
   }
@@ -558,25 +560,17 @@ function plRecordTime(time) {
   var i = pageIndex
   if (i < pages.length - 1) {
     i++;
   } else {
     i = 0;
   }
   var nextName = pages[i].url.spec;
   if (!recordedName) {
-    // when doing base vs ref type of test, add pre 'base' or 'ref' to reported page name;
-    // this is necessary so that if multiple subtests use same reference page, results for
-    // each ref page run will be kept separate for each base vs ref run, and not grouped
-    // into just one set of results values for everytime that reference page was loaded
-    if (baseVsRef) {
-      recordedName = pages[pageIndex].pre + pageUrls[pageIndex];
-    } else {
-      recordedName = pageUrls[pageIndex];
-    }
+    recordedName = pageUrls[pageIndex];
   }
   if (typeof(time) == "string") {
     var times = time.split(",");
     var names = recordedName.split(",");
     for (var t = 0; t < times.length; t++) {
       if (names.length == 1) {
         report.recordTime(names, times[t]);
       } else {
@@ -894,21 +888,20 @@ function plLoadURLsFromURI(manifestUri) 
     fstream.init(uriFile.file, -1, 0, 0);
   } catch (ex) {
       dumpLine("tp: the file %s doesn't exist" % uriFile.file);
       return null;
   }
 
   var lstream = fstream.QueryInterface(Ci.nsILineInputStream);
 
-  var url_array = [];
+  var d = [];
 
   var lineNo = 0;
   var line = {value: null};
-  var baseVsRefIndex = 0;
   var more;
   do {
     lineNo++;
     more = lstream.readLine(line);
     var s = line.value;
 
     // strip comments (only leading ones)
     s = s.replace(/^#.*/, "");
@@ -916,17 +909,16 @@ function plLoadURLsFromURI(manifestUri) 
     // strip leading and trailing whitespace
     s = s.replace(/^\s*/, "").replace(/\s*$/, "");
 
     if (!s)
       continue;
 
     var flags = 0;
     var urlspec = s;
-    baseVsRefIndex += 1;
 
     // split on whitespace, and figure out if we have any flags
     var items = s.split(/\s+/);
     if (items[0] == "include") {
       if (items.length != 2) {
         dumpLine("tp: Error on line " + lineNo + " in " + manifestUri.spec + ": include must be followed by the manifest to include!");
         return null;
       }
@@ -935,17 +927,17 @@ function plLoadURLsFromURI(manifestUri) 
       if (subManifest == null) {
         dumpLine("tp: invalid URI on line " + manifestUri.spec + ":" + lineNo + " : '" + line.value + "'");
         return null;
       }
 
       var subItems = plLoadURLsFromURI(subManifest);
       if (subItems == null)
         return null;
-      url_array = url_array.concat(subItems);
+      d = d.concat(subItems);
     } else {
       // For scrollTest flag, we accept "normal" pages but treat them as TEST_DOES_OWN_TIMING
       // together with EXECUTE_SCROLL_TEST which makes us run the scroll test on load.
       // We do this by artificially "injecting" the TEST_DOES_OWN_TIMING flag ("%") to the item
       // and then let the default flow for this flag run without further modifications
       // (other than calling the scroll test once the page is loaded).
       // Note that if we have the scrollTest flag but the item already has "%", then we do
       // nothing (the scroll test will not execute, and the page will report with its
@@ -955,68 +947,32 @@ function plLoadURLsFromURI(manifestUri) 
         flags |= EXECUTE_SCROLL_TEST;
       }
 
       if (items.length == 2) {
         if (items[0].indexOf("%") != -1)
           flags |= TEST_DOES_OWN_TIMING;
 
         urlspec = items[1];
-      } else if (items.length == 3) {
-        // base vs ref type of talos test
-        // expect each manifest line to be in the format of:
-        // & http://localhost/tests/perf-reftest/base-page.html, http://localhost/tests/perf-reftest/reference-page.html
-        // test will run with the base page, then with the reference page; and ultimately the actual test results will
-        // be the comparison values of those two pages; more than one line will result in base vs ref subtests
-        if (items[0].indexOf("&") != -1) {
-          baseVsRef = true;
-          flags |= TEST_DOES_OWN_TIMING;
-          // for the base, must remove the comma on the end of the actual url
-          var urlspecBase = items[1].slice(0, -1);
-          var urlspecRef = items[2];
-        } else {
-          dumpLine("tp: Error on line " + lineNo + " in " + manifestUri.spec + ": unknown manifest format!");
-          return null;
-        }
       } else if (items.length != 1) {
         dumpLine("tp: Error on line " + lineNo + " in " + manifestUri.spec + ": whitespace must be %-escaped!");
         return null;
       }
 
-      var url;
-
-      if (!baseVsRef) {
-        url = gIOS.newURI(urlspec, null, manifestUri);
-
-        if (pageFilterRegexp && !pageFilterRegexp.test(url.spec))
-          continue;
+      var url = gIOS.newURI(urlspec, null, manifestUri);
 
-        url_array.push({ url, flags });
-      } else {
-        // base vs ref type of talos test
-        // we add a 'pre' prefix here indicating that this particular page is a base page or a reference
-        // page; later on this 'pre' is used when recording the actual time value/result; because in
-        // the results we use the url as the results key; but we might use the same test page as a reference
-        // page in the same test suite, so we need to add a prefix so this results key is always unique
-        url = gIOS.newURI(urlspecBase, null, manifestUri);
-        if (pageFilterRegexp && !pageFilterRegexp.test(url.spec))
-          continue;
-        var pre = "base_page_" + baseVsRefIndex + "_";
-        url_array.push({ url, flags, pre });
+      if (pageFilterRegexp && !pageFilterRegexp.test(url.spec))
+        continue;
 
-        url = gIOS.newURI(urlspecRef, null, manifestUri);
-        if (pageFilterRegexp && !pageFilterRegexp.test(url.spec))
-          continue;
-        pre = "ref_page_" + baseVsRefIndex + "_";
-        url_array.push({ url, flags, pre });
-      }
+      d.push({   url,
+               flags });
     }
   } while (more);
 
-  return url_array;
+  return d;
 }
 
 function dumpLine(str) {
   if (MozillaFileLogger && MozillaFileLogger._foStream)
     MozillaFileLogger.log(str + "\n");
   dump(str);
   dump("\n");
 }
--- 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.29</em:version>
+    <em:version>1.0.27</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 41d7a39d83fc428b9c3a3e018159cd0345a34430..2c2526e3c9c8b59b88b649908a88a39ef7584b2a
GIT binary patch
literal 31107
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
Zrw=7raEO0=0OhaO@?SkK!}TAv{|ECBeP93p
--- a/testing/talos/talos/results.py
+++ b/testing/talos/talos/results.py
@@ -248,22 +248,17 @@ class PageloaderResults(Results):
             self.results.append(result)
 
     def format_pagename(self, page):
         """
         fix up the page for reporting
         """
         page = page.rstrip('/')
         if '/' in page:
-            if 'base_page' in page or 'ref_page' in page:
-                # for base vs ref type test, the page name is different format, i.e.
-                # base_page_1_http://localhost:53309/tests/perf-reftest/bloom-basic.html
-                page = page.split('/')[-1]
-            else:
-                page = page.split('/')[0]
+            page = page.split('/')[0]
         return page
 
 
 class BrowserLogResults(object):
     """parse the results from the browser log output"""
 
     # tokens for the report types
     report_tokens = [
--- a/testing/talos/talos/run_tests.py
+++ b/testing/talos/talos/run_tests.py
@@ -336,55 +336,39 @@ def make_comparison_result(base_and_refe
     results object with the comparison results, that will look like traditional single test results
     like this:
 
     PERFHERDER_DATA: {"framework": {"name": "talos"}, "suites": [{"lowerIsBetter": true,
     "subtests": [{"name": "", "lowerIsBetter": true, "alertThreshold": 5.0, "replicates":
     [16.705, ...], "value": 16.705, "unit": "ms"}], "extraOptions": ["e10s"], "name":
     "bloom_basic", "alertThreshold": 5.0}]}
     '''
+    # separate the 'base' and 'reference' result run values
+    base_result_runs = base_and_reference_results.results[0].results[0]['runs']
+    ref_result_runs = base_and_reference_results.results[0].results[1]['runs']
+
     # create a new results object for the comparison result; keep replicates from both pages
     comparison_result = copy.deepcopy(base_and_reference_results)
 
     # remove original results from our copy as they will be replaced by one comparison result
     comparison_result.results[0].results = []
-    comp_results = comparison_result.results[0].results
-
-    # zero-based count of how many base vs reftest sets we have
-    subtest_index = 0
-
-    # each set of two results is actually a base test followed by the
-    # reference test; we want to go through each set of base vs reference
-    for x in range(0, len(base_and_reference_results.results[0].results), 2):
-
-        # separate the 'base' and 'reference' result run values
-        results = base_and_reference_results.results[0].results
-        base_result_runs = results[x]['runs']
-        ref_result_runs = results[x + 1]['runs']
 
-        # the test/subtest result is the difference between the base vs reference test page
-        # values; for this result use the base test page name for the subtest/test name
-        sub_test_name = base_and_reference_results.results[0].results[x]['page']
+    # populate our new comparison result with 'base' and 'ref' replicates
+    comparison_result.results[0].results.append({'index': 0,
+                                                 'runs': [],
+                                                 'page': '',
+                                                 'base_runs': base_result_runs,
+                                                 'ref_runs': ref_result_runs})
 
-        # populate our new comparison result with 'base' and 'ref' replicates
-        comp_results.append({'index': 0,
-                             'runs': [],
-                             'page': sub_test_name,
-                             'base_runs': base_result_runs,
-                             'ref_runs': ref_result_runs})
-
-        # now step thru each result, compare 'base' vs 'ref', and store the difference in 'runs'
-        _index = 0
-        for next_ref in comp_results[subtest_index]['ref_runs']:
-            diff = abs(next_ref - comp_results[subtest_index]['base_runs'][_index])
-            comp_results[subtest_index]['runs'].append(round(diff, 3))
-            _index += 1
-
-        # increment our base vs reference subtest index
-        subtest_index += 1
+    # now step thru each result, compare 'base' vs 'ref', and store the difference in 'runs'
+    _index = 0
+    for next_ref in comparison_result.results[0].results[0]['ref_runs']:
+        diff = abs(next_ref - comparison_result.results[0].results[0]['base_runs'][_index])
+        comparison_result.results[0].results[0]['runs'].append(round(diff, 3))
+        _index += 1
 
     return comparison_result
 
 
 def convert_to_separate_test_results(multi_value_result, test_event_map):
     ''' Receive a test result that actually contains multiple values in a single iteration, and
     parse it out in order to 'fake' three seprate test results.
 
--- a/testing/talos/talos/test.py
+++ b/testing/talos/talos/test.py
@@ -802,24 +802,24 @@ class a11yr(PageloaderTest):
     tpmozafterpaint = True
     tpchrome = False
     preferences = {'dom.send_after_paint_to_content': False}
     unit = 'ms'
     alert_threshold = 5.0
 
 
 @register_test()
-class perf_reftest(PageloaderTest):
+class bloom_basic(PageloaderTest):
     """
-    Style perf-reftest a set of tests where the result is the difference of base vs ref pages
+    Stylo bloom_basic: runs bloom_basic and bloom_basic_ref and reports difference
     """
     base_vs_ref = True  # compare the two test pages with eachother and report comparison
-    tpmanifest = '${talos}/tests/perf-reftest/perf_reftest.manifest'
+    tpmanifest = '${talos}/tests/perf-reftest/bloom_basic.manifest'
     tpcycles = 1
-    tppagecycles = 10
+    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
     alert_threshold = 5.0
 
 
deleted file mode 100644
--- a/testing/talos/talos/tests/perf-reftest/.eslintrc.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "rules": {
-        "no-undef": "off"
-    }
-}
-
deleted file mode 100644
--- a/testing/talos/talos/tests/perf-reftest/bloom-basic-2.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <script src="util.js"></script>
-    <script>
-window.onload = function() {
-  /* Use many rules, instead of one rule with many selectors, to test per-rule overhead. */
-  document.head.appendChild(build_rule("caption div, caption span", 1, "{ color: blue; } ", 20000));
-  let dom = build_dom(5000, "div");
-
-  flush_style();
-  perf_start();
-  document.body.appendChild(dom);
-  flush_style(dom);
-  perf_finish();
-}
-    </script>
-  </head>
-  <body>
-  </body>
-</html>
--- a/testing/talos/talos/tests/perf-reftest/bloom-basic-ref.html
+++ b/testing/talos/talos/tests/perf-reftest/bloom-basic-ref.html
@@ -1,20 +1,34 @@
 <!DOCTYPE html>
 <html>
   <head>
     <script src="util.js"></script>
+    <script src="chrome://talos-powers-content/content/TalosContentProfiler.js"></script>
     <script>
+/* import-globals-from util.js */
 window.onload = function() {
-  document.head.appendChild(build_rule("caption > div, caption > span", 20000, "{ color: blue; } "));
+  document.head.appendChild(build_rule("span > div", 10000, "{ color: blue; } "));
   let dom = build_dom(5000, "div");
 
-  flush_style();
-  perf_start();
-  document.body.appendChild(dom);
-  flush_style(dom);
-  perf_finish();
+  TalosContentProfiler.resume("bloom_basic_ref start", true).then(() => {
+    let start = performance.now();
+    document.body.appendChild(dom);
+    window.foo = window.getComputedStyle(document.body).color;
+    let end = performance.now();
+
+    TalosContentProfiler.pause("bloom_basic_ref finish", true).then(() => {
+      // when running in talos report results; when running outside talos just alert
+      if (window.tpRecordTime) {
+        window.tpRecordTime(end - start, start);
+      } else {
+        console.log(end);
+        console.log(start);
+        alert("Result: " + (end - start).toFixed(2) + " (ms)");
+      }
+    });
+  });
 }
     </script>
   </head>
   <body>
   </body>
 </html>
--- a/testing/talos/talos/tests/perf-reftest/bloom-basic.html
+++ b/testing/talos/talos/tests/perf-reftest/bloom-basic.html
@@ -1,20 +1,34 @@
 <!DOCTYPE html>
 <html>
   <head>
     <script src="util.js"></script>
+    <script src="chrome://talos-powers-content/content/TalosContentProfiler.js"></script>
     <script>
+/* import-globals-from util.js */
 window.onload = function() {
-  document.head.appendChild(build_rule("caption div, caption span", 20000, "{ color: blue; } "));
+  document.head.appendChild(build_rule("span div", 10000, "{ color: blue; } "));
   let dom = build_dom(5000, "div");
 
-  flush_style();
-  perf_start();
-  document.body.appendChild(dom);
-  flush_style(dom);
-  perf_finish();
+  TalosContentProfiler.resume("bloom_basic start", true).then(() => {
+    let start = performance.now();
+    document.body.appendChild(dom);
+    window.foo = window.getComputedStyle(document.body).color;
+    let end = performance.now();
+
+    TalosContentProfiler.pause("bloom_basic end", true).then(() => {
+      // when running in talos report results; when running outside talos just alert
+      if (window.tpRecordTime) {
+        window.tpRecordTime(end - start, start);
+      } else {
+        console.log(end);
+        console.log(start);
+        alert("Result: " + (end - start).toFixed(2) + " (ms)");
+      }
+    });
+  });
 }
     </script>
   </head>
   <body>
   </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/testing/talos/talos/tests/perf-reftest/bloom_basic.manifest
@@ -0,0 +1,4 @@
+# base_vs_ref is set in test.py for this test, so each of these pages are run as separate
+# tests, but then compared against eachother; and the reported results are the comparison
+% http://localhost/tests/perf-reftest/bloom-basic.html
+% http://localhost/tests/perf-reftest/bloom-basic-ref.html
new file mode 100644
--- /dev/null
+++ b/testing/talos/talos/tests/perf-reftest/bloom_basic_ref.manifest
@@ -0,0 +1,1 @@
+% http://localhost/tests/perf-reftest/bloom-basic-ref.html
deleted file mode 100644
--- a/testing/talos/talos/tests/perf-reftest/coalesce-1.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<style>
-.x { color: yellow; }
-</style>
-<script src="util.js"></script>
-<script>
-function set_class(n) {
-  n.className = "x";
-  n = n.firstChild;
-  while (n) {
-    set_class(n);
-    n = n.nextSibling;
-  }
-}
-window.onload = function() {
-  let root = build_dom(50000, "div");
-  document.body.appendChild(root);
-  flush_style(root);
-  perf_start();
-  set_class(root);
-  flush_style(root);
-  perf_finish();
-};
-</script>
-<body></body>
deleted file mode 100644
--- a/testing/talos/talos/tests/perf-reftest/coalesce-ref.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE html>
-<style>
-.x, .x * { color: yellow; }
-</style>
-<script src="util.js"></script>
-<script>
-window.onload = function() {
-  let root = build_dom(50000, "div");
-  document.body.appendChild(root);
-  flush_style(root);
-  root.className = "x";
-  perf_start();
-  flush_style(root);
-  perf_finish();
-};
-</script>
-<body></body>
deleted file mode 100644
--- a/testing/talos/talos/tests/perf-reftest/perf_reftest.manifest
+++ /dev/null
@@ -1,6 +0,0 @@
-# base_vs_ref is set in test.py for this test, so each of these lines is the base vs ref test pag
-# both pages are run and then the results compared, the ultimate reported results are the comparisons.
-# Each line is reported as a subtest like the other talos tests that have multiple lines of URLs.
-& http://localhost/tests/perf-reftest/bloom-basic.html, http://localhost/tests/perf-reftest/bloom-basic-ref.html
-& http://localhost/tests/perf-reftest/bloom-basic-2.html, http://localhost/tests/perf-reftest/bloom-basic-ref.html
-& http://localhost/tests/perf-reftest/coalesce-1.html, http://localhost/tests/perf-reftest/coalesce-ref.html
--- a/testing/talos/talos/tests/perf-reftest/util.js
+++ b/testing/talos/talos/tests/perf-reftest/util.js
@@ -1,82 +1,17 @@
-var perf_data = {
-  start: null,
-  end: null,
-}
-
-function build_dom(n, elemName, options) {
-  // By default we use different elements in the DOM to defeat the style sharing
-  // cache, otherwise this sythetic DOM is trivially stylable by engines with that
-  // optimization.
-  options = options || {};
-  var elemNameLeft = options.elemNameLeft || "div";
-  var elemNameRight = options.elemNameRight || "span";
-
+function build_dom(n, elemName) {
   var ours = document.createElement(elemName);
-  for (var attr in options.attributes) {
-    ours.setAttribute(attr, options.attributes[attr]);
-  }
-
   if (n != 1) {
     var leftSize = Math.floor(n / 2);
     var rightSize = Math.floor((n - 1) / 2);
-    ours.appendChild(build_dom(leftSize, elemNameLeft, options));
+    ours.appendChild(build_dom(leftSize, elemName));
     if (rightSize > 0)
-      ours.appendChild(build_dom(rightSize, elemNameRight, options));
+      ours.appendChild(build_dom(rightSize, elemName));
   }
   return ours;
 }
 
-function build_rule(selector, selectorRepeat, declaration, ruleRepeat) {
-  ruleRepeat = ruleRepeat || 1;
+function build_rule(selector, selectorRepeat, declaration) {
   var s = document.createElement("style");
-  var rule = Array(selectorRepeat).fill(selector).join(", ") + declaration;
-  s.textContent = Array(ruleRepeat).fill(rule).join("\n\n");
+  s.textContent = Array(selectorRepeat).fill(selector).join(", ") + declaration;
   return s;
 }
-
-function flush_style(element) {
-  getComputedStyle(element || document.documentElement).color;
-}
-
-function perf_start() {
-  if (perf_data.start !== null) {
-    throw "already started timing!";
-  }
-
-  perf_data.start = performance.now();
-}
-
-function perf_finish() {
-  var end = performance.now();
-
-  if (perf_data.start === null) {
-    throw "haven't started timing!";
-  }
-
-  if (perf_data.end !== null) {
-    throw "already finished timing!";
-  }
-
-  var start = perf_data.start;
-  perf_data.end = end;
-
-  // when running in talos report results; when running outside talos just alert
-  if (window.tpRecordTime) {
-    // Running in talos.
-    window.tpRecordTime(end - start, start);
-  } else if (window.parent && window.parent.report_perf_reftest_time) {
-    // Running in the perf-reftest runner.
-    window.parent.report_perf_reftest_time({ type: "time", value: end - start });
-  } else {
-    // Running standalone; just alert.
-    console.log(end);
-    console.log(start);
-    alert("Result: " + (end - start).toFixed(2) + " (ms)");
-  }
-}
-
-if (window.parent.report_perf_reftest_time) {
-  window.addEventListener("error", function(e) {
-    window.parent.report_perf_reftest_time({ type: "error", value: e.message });
-  });
-}