1 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
8 from telemetry.page import page_measurement
9 from telemetry.page import page_set
12 def CreatePageSetFromPath(path):
13 assert os.path.exists(path)
15 page_set_dict = {'pages': []}
18 if not path.endswith('.html'):
20 if '../' in open(path, 'r').read():
21 # If the page looks like it references its parent dir, include it.
22 page_set_dict['serving_dirs'] = [os.path.dirname(os.path.dirname(path))]
23 page_set_dict['pages'].append({'url':
24 'file://' + path.replace('\\', '/')})
26 def _AddDir(dir_path, skipped):
27 for candidate_path in os.listdir(dir_path):
28 if candidate_path == 'resources':
30 candidate_path = os.path.join(dir_path, candidate_path)
31 if candidate_path.startswith(tuple([os.path.join(path, s)
34 if os.path.isdir(candidate_path):
35 _AddDir(candidate_path, skipped)
37 _AddPage(candidate_path)
39 if os.path.isdir(path):
41 skipped_file = os.path.join(path, 'Skipped')
42 if os.path.exists(skipped_file):
43 for line in open(skipped_file, 'r').readlines():
45 if line and not line.startswith('#'):
46 skipped.append(line.replace('/', os.sep))
47 _AddDir(path, skipped)
50 return page_set.PageSet.FromDict(page_set_dict, os.getcwd() + os.sep)
53 class BlinkPerfMeasurement(page_measurement.PageMeasurement):
54 """Tuns a blink performance test and reports the results."""
56 super(BlinkPerfMeasurement, self).__init__('')
57 with open(os.path.join(os.path.dirname(__file__),
58 'blink_perf.js'), 'r') as f:
59 self._blink_perf_js = f.read()
61 def CreatePageSet(self, args, options):
63 print 'Must specify a file or directory to run.'
66 page_set_arg = args[1]
68 if not os.path.exists(page_set_arg):
69 print '%s does not exist.' % page_set_arg
72 return CreatePageSetFromPath(page_set_arg)
75 def results_are_the_same_on_every_page(self):
78 def WillNavigateToPage(self, page, tab):
79 page.script_to_evaluate_on_commit = self._blink_perf_js
81 def CustomizeBrowserOptions(self, options):
82 options.AppendExtraBrowserArgs([
83 '--js-flags=--expose_gc',
84 '--enable-experimental-web-platform-features'
87 def MeasurePage(self, page, tab, results):
88 tab.WaitForJavaScriptExpression('testRunner.isDone', 600)
90 log = tab.EvaluateJavaScript('document.getElementById("log").innerHTML')
92 for line in log.splitlines():
93 if not line.startswith('values '):
96 values = [float(v.replace(',', '')) for v in parts[1:-1]]
98 metric = page.display_name.split('.')[0].replace('/', '_')
99 results.Add(metric, units, values)