| Index: tools/telemetry/telemetry/web_perf/timeline_interaction_record.py
|
| diff --git a/tools/telemetry/telemetry/web_perf/timeline_interaction_record.py b/tools/telemetry/telemetry/web_perf/timeline_interaction_record.py
|
| index a60088ece51e91faca5bdda69395732e84e4ab65..436538f8d65916db161b0d0d3c10a79845f40f0e 100644
|
| --- a/tools/telemetry/telemetry/web_perf/timeline_interaction_record.py
|
| +++ b/tools/telemetry/telemetry/web_perf/timeline_interaction_record.py
|
| @@ -8,13 +8,18 @@ from telemetry import decorators
|
| import telemetry.timeline.bounds as timeline_bounds
|
|
|
|
|
| +# Enables the smoothness metric for this interaction
|
| IS_SMOOTH = 'is_smooth'
|
| +# Enables the responsiveness metric for this interaction
|
| IS_RESPONSIVE = 'is_responsive'
|
| +# Allows multiple duplicate interactions of the same type
|
| +REPEATABLE = 'repeatable'
|
|
|
| -FLAGS = [
|
| - IS_SMOOTH,
|
| - IS_RESPONSIVE
|
| +METRICS = [
|
| + IS_RESPONSIVE,
|
| + IS_SMOOTH
|
| ]
|
| +FLAGS = METRICS + [REPEATABLE]
|
|
|
|
|
| class ThreadTimeRangeOverlappedException(Exception):
|
| @@ -29,6 +34,12 @@ class NoThreadTimeDataException(ThreadTimeRangeOverlappedException):
|
| def IsTimelineInteractionRecord(event_name):
|
| return event_name.startswith('Interaction.')
|
|
|
| +def _AssertFlagsAreValid(flags):
|
| + assert isinstance(flags, list)
|
| + for f in flags:
|
| + if f not in FLAGS:
|
| + raise AssertionError(
|
| + 'Unrecognized flag for a timeline Interaction record: %s' % f)
|
|
|
| class TimelineInteractionRecord(object):
|
| """Represents an interaction that took place during a timeline recording.
|
| @@ -66,6 +77,10 @@ class TimelineInteractionRecord(object):
|
| smoothness and network metrics to be reported for the marked up 1000ms
|
| time-range.
|
|
|
| + The valid interaction flags are:
|
| + * is_smooth: Enables the smoothness metrics
|
| + * is_responsive: Enables the responsiveness metrics
|
| + * repeatable: Allows other interactions to use the same logical name
|
| """
|
|
|
| def __init__(self, logical_name, start, end, async_event=None):
|
| @@ -75,6 +90,7 @@ class TimelineInteractionRecord(object):
|
| self.end = end
|
| self.is_smooth = False
|
| self.is_responsive = False
|
| + self.repeatable = False
|
| self._async_event = async_event
|
|
|
| # TODO(nednguyen): After crbug.com/367175 is marked fixed, we should be able
|
| @@ -105,17 +121,12 @@ class TimelineInteractionRecord(object):
|
|
|
| record = TimelineInteractionRecord(logical_name, async_event.start,
|
| async_event.end, async_event)
|
| - for f in flags:
|
| - if not f in FLAGS:
|
| - raise Exception(
|
| - 'Unrecognized flag in timeline Interaction record: %s' % f)
|
| + _AssertFlagsAreValid(flags)
|
| record.is_smooth = IS_SMOOTH in flags
|
| record.is_responsive = IS_RESPONSIVE in flags
|
| + record.repeatable = REPEATABLE in flags
|
| return record
|
|
|
| - def GetResultNameFor(self, result_name):
|
| - return '%s-%s' % (self.logical_name, result_name)
|
| -
|
| @decorators.Cache
|
| def GetBounds(self):
|
| bounds = timeline_bounds.Bounds()
|
| @@ -128,13 +139,15 @@ class TimelineInteractionRecord(object):
|
| """ Get the marker string of an interaction record with logical_name
|
| and flags.
|
| """
|
| - assert isinstance(flags, list)
|
| - for f in flags:
|
| - if f not in FLAGS:
|
| - raise AssertionError(
|
| - 'Unrecognized flag for a timeline Interaction record: %s' % f)
|
| + _AssertFlagsAreValid(flags)
|
| return 'Interaction.%s/%s' % (logical_name, ','.join(flags))
|
|
|
| + def HasMetric(self, metric_type):
|
| + if metric_type not in METRICS:
|
| + raise AssertionError('Unrecognized metric type for a timeline '
|
| + 'interaction record: %s' % metric_type)
|
| + return getattr(self, metric_type)
|
| +
|
| def GetOverlappedThreadTimeForSlice(self, timeline_slice):
|
| """Get the thread duration of timeline_slice that overlaps with this record.
|
|
|
|
|