1d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved. 2d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 3d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)# found in the LICENSE file. 4d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)import os 5d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 6d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)from telemetry.page.actions import gesture_action 7d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)from telemetry.page.actions import page_action 8d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 9d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)class SwipeAction(gesture_action.GestureAction): 10d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) def __init__(self, attributes=None): 11d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) super(SwipeAction, self).__init__(attributes) 12d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) self._SetTimelineMarkerBaseName('SwipeAction::RunAction') 13d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 14d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) def WillRunAction(self, page, tab): 15d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) for js_file in ['gesture_common.js', 'swipe.js']: 16d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) with open(os.path.join(os.path.dirname(__file__), js_file)) as f: 17d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) js = f.read() 18d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) tab.ExecuteJavaScript(js) 19d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 20d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) # Fail if browser doesn't support synthetic swipe gestures. 21d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) if not tab.EvaluateJavaScript('window.__SwipeAction_SupportedByBrowser()'): 22d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) raise page_action.PageActionNotSupported( 23d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 'Synthetic swipe not supported for this browser') 24d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 25d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) # TODO(dominikg): Query synthetic gesture target to check if touch is 26d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) # supported. 27d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 28d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) done_callback = 'function() { window.__swipeActionDone = true; }' 29d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) tab.ExecuteJavaScript(""" 30d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) window.__swipeActionDone = false; 31d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) window.__swipeAction = new __SwipeAction(%s);""" 32d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) % (done_callback)) 33d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 34d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) def RunGesture(self, page, tab, previous_action): 35d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) left_start_percentage = 0.5 36d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) top_start_percentage = 0.5 37d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) direction = 'left' 38d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) distance = 100 39d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) if hasattr(self, 'left_start_percentage'): 40d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) left_start_percentage = self.left_start_percentage 41d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) if hasattr(self, 'top_start_percentage'): 42d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) top_start_percentage = self.top_start_percentage 43d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) if hasattr(self, 'direction'): 44d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) direction = self.direction 45d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) if direction not in ['down', 'up', 'left', 'right']: 46d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) raise page_action.PageActionNotSupported( 47d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 'Invalid swipe direction: %s' % direction) 48d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) if hasattr(self, 'distance'): 49d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) distance = self.distance 50d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) if hasattr(self, 'element_function'): 51d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) tab.ExecuteJavaScript(""" 52d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) (%s)(function(element) { window.__swipeAction.start( 53d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) { element: element, 54d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) left_start_percentage: %s, 55d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) top_start_percentage: %s, 56d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) direction: '%s', 57d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) distance: %s }) 58d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) });""" % (self.element_function, 59d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) left_start_percentage, 60d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) top_start_percentage, 61d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) direction, 62d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) distance)) 63d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) else: 64d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) tab.ExecuteJavaScript(""" 65d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) window.__swipeAction.start( 66d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) { element: document.body, 67d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) left_start_percentage: %s, 68d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) top_start_percentage: %s, 69d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) direction: '%s', 70d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) distance: %s });""" 71d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) % (left_start_percentage, 72d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) top_start_percentage, 73d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) direction, 74d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) distance)) 75d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 76d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) tab.WaitForJavaScriptExpression('window.__swipeActionDone', 60) 77d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 78d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) def CanBeBound(self): 79d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) return True 80d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 81d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) def BindMeasurementJavaScript(self, tab, start_js, stop_js): 82d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) # Make the swipe action start and stop measurement automatically. 83d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) tab.ExecuteJavaScript(""" 84d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) window.__swipeAction.beginMeasuringHook = function() { %s }; 85d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) window.__swipeAction.endMeasuringHook = function() { %s }; 86d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) """ % (start_js, stop_js)) 87