| # Copyright 2014 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 telemetry.value import improvement_direction |
| from telemetry.value import list_of_scalar_values |
| from telemetry.web_perf.metrics import timeline_based_metric |
| |
| |
| class _SingleEventMetric(timeline_based_metric.TimelineBasedMetric): |
| """Reports directly durations of specific trace events that start during the |
| user interaction. |
| """ |
| |
| def __init__(self, trace_event_name, metric_name, metric_description=None): |
| super(_SingleEventMetric, self).__init__() |
| self._TRACE_EVENT_NAME = trace_event_name |
| self._metric_name = metric_name |
| self._metric_description = metric_description |
| |
| def AddResults(self, model, renderer_thread, interactions, results): |
| del model # unused |
| assert interactions |
| self._AddResultsInternal(renderer_thread.parent.IterAllSlices(), |
| interactions, results) |
| |
| def _AddResultsInternal(self, events, interactions, results): |
| events_found = [] |
| for event in events: |
| if (event.name == self._TRACE_EVENT_NAME) and any( |
| interaction.start <= event.start <= interaction.end |
| for interaction in interactions): |
| if event.has_thread_timestamps: |
| events_found.append(event.thread_duration) |
| else: |
| events_found.append(event.duration) |
| if not events_found: |
| return |
| results.AddValue(list_of_scalar_values.ListOfScalarValues( |
| page=results.current_page, |
| tir_label=interactions[0].label, |
| name=self._metric_name, |
| units='ms', |
| values=events_found, |
| description=self._metric_description, |
| improvement_direction=improvement_direction.DOWN)) |