# 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.logical_name.startswith('Gesture_'):
    return copy.copy(interaction_record)
  gesture_events = [
    ev for ev
    in timeline.GetAllEventsOfName('SyntheticGestureController::running', True)
    if 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.logical_name)
  return tir_module.TimelineInteractionRecord(interaction_record.logical_name,
                                              gesture_events[0].start,
                                              gesture_events[0].end)
