1# Copyright 2015 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. 4 5import numbers 6 7from telemetry.internal.actions import page_action 8from telemetry.internal.actions import utils 9from telemetry.web_perf import timeline_interaction_record 10 11 12class RepeatableScrollAction(page_action.PageAction): 13 14 def __init__(self, x_scroll_distance_ratio=0.0, y_scroll_distance_ratio=0.5, 15 repeat_count=0, repeat_delay_ms=250, 16 timeout=page_action.DEFAULT_TIMEOUT, 17 prevent_fling=None, speed=None): 18 super(RepeatableScrollAction, self).__init__(timeout=timeout) 19 self._x_scroll_distance_ratio = x_scroll_distance_ratio 20 self._y_scroll_distance_ratio = y_scroll_distance_ratio 21 self._repeat_count = repeat_count 22 self._repeat_delay_ms = repeat_delay_ms 23 self._windowsize = [] 24 self._prevent_fling = prevent_fling 25 self._speed = speed 26 27 def WillRunAction(self, tab): 28 utils.InjectJavaScript(tab, 'gesture_common.js') 29 # Get the dimensions of the screen. 30 self._windowsize = tab.EvaluateJavaScript( 31 '[__GestureCommon_GetWindowWidth(),' 32 ' __GestureCommon_GetWindowHeight()]') 33 assert len(self._windowsize) == 2 34 assert all(isinstance(d, numbers.Number) for d in self._windowsize) 35 36 def RunAction(self, tab): 37 # Set up a browser driven repeating scroll. The delay between the scrolls 38 # should be unaffected by render thread responsivness (or lack there of). 39 tab.SynthesizeScrollGesture( 40 x=int(self._windowsize[0] / 2), 41 y=int(self._windowsize[1] / 2), 42 x_distance=int(self._x_scroll_distance_ratio * self._windowsize[0]), 43 y_distance=int(-self._y_scroll_distance_ratio * self._windowsize[1]), 44 prevent_fling=self._prevent_fling, 45 speed=self._speed, 46 repeat_count=self._repeat_count, 47 repeat_delay_ms=self._repeat_delay_ms, 48 interaction_marker_name=timeline_interaction_record.GetJavaScriptMarker( 49 'Gesture_ScrollAction', [timeline_interaction_record.REPEATABLE]), 50 timeout=self.timeout) 51