| # Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| from metrics import smoothness |
| from metrics import timeline |
| from telemetry.page import page_measurement |
| |
| |
| class MissingDisplayFrameRateError(page_measurement.MeasurementFailure): |
| def __init__(self, name): |
| super(MissingDisplayFrameRateError, self).__init__( |
| 'Missing display frame rate metrics: ' + name) |
| |
| |
| class Smoothness(page_measurement.PageMeasurement): |
| def __init__(self): |
| super(Smoothness, self).__init__('smoothness') |
| self._metric = None |
| |
| def AddCommandLineOptions(self, parser): |
| metric_choices = ['smoothness', 'timeline'] |
| parser.add_option('--metric', dest='metric', type='choice', |
| choices=metric_choices, |
| default='smoothness', |
| help=('Metric to use in the measurement. ' + |
| 'Supported values: ' + ', '.join(metric_choices))) |
| |
| def CustomizeBrowserOptions(self, options): |
| options.AppendExtraBrowserArgs('--enable-gpu-benchmarking') |
| |
| def CanRunForPage(self, page): |
| return hasattr(page, 'smoothness') |
| |
| def WillRunActions(self, page, tab): |
| if self.options.metric == 'smoothness': |
| self._metric = smoothness.SmoothnessMetric() |
| elif self.options.metric == 'timeline': |
| self._metric = timeline.ThreadTimesTimelineMetric() |
| |
| self._metric.Start(page, tab) |
| |
| if tab.browser.platform.IsRawDisplayFrameRateSupported(): |
| tab.browser.platform.StartRawDisplayFrameRateMeasurement() |
| |
| def DidRunAction(self, page, tab, action): |
| timeline_marker_name = action.GetTimelineMarkerName() |
| if self.options.metric == 'smoothness' and timeline_marker_name: |
| self._metric.AddTimelineMarkerNameToIncludeInMetric(timeline_marker_name) |
| |
| def DidRunActions(self, page, tab): |
| if tab.browser.platform.IsRawDisplayFrameRateSupported(): |
| tab.browser.platform.StopRawDisplayFrameRateMeasurement() |
| self._metric.Stop(page, tab) |
| |
| def MeasurePage(self, page, tab, results): |
| self._metric.AddResults(tab, results) |
| |
| if tab.browser.platform.IsRawDisplayFrameRateSupported(): |
| for r in tab.browser.platform.GetRawDisplayFrameRateMeasurements(): |
| if r.value is None: |
| raise MissingDisplayFrameRateError(r.name) |
| results.Add(r.name, r.unit, r.value) |