Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / tools / perf / measurements / image_decoding.py
1 # Copyright 2012 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.
4
5 from metrics import power
6 from telemetry.page import page_test
7 from telemetry.timeline import model
8 from telemetry.value import scalar
9
10
11 class ImageDecoding(page_test.PageTest):
12   def __init__(self):
13     super(ImageDecoding, self).__init__()
14     self._power_metric = None
15
16   def CustomizeBrowserOptions(self, options):
17     options.AppendExtraBrowserArgs('--enable-gpu-benchmarking')
18     power.PowerMetric.CustomizeBrowserOptions(options)
19
20   def WillStartBrowser(self, browser):
21     self._power_metric = power.PowerMetric(browser)
22
23   def WillNavigateToPage(self, page, tab):
24     tab.ExecuteJavaScript("""
25         if (window.chrome &&
26             chrome.gpuBenchmarking &&
27             chrome.gpuBenchmarking.clearImageCache) {
28           chrome.gpuBenchmarking.clearImageCache();
29         }
30     """)
31     self._power_metric.Start(page, tab)
32     # FIXME: bare 'devtools' is for compatibility with older reference versions
33     # only and may eventually be removed.
34     # FIXME: Remove webkit.console when blink.console lands in chromium and
35     # the ref builds are updated. crbug.com/386847
36     tab.browser.StartTracing(
37         'disabled-by-default-devtools.timeline*,' +
38             'devtools,webkit.console,blink.console')
39
40   def StopBrowserAfterPage(self, browser, page):
41     return not browser.tabs[0].ExecuteJavaScript("""
42         window.chrome &&
43             chrome.gpuBenchmarking &&
44             chrome.gpuBenchmarking.clearImageCache;
45     """)
46
47   def ValidateAndMeasurePage(self, page, tab, results):
48     timeline_data = tab.browser.StopTracing()
49     timeline_model = model.TimelineModel(timeline_data)
50     self._power_metric.Stop(page, tab)
51     self._power_metric.AddResults(tab, results)
52
53     def _IsDone():
54       return tab.EvaluateJavaScript('isDone')
55
56     decode_image_events = timeline_model.GetAllEventsOfName('Decode Image')
57
58     # If it is a real image page, then store only the last-minIterations
59     # decode tasks.
60     if (hasattr(page,
61                'image_decoding_measurement_limit_results_to_min_iterations') and
62         page.image_decoding_measurement_limit_results_to_min_iterations):
63       assert _IsDone()
64       min_iterations = tab.EvaluateJavaScript('minIterations')
65       decode_image_events = decode_image_events[-min_iterations:]
66
67     durations = [d.duration for d in decode_image_events]
68     assert durations, 'Failed to find "Decode Image" trace events.'
69
70     image_decoding_avg = sum(durations) / len(durations)
71     results.AddValue(scalar.ScalarValue(
72         results.current_page, 'ImageDecoding_avg', 'ms', image_decoding_avg,
73         description='Average decode time for images in 4 different '
74                     'formats: gif, png, jpg, and webp. The image files are '
75                     'located at chrome/test/data/image_decoding.'))
76     results.AddValue(scalar.ScalarValue(
77         results.current_page, 'ImageLoading_avg', 'ms',
78         tab.EvaluateJavaScript('averageLoadingTimeMs()')))
79
80   def CleanUpAfterPage(self, page, tab):
81     if tab.browser.is_tracing_running:
82       tab.browser.StopTracing()