1# Copyright (c) 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
5from telemetry.page import page_measurement
6
7
8class ImageDecoding(page_measurement.PageMeasurement):
9  def CustomizeBrowserOptions(self, options):
10    options.extra_browser_args.append('--enable-gpu-benchmarking')
11
12  def WillNavigateToPage(self, page, tab):
13    tab.ExecuteJavaScript("""
14        if (window.chrome &&
15            chrome.gpuBenchmarking &&
16            chrome.gpuBenchmarking.clearImageCache) {
17          chrome.gpuBenchmarking.clearImageCache();
18        }
19    """)
20    tab.StartTimelineRecording()
21
22  def NeedsBrowserRestartAfterEachRun(self, tab):
23    return not tab.ExecuteJavaScript("""
24        window.chrome &&
25            chrome.gpuBenchmarking &&
26            chrome.gpuBenchmarking.clearImageCache;
27    """)
28
29  def MeasurePage(self, page, tab, results):
30    tab.StopTimelineRecording()
31    def _IsDone():
32      return tab.EvaluateJavaScript('isDone')
33
34    decode_image_events = \
35        tab.timeline_model.GetAllEventsOfName('DecodeImage')
36
37    # If it is a real image page, then store only the last-minIterations
38    # decode tasks.
39    if (hasattr(page,
40               'image_decoding_measurement_limit_results_to_min_iterations') and
41        page.image_decoding_measurement_limit_results_to_min_iterations):
42      assert _IsDone()
43      min_iterations = tab.EvaluateJavaScript('minIterations')
44      decode_image_events = decode_image_events[-min_iterations:]
45
46    durations = [d.duration for d in decode_image_events]
47    if not durations:
48      results.Add('ImageDecoding_avg', 'ms', 'unsupported')
49      return
50    image_decoding_avg = sum(durations) / len(durations)
51    results.Add('ImageDecoding_avg', 'ms', image_decoding_avg)
52    results.Add('ImageLoading_avg', 'ms',
53                tab.EvaluateJavaScript('averageLoadingTimeMs()'))
54