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