smoothness.py revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch# Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# found in the LICENSE file.
468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)from metrics import smoothness
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)from metrics import timeline
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from telemetry.page import page_measurement
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class MissingDisplayFrameRateError(page_measurement.MeasurementFailure):
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  def __init__(self, name):
128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    super(MissingDisplayFrameRateError, self).__init__(
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        'Missing display frame rate metrics: ' + name)
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass Smoothness(page_measurement.PageMeasurement):
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def __init__(self):
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    super(Smoothness, self).__init__('smoothness')
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    self._metric = None
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  def AddCommandLineOptions(self, parser):
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    metric_choices = ['smoothness', 'timeline']
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    parser.add_option('--metric', dest='metric', type='choice',
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                      choices=metric_choices,
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                      default='smoothness',
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                      help=('Metric to use in the measurement. ' +
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                            'Supported values: ' + ', '.join(metric_choices)))
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def CustomizeBrowserOptions(self, options):
308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    options.AppendExtraBrowserArgs('--enable-gpu-benchmarking')
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def CanRunForPage(self, page):
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return hasattr(page, 'smoothness')
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def WillRunActions(self, page, tab):
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if self.options.metric == 'smoothness':
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      self._metric = smoothness.SmoothnessMetric()
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    elif self.options.metric == 'timeline':
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      self._metric = timeline.ThreadTimesTimelineMetric()
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    self._metric.Start(page, tab)
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if tab.browser.platform.IsRawDisplayFrameRateSupported():
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      tab.browser.platform.StartRawDisplayFrameRateMeasurement()
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def DidRunAction(self, page, tab, action):
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    timeline_marker_name = action.GetTimelineMarkerName()
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if self.options.metric == 'smoothness' and timeline_marker_name:
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      self._metric.AddTimelineMarkerNameToIncludeInMetric(timeline_marker_name)
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def DidRunActions(self, page, tab):
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if tab.browser.platform.IsRawDisplayFrameRateSupported():
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      tab.browser.platform.StopRawDisplayFrameRateMeasurement()
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    self._metric.Stop(page, tab)
55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def MeasurePage(self, page, tab, results):
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    self._metric.AddResults(tab, results)
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if tab.browser.platform.IsRawDisplayFrameRateSupported():
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      for r in tab.browser.platform.GetRawDisplayFrameRateMeasurements():
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        if r.value is None:
628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)          raise MissingDisplayFrameRateError(r.name)
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        results.Add(r.name, r.unit, r.value)
64