1# Copyright 2014 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4import copy
5
6from telemetry.web_perf import timeline_interaction_record as tir_module
7
8
9def GetAdjustedInteractionIfContainGesture(timeline, interaction_record):
10  """ Returns a new interaction record if interaction_record contains geture
11  whose time range that overlaps with interaction_record's range. If not,
12  returns a clone of original interaction_record.
13  The synthetic gesture controller inserts a trace marker to precisely
14  demarcate when the gesture was running. We check for overlap, not inclusion,
15  because gesture_actions can start/end slightly outside the telemetry markers
16  on Windows. This problem is probably caused by a race condition between
17  the browser and renderer process submitting the trace events for the
18  markers.
19  """
20  # Only adjust the range for gestures.
21  if not interaction_record.label.startswith('Gesture_'):
22    return copy.copy(interaction_record)
23  gesture_events = [
24    ev for ev
25    in timeline.IterAllAsyncSlicesOfName('SyntheticGestureController::running')
26    if ev.parent_slice is None and
27    ev.start <= interaction_record.end and
28    ev.end >= interaction_record.start]
29  if len(gesture_events) == 0:
30    return copy.copy(interaction_record)
31  if len(gesture_events) > 1:
32    raise Exception('More than one possible synthetic gesture marker found in '
33                    'interaction_record %s.' % interaction_record.label)
34  return tir_module.TimelineInteractionRecord(
35    interaction_record.label, gesture_events[0].start,
36    gesture_events[0].end, gesture_events[0],
37    interaction_record._flags)  # pylint: disable=protected-access
38