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