blob: 0d0d45349878f99014cacf53e01a67e667126447 [file] [log] [blame]
# 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.
import copy
from telemetry.web_perf import timeline_interaction_record as tir_module
def GetAdjustedInteractionIfContainGesture(timeline, interaction_record):
""" Returns a new interaction record if interaction_record contains geture
whose time range that overlaps with interaction_record's range. If not,
returns a clone of original interaction_record.
The synthetic gesture controller inserts a trace marker to precisely
demarcate when the gesture was running. We check for overlap, not inclusion,
because gesture_actions can start/end slightly outside the telemetry markers
on Windows. This problem is probably caused by a race condition between
the browser and renderer process submitting the trace events for the
markers.
"""
# Only adjust the range for gestures.
if not interaction_record.label.startswith('Gesture_'):
return copy.copy(interaction_record)
gesture_events = [
ev for ev
in timeline.IterAllAsyncSlicesOfName('SyntheticGestureController::running')
if ev.parent_slice is None and
ev.start <= interaction_record.end and
ev.end >= interaction_record.start]
if len(gesture_events) == 0:
return copy.copy(interaction_record)
if len(gesture_events) > 1:
raise Exception('More than one possible synthetic gesture marker found in '
'interaction_record %s.' % interaction_record.label)
return tir_module.TimelineInteractionRecord(
interaction_record.label, gesture_events[0].start,
gesture_events[0].end, gesture_events[0],
interaction_record._flags) # pylint: disable=protected-access