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.
8 from telemetry
import benchmark
9 from telemetry
import page
as page_module
10 from telemetry
.page
import page_set
11 from telemetry
.page
import page_test
12 from telemetry
.value
import scalar
14 from metrics
import power
17 class _DromaeoMeasurement(page_test
.PageTest
):
19 super(_DromaeoMeasurement
, self
).__init
__()
20 self
._power
_metric
= None
22 def CustomizeBrowserOptions(self
, options
):
23 power
.PowerMetric
.CustomizeBrowserOptions(options
)
25 def WillStartBrowser(self
, platform
):
26 self
._power
_metric
= power
.PowerMetric(platform
)
28 def DidNavigateToPage(self
, page
, tab
):
29 self
._power
_metric
.Start(page
, tab
)
31 def ValidateAndMeasurePage(self
, page
, tab
, results
):
32 tab
.WaitForJavaScriptExpression(
33 'window.document.getElementById("pause") &&' +
34 'window.document.getElementById("pause").value == "Run"',
37 # Start spying on POST request that will report benchmark results, and
38 # intercept result data.
39 tab
.ExecuteJavaScript('(function() {' +
40 ' var real_jquery_ajax_ = window.jQuery;' +
41 ' window.results_ = "";' +
42 ' window.jQuery.ajax = function(request) {' +
43 ' if (request.url == "store.php") {' +
44 ' window.results_ =' +
45 ' decodeURIComponent(request.data);' +
46 ' window.results_ = window.results_.substring(' +
47 ' window.results_.indexOf("=") + 1, ' +
48 ' window.results_.lastIndexOf("&"));' +
49 ' real_jquery_ajax_(request);' +
54 tab
.ExecuteJavaScript('window.document.getElementById("pause").click();')
56 tab
.WaitForJavaScriptExpression('!!window.results_', 600)
58 self
._power
_metric
.Stop(page
, tab
)
59 self
._power
_metric
.AddResults(tab
, results
)
61 score
= eval(tab
.EvaluateJavaScript('window.results_ || "[]"'))
64 chars
= [' ', '.', '-', '/', '(', ')', '*']
69 def AggregateData(container
, key
, value
):
70 if key
not in container
:
71 container
[key
] = {'count': 0, 'sum': 0}
72 container
[key
]['count'] += 1
73 container
[key
]['sum'] += math
.log(value
)
75 suffix
= page
.url
[page
.url
.index('?') + 1 :]
76 def AddResult(name
, value
):
80 results
.AddValue(scalar
.ScalarValue(
81 results
.current_page
, Escape(name
), 'runs/s', value
, important
))
85 AddResult('%s/%s' % (data
['collection'], data
['name']),
88 top_name
= data
['collection'].split('-', 1)[0]
89 AggregateData(aggregated
, top_name
, data
['mean'])
91 collection_name
= data
['collection']
92 AggregateData(aggregated
, collection_name
, data
['mean'])
94 for key
, value
in aggregated
.iteritems():
95 AddResult(key
, math
.exp(value
['sum'] / value
['count']))
97 class _DromaeoBenchmark(benchmark
.Benchmark
):
98 """A base class for Dromaeo benchmarks."""
99 test
= _DromaeoMeasurement
105 def CreatePageSet(self
, options
):
106 """Makes a PageSet for Dromaeo benchmarks."""
107 # Subclasses are expected to define class members called query_param and
109 if not hasattr(self
, 'query_param') or not hasattr(self
, 'tag'):
110 raise NotImplementedError('query_param or tag not in Dromaeo benchmark.')
111 archive_data_file
= '../page_sets/data/dromaeo.%s.json' % self
.tag
112 ps
= page_set
.PageSet(
113 archive_data_file
=archive_data_file
,
114 file_path
=os
.path
.abspath(__file__
), bucket
=page_set
.PUBLIC_BUCKET
)
115 url
= 'http://dromaeo.com?%s' % self
.query_param
116 ps
.AddUserStory(page_module
.Page(
117 url
, ps
, ps
.base_dir
, make_javascript_deterministic
=False))
121 class DromaeoDomCoreAttr(_DromaeoBenchmark
):
122 """Dromaeo DOMCore attr JavaScript benchmark.
124 Tests setting and getting DOM node attributes.
127 query_param
= 'dom-attr'
131 return 'dromaeo.domcoreattr'
134 class DromaeoDomCoreModify(_DromaeoBenchmark
):
135 """Dromaeo DOMCore modify JavaScript benchmark.
137 Tests creating and injecting DOM nodes.
139 tag
= 'domcoremodify'
140 query_param
= 'dom-modify'
144 return 'dromaeo.domcoremodify'
147 class DromaeoDomCoreQuery(_DromaeoBenchmark
):
148 """Dromaeo DOMCore query JavaScript benchmark.
150 Tests querying DOM elements in a document.
153 query_param
= 'dom-query'
157 return 'dromaeo.domcorequery'
160 class DromaeoDomCoreTraverse(_DromaeoBenchmark
):
161 """Dromaeo DOMCore traverse JavaScript benchmark.
163 Tests traversing a DOM structure.
165 tag
= 'domcoretraverse'
166 query_param
= 'dom-traverse'
170 return 'dromaeo.domcoretraverse'
173 class DromaeoJslibAttrJquery(_DromaeoBenchmark
):
174 """Dromaeo JSLib attr jquery JavaScript benchmark.
176 Tests setting and getting DOM node attributes using the jQuery JavaScript
179 tag
= 'jslibattrjquery'
180 query_param
= 'jslib-attr-jquery'
184 return 'dromaeo.jslibattrjquery'
187 class DromaeoJslibAttrPrototype(_DromaeoBenchmark
):
188 """Dromaeo JSLib attr prototype JavaScript benchmark.
190 Tests setting and getting DOM node attributes using the jQuery JavaScript
193 tag
= 'jslibattrprototype'
194 query_param
= 'jslib-attr-prototype'
198 return 'dromaeo.jslibattrprototype'
201 class DromaeoJslibEventJquery(_DromaeoBenchmark
):
202 """Dromaeo JSLib event jquery JavaScript benchmark.
204 Tests binding, removing, and triggering DOM events using the jQuery JavaScript
207 tag
= 'jslibeventjquery'
208 query_param
= 'jslib-event-jquery'
212 return 'dromaeo.jslibeventjquery'
215 class DromaeoJslibEventPrototype(_DromaeoBenchmark
):
216 """Dromaeo JSLib event prototype JavaScript benchmark.
218 Tests binding, removing, and triggering DOM events using the Prototype
221 tag
= 'jslibeventprototype'
222 query_param
= 'jslib-event-prototype'
226 return 'dromaeo.jslibeventprototype'
229 # xp: crbug.com/389731
230 # win7: http://crbug.com/479796
231 @benchmark.Disabled('xp', 'win7')
232 class DromaeoJslibModifyJquery(_DromaeoBenchmark
):
233 """Dromaeo JSLib modify jquery JavaScript benchmark.
235 Tests creating and injecting DOM nodes into a document using the jQuery
238 tag
= 'jslibmodifyjquery'
239 query_param
= 'jslib-modify-jquery'
243 return 'dromaeo.jslibmodifyjquery'
246 class DromaeoJslibModifyPrototype(_DromaeoBenchmark
):
247 """Dromaeo JSLib modify prototype JavaScript benchmark.
249 Tests creating and injecting DOM nodes into a document using the Prototype
252 tag
= 'jslibmodifyprototype'
253 query_param
= 'jslib-modify-prototype'
257 return 'dromaeo.jslibmodifyprototype'
260 class DromaeoJslibStyleJquery(_DromaeoBenchmark
):
261 """Dromaeo JSLib style jquery JavaScript benchmark.
263 Tests getting and setting CSS information on DOM elements using the jQuery
266 tag
= 'jslibstylejquery'
267 query_param
= 'jslib-style-jquery'
271 return 'dromaeo.jslibstylejquery'
274 class DromaeoJslibStylePrototype(_DromaeoBenchmark
):
275 """Dromaeo JSLib style prototype JavaScript benchmark.
277 Tests getting and setting CSS information on DOM elements using the jQuery
280 tag
= 'jslibstyleprototype'
281 query_param
= 'jslib-style-prototype'
285 return 'dromaeo.jslibstyleprototype'
288 class DromaeoJslibTraverseJquery(_DromaeoBenchmark
):
289 """Dromaeo JSLib traverse jquery JavaScript benchmark.
292 Tests getting and setting CSS information on DOM elements using the Prototype
295 tag
= 'jslibtraversejquery'
296 query_param
= 'jslib-traverse-jquery'
300 return 'dromaeo.jslibtraversejquery'
303 class DromaeoJslibTraversePrototype(_DromaeoBenchmark
):
304 """Dromaeo JSLib traverse prototype JavaScript benchmark.
306 Tests traversing a DOM structure using the jQuery JavaScript Library.
308 tag
= 'jslibtraverseprototype'
309 query_param
= 'jslib-traverse-prototype'
313 return 'dromaeo.jslibtraverseprototype'
316 class DromaeoCSSQueryJquery(_DromaeoBenchmark
):
317 """Dromaeo CSS Query jquery JavaScript benchmark.
319 Tests traversing a DOM structure using the Prototype JavaScript Library.
321 tag
= 'cssqueryjquery'
322 query_param
= 'cssquery-jquery'
326 return 'dromaeo.cssqueryjquery'