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 5 from telemetry.page import page_measurement 6 7 8 class ImageDecoding(page_measurement.PageMeasurement): 9 def CustomizeBrowserOptions(self, options): 10 options.AppendExtraBrowserArgs('--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, browser): 23 return not browser.tabs[0].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