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.
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
)
29 if not path
.endswith('.html'):
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':
40 candidate_path
= os
.path
.join(dir_path
, candidate_path
)
41 if candidate_path
.startswith(skipped
):
43 if os
.path
.isdir(candidate_path
):
44 _AddDir(candidate_path
, skipped
)
46 _AddPage(candidate_path
)
48 if os
.path
.isdir(path
):
50 if os
.path
.exists(skipped_file
):
51 for line
in open(skipped_file
, 'r').readlines():
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
))
59 ps
= page_set
.PageSet(file_path
=os
.getcwd()+os
.sep
,
60 serving_dirs
=serving_dirs
)
62 ps
.AddUserStory(page_module
.Page(url
, ps
, ps
.base_dir
))
66 class _BlinkPerfMeasurement(page_test
.PageTest
):
67 """Tuns a blink performance test and reports the results."""
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 '):
95 values
= [float(v
.replace(',', '')) for v
in parts
[1:-1]]
97 metric
= page
.display_name
.split('.')[0].replace('/', '_')
98 results
.AddValue(list_of_scalar_values
.ListOfScalarValues(
99 results
.current_page
, metric
, units
, values
))
106 class _BlinkPerfFullFrameMeasurement(_BlinkPerfMeasurement
):
108 super(_BlinkPerfFullFrameMeasurement
, self
).__init
__()
109 self
._blink
_perf
_js
+= '\nwindow.fullFrameMeasurement = true;'
111 def CustomizeBrowserOptions(self
, options
):
112 super(_BlinkPerfFullFrameMeasurement
, self
).CustomizeBrowserOptions(
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
):
121 test
= _BlinkPerfMeasurement
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
):
134 test
= _BlinkPerfMeasurement
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
):
148 test
= _BlinkPerfMeasurement
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
):
161 test
= _BlinkPerfMeasurement
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
):
176 test
= _BlinkPerfMeasurement
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
):
189 test
= _BlinkPerfMeasurement
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
):
203 test
= _BlinkPerfMeasurement
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
):
217 test
= _BlinkPerfMeasurement
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
235 return 'blink_perf.layout_full_frame'
238 class BlinkPerfMutation(perf_benchmark
.PerfBenchmark
):
240 test
= _BlinkPerfMeasurement
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
):
254 test
= _BlinkPerfMeasurement
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
):
267 test
= _BlinkPerfMeasurement
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
285 return 'blink_perf.svg_full_frame'
288 class BlinkPerfShadowDOM(perf_benchmark
.PerfBenchmark
):
290 test
= _BlinkPerfMeasurement
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
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
)