1# Copyright 2014 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 measurements import smoothness_controller 6from telemetry.page import page_measurement 7 8 9class Repaint(page_measurement.PageMeasurement): 10 def __init__(self): 11 super(Repaint, self).__init__('RunRepaint', False) 12 self._smoothness_controller = None 13 self._micro_benchmark_id = None 14 15 @classmethod 16 def AddCommandLineArgs(cls, parser): 17 parser.add_option('--mode', type='string', 18 default='viewport', 19 help='Invalidation mode. ' 20 'Supported values: fixed_size, layer, random, viewport.') 21 parser.add_option('--width', type='int', 22 default=None, 23 help='Width of invalidations for fixed_size mode.') 24 parser.add_option('--height', type='int', 25 default=None, 26 help='Height of invalidations for fixed_size mode.') 27 28 def CustomizeBrowserOptions(self, options): 29 options.AppendExtraBrowserArgs([ 30 '--enable-impl-side-painting', 31 '--enable-threaded-compositing', 32 '--enable-gpu-benchmarking' 33 ]) 34 35 def WillRunActions(self, page, tab): 36 tab.WaitForDocumentReadyStateToBeComplete() 37 self._smoothness_controller = smoothness_controller.SmoothnessController() 38 self._smoothness_controller.Start(page, tab) 39 # Rasterize only what's visible. 40 tab.ExecuteJavaScript( 41 'chrome.gpuBenchmarking.setRasterizeOnlyVisibleContent();') 42 43 args = {} 44 args['mode'] = self.options.mode 45 if self.options.width: 46 args['width'] = self.options.width 47 if self.options.height: 48 args['height'] = self.options.height 49 50 # Enque benchmark 51 tab.ExecuteJavaScript(""" 52 window.benchmark_results = {}; 53 window.benchmark_results.id = 54 chrome.gpuBenchmarking.runMicroBenchmark( 55 "invalidation_benchmark", 56 function(value) {}, 57 """ + str(args) + """ 58 ); 59 """) 60 61 self._micro_benchmark_id = tab.EvaluateJavaScript( 62 'window.benchmark_results.id') 63 if (not self._micro_benchmark_id): 64 raise page_measurement.MeasurementFailure( 65 'Failed to schedule invalidation_benchmark.') 66 67 def DidRunActions(self, page, tab): 68 tab.ExecuteJavaScript(""" 69 window.benchmark_results.message_handled = 70 chrome.gpuBenchmarking.sendMessageToMicroBenchmark( 71 """ + str(self._micro_benchmark_id) + """, { 72 "notify_done": true 73 }); 74 """) 75 self._smoothness_controller.Stop(tab) 76 77 def MeasurePage(self, page, tab, results): 78 self._smoothness_controller.AddResults(tab, results) 79 80 def CleanUpAfterPage(self, _, tab): 81 self._smoothness_controller.CleanUp(tab) 82