cc: Make a FakeResourceProvider and use it in tests to construct.
[chromium-blink-merge.git] / tools / perf / benchmarks / blink_perf.py
blob8367f863af865127305b0a91f2a9716905d6776c
1 # Copyright 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.
5 import os
7 from core import perf_benchmark
9 from telemetry import benchmark
10 from telemetry.core import util
11 from telemetry import page as page_module
12 from telemetry.page import page_set
13 from telemetry.page import page_test
14 from telemetry.value import list_of_scalar_values
17 BLINK_PERF_BASE_DIR = os.path.join(util.GetChromiumSrcDir(),
18 'third_party', 'WebKit', 'PerformanceTests')
19 SKIPPED_FILE = os.path.join(BLINK_PERF_BASE_DIR, 'Skipped')
22 def CreatePageSetFromPath(path, skipped_file):
23 assert os.path.exists(path)
25 page_urls = []
26 serving_dirs = set()
28 def _AddPage(path):
29 if not path.endswith('.html'):
30 return
31 if '../' in open(path, 'r').read():
32 # If the page looks like it references its parent dir, include it.
33 serving_dirs.add(os.path.dirname(os.path.dirname(path)))
34 page_urls.append('file://' + path.replace('\\', '/'))
36 def _AddDir(dir_path, skipped):
37 for candidate_path in os.listdir(dir_path):
38 if candidate_path == 'resources':
39 continue
40 candidate_path = os.path.join(dir_path, candidate_path)
41 if candidate_path.startswith(skipped):
42 continue
43 if os.path.isdir(candidate_path):
44 _AddDir(candidate_path, skipped)
45 else:
46 _AddPage(candidate_path)
48 if os.path.isdir(path):
49 skipped = []
50 if os.path.exists(skipped_file):
51 for line in open(skipped_file, 'r').readlines():
52 line = line.strip()
53 if line and not line.startswith('#'):
54 skipped_path = os.path.join(os.path.dirname(skipped_file), line)
55 skipped.append(skipped_path.replace('/', os.sep))
56 _AddDir(path, tuple(skipped))
57 else:
58 _AddPage(path)
59 ps = page_set.PageSet(file_path=os.getcwd()+os.sep,
60 serving_dirs=serving_dirs)
61 for url in page_urls:
62 ps.AddUserStory(page_module.Page(url, ps, ps.base_dir))
63 return ps
66 class _BlinkPerfMeasurement(page_test.PageTest):
67 """Tuns a blink performance test and reports the results."""
68 def __init__(self):
69 super(_BlinkPerfMeasurement, self).__init__()
70 with open(os.path.join(os.path.dirname(__file__),
71 'blink_perf.js'), 'r') as f:
72 self._blink_perf_js = f.read()
74 def WillNavigateToPage(self, page, tab):
75 page.script_to_evaluate_on_commit = self._blink_perf_js
77 def CustomizeBrowserOptions(self, options):
78 options.AppendExtraBrowserArgs([
79 '--js-flags=--expose_gc',
80 '--enable-experimental-web-platform-features',
81 '--disable-gesture-requirement-for-media-playback'
83 if 'content-shell' in options.browser_type:
84 options.AppendExtraBrowserArgs('--expose-internals-for-testing')
86 def ValidateAndMeasurePage(self, page, tab, results):
87 tab.WaitForJavaScriptExpression('testRunner.isDone', 600)
89 log = tab.EvaluateJavaScript('document.getElementById("log").innerHTML')
91 for line in log.splitlines():
92 if not line.startswith('values '):
93 continue
94 parts = line.split()
95 values = [float(v.replace(',', '')) for v in parts[1:-1]]
96 units = parts[-1]
97 metric = page.display_name.split('.')[0].replace('/', '_')
98 results.AddValue(list_of_scalar_values.ListOfScalarValues(
99 results.current_page, metric, units, values))
101 break
103 print log
106 class _BlinkPerfFullFrameMeasurement(_BlinkPerfMeasurement):
107 def __init__(self):
108 super(_BlinkPerfFullFrameMeasurement, self).__init__()
109 self._blink_perf_js += '\nwindow.fullFrameMeasurement = true;'
111 def CustomizeBrowserOptions(self, options):
112 super(_BlinkPerfFullFrameMeasurement, self).CustomizeBrowserOptions(
113 options)
114 # Full layout measurement needs content_shell with internals testing API.
115 assert 'content-shell' in options.browser_type
116 options.AppendExtraBrowserArgs(['--expose-internals-for-testing'])
119 class BlinkPerfAnimation(perf_benchmark.PerfBenchmark):
120 tag = 'animation'
121 test = _BlinkPerfMeasurement
123 @classmethod
124 def Name(cls):
125 return 'blink_perf.animation'
127 def CreatePageSet(self, options):
128 path = os.path.join(BLINK_PERF_BASE_DIR, 'Animation')
129 return CreatePageSetFromPath(path, SKIPPED_FILE)
132 class BlinkPerfBindings(perf_benchmark.PerfBenchmark):
133 tag = 'bindings'
134 test = _BlinkPerfMeasurement
136 @classmethod
137 def Name(cls):
138 return 'blink_perf.bindings'
140 def CreatePageSet(self, options):
141 path = os.path.join(BLINK_PERF_BASE_DIR, 'Bindings')
142 return CreatePageSetFromPath(path, SKIPPED_FILE)
145 @benchmark.Enabled('content-shell')
146 class BlinkPerfBlinkGC(perf_benchmark.PerfBenchmark):
147 tag = 'blink_gc'
148 test = _BlinkPerfMeasurement
150 @classmethod
151 def Name(cls):
152 return 'blink_perf.blink_gc'
154 def CreatePageSet(self, options):
155 path = os.path.join(BLINK_PERF_BASE_DIR, 'BlinkGC')
156 return CreatePageSetFromPath(path, SKIPPED_FILE)
159 class BlinkPerfCSS(perf_benchmark.PerfBenchmark):
160 tag = 'css'
161 test = _BlinkPerfMeasurement
163 @classmethod
164 def Name(cls):
165 return 'blink_perf.css'
167 def CreatePageSet(self, options):
168 path = os.path.join(BLINK_PERF_BASE_DIR, 'CSS')
169 return CreatePageSetFromPath(path, SKIPPED_FILE)
172 @benchmark.Disabled('linux', # http://crbug.com/488059
173 'xp') # http://crbug.com/488059
174 class BlinkPerfCanvas(perf_benchmark.PerfBenchmark):
175 tag = 'canvas'
176 test = _BlinkPerfMeasurement
178 @classmethod
179 def Name(cls):
180 return 'blink_perf.canvas'
182 def CreatePageSet(self, options):
183 path = os.path.join(BLINK_PERF_BASE_DIR, 'Canvas')
184 return CreatePageSetFromPath(path, SKIPPED_FILE)
187 class BlinkPerfDOM(perf_benchmark.PerfBenchmark):
188 tag = 'dom'
189 test = _BlinkPerfMeasurement
191 @classmethod
192 def Name(cls):
193 return 'blink_perf.dom'
195 def CreatePageSet(self, options):
196 path = os.path.join(BLINK_PERF_BASE_DIR, 'DOM')
197 return CreatePageSetFromPath(path, SKIPPED_FILE)
200 @benchmark.Disabled('release_x64') # http://crbug.com/480999
201 class BlinkPerfEvents(perf_benchmark.PerfBenchmark):
202 tag = 'events'
203 test = _BlinkPerfMeasurement
205 @classmethod
206 def Name(cls):
207 return 'blink_perf.events'
209 def CreatePageSet(self, options):
210 path = os.path.join(BLINK_PERF_BASE_DIR, 'Events')
211 return CreatePageSetFromPath(path, SKIPPED_FILE)
214 @benchmark.Disabled('win8') # http://crbug.com/462350
215 class BlinkPerfLayout(perf_benchmark.PerfBenchmark):
216 tag = 'layout'
217 test = _BlinkPerfMeasurement
219 @classmethod
220 def Name(cls):
221 return 'blink_perf.layout'
223 def CreatePageSet(self, options):
224 path = os.path.join(BLINK_PERF_BASE_DIR, 'Layout')
225 return CreatePageSetFromPath(path, SKIPPED_FILE)
228 @benchmark.Enabled('content-shell')
229 class BlinkPerfLayoutFullLayout(BlinkPerfLayout):
230 tag = 'layout_full_frame'
231 test = _BlinkPerfFullFrameMeasurement
233 @classmethod
234 def Name(cls):
235 return 'blink_perf.layout_full_frame'
238 class BlinkPerfMutation(perf_benchmark.PerfBenchmark):
239 tag = 'mutation'
240 test = _BlinkPerfMeasurement
242 @classmethod
243 def Name(cls):
244 return 'blink_perf.mutation'
246 def CreatePageSet(self, options):
247 path = os.path.join(BLINK_PERF_BASE_DIR, 'Mutation')
248 return CreatePageSetFromPath(path, SKIPPED_FILE)
251 @benchmark.Disabled('win') # crbug.com/488493
252 class BlinkPerfParser(perf_benchmark.PerfBenchmark):
253 tag = 'parser'
254 test = _BlinkPerfMeasurement
256 @classmethod
257 def Name(cls):
258 return 'blink_perf.parser'
260 def CreatePageSet(self, options):
261 path = os.path.join(BLINK_PERF_BASE_DIR, 'Parser')
262 return CreatePageSetFromPath(path, SKIPPED_FILE)
265 class BlinkPerfSVG(perf_benchmark.PerfBenchmark):
266 tag = 'svg'
267 test = _BlinkPerfMeasurement
269 @classmethod
270 def Name(cls):
271 return 'blink_perf.svg'
273 def CreatePageSet(self, options):
274 path = os.path.join(BLINK_PERF_BASE_DIR, 'SVG')
275 return CreatePageSetFromPath(path, SKIPPED_FILE)
278 @benchmark.Enabled('content-shell')
279 class BlinkPerfSVGFullLayout(BlinkPerfSVG):
280 tag = 'svg_full_frame'
281 test = _BlinkPerfFullFrameMeasurement
283 @classmethod
284 def Name(cls):
285 return 'blink_perf.svg_full_frame'
288 class BlinkPerfShadowDOM(perf_benchmark.PerfBenchmark):
289 tag = 'shadow_dom'
290 test = _BlinkPerfMeasurement
292 @classmethod
293 def Name(cls):
294 return 'blink_perf.shadow_dom'
296 def CreatePageSet(self, options):
297 path = os.path.join(BLINK_PERF_BASE_DIR, 'ShadowDOM')
298 return CreatePageSetFromPath(path, SKIPPED_FILE)
301 # This benchmark is for local testing, doesn't need to run on bots.
302 @benchmark.Disabled()
303 class BlinkPerfXMLHttpRequest(perf_benchmark.PerfBenchmark):
304 tag = 'xml_http_request'
305 test = _BlinkPerfMeasurement
307 @classmethod
308 def Name(cls):
309 return 'blink_perf.xml_http_request'
311 def CreatePageSet(self, options):
312 path = os.path.join(BLINK_PERF_BASE_DIR, 'XMLHttpRequest')
313 return CreatePageSetFromPath(path, SKIPPED_FILE)