15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_AURA_TEST_EVENT_GENERATOR_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_AURA_TEST_EVENT_GENERATOR_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/events/event_constants.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/keycodes/keyboard_codes.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TimeDelta;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Event;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class KeyEvent;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MouseEvent;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScrollEvent;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TouchEvent;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace aura {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RootWindow;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Window;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace client {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScreenPositionClient;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef base::Callback<void(ui::EventType, const gfx::Vector2dF&)>
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ScrollStepCallback;
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A delegate interface for EventGenerator that provides a way to
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// locate aura root window for given point.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class EventGeneratorDelegate {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~EventGeneratorDelegate() {}
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns a root window for given point.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual RootWindow* GetRootWindowAt(const gfx::Point& point) const = 0;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the screen position client that determines the
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // coordinates used in EventGenerator. EventGenerator uses
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RootWindow's coordinate if this retruns NULL.
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual client::ScreenPositionClient* GetScreenPositionClient(
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const aura::Window* window) const = 0;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// EventGenerator is a tool that generates and dispatch events.
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Unlike |ui_controls| package in ui/base/test, this does not
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// generate platform native events. Insetad, it directly posts event
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// to |aura::RootWindow| synchronously.
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Advantage of using this class, compared to |ui_controls| is that
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// you can write the tests that involves events in synchronus
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// way. There is no need to wait for native
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// On the other hand, this class is not suited for the following
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// cases:
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 1) If your test depends on native events (ui::Event::native_event()).
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//   This return is empty/NULL event with EventGenerator.
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 2) If your test involves nested message loop, such as
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//    menu or drag & drop. Because this class directly
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//    post an event to RootWindow, this event will not be
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//    handled in the nested message loop.
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 3) Similarly, |base::MessagePumpObserver| will not be invoked.
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 4) Any other code that requires native events, such as
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//    tests for RootWindowHostWin/RootWindowHostX11.
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// If one of these applies to your test, please use |ui_controls|
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// package instead.
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Note: The coordinates of the points in API is determined by the
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// EventGeneratorDelegate.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EventGenerator {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates an EventGenerator with the mouse/touch location (0,0),
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // which uses the |root_window|'s coordinates.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit EventGenerator(RootWindow* root_window);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create an EventGenerator with EventGeneratorDelegate,
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // which uses the coordinates used by |delegate|.
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit EventGenerator(EventGeneratorDelegate* delegate);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates an EventGenerator with the mouse/touch location
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // at |initial_location|, which uses the |root_window|'s coordinates.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventGenerator(RootWindow* root_window, const gfx::Point& initial_location);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates an EventGenerator with the mouse/touch location
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // centered over |window|, which uses the |root_window|'s coordinates.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventGenerator(RootWindow* root_window, Window* window);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~EventGenerator();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Explicitly sets the location used by mouse/touch events. This is set by the
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // various methods that take a location but can be manipulated directly,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // typically for touch.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_current_location(const gfx::Point& location) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_location_ = location;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point& current_location() const { return current_location_; }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_async(bool async) { async_ = async; }
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool async() const { return async_; }
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resets the event flags bitmask.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_flags(int flags) { flags_ = flags; }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates a left button press event.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PressLeftButton();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates a left button release event.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReleaseLeftButton();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates events to click (press, release) left button.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClickLeftButton();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates a double click event using the left button.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoubleClickLeftButton();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates a right button press event.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PressRightButton();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates a right button release event.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReleaseRightButton();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Generates events to move mouse to be the given |point| in the
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |current_root_window_|'s host window coordinates.
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void MoveMouseToInHost(const gfx::Point& point_in_host);
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void MoveMouseToInHost(int x, int y) {
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MoveMouseToInHost(gfx::Point(x, y));
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Generates events to move mouse to be the given |point| in screen
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // coordinates.
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void MoveMouseTo(const gfx::Point& point_in_screen, int count);
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void MoveMouseTo(const gfx::Point& point_in_screen) {
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MoveMouseTo(point_in_screen, 1);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MoveMouseTo(int x, int y) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MoveMouseTo(gfx::Point(x, y));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates events to move mouse to be the given |point| in |window|'s
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // coordinates.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MoveMouseRelativeTo(const Window* window, const gfx::Point& point);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MoveMouseRelativeTo(const Window* window, int x, int y) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MoveMouseRelativeTo(window, gfx::Point(x, y));
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MoveMouseBy(int x, int y) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MoveMouseTo(current_location_ + gfx::Vector2d(x, y));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates events to drag mouse to given |point|.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DragMouseTo(const gfx::Point& point);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DragMouseTo(int x, int y) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DragMouseTo(gfx::Point(x, y));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DragMouseBy(int dx, int dy) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DragMouseTo(current_location_ + gfx::Vector2d(dx, dy));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates events to move the mouse to the center of the window.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MoveMouseToCenterOf(Window* window);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates a touch press event.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PressTouch();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates a ET_TOUCH_MOVED event to |point|.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MoveTouch(const gfx::Point& point);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates a touch release event.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReleaseTouch();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates press, move and release event to move touch
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to be the given |point|.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PressMoveAndReleaseTouchTo(const gfx::Point& point);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PressMoveAndReleaseTouchTo(int x, int y) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PressMoveAndReleaseTouchTo(gfx::Point(x, y));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PressMoveAndReleaseTouchBy(int x, int y) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PressMoveAndReleaseTouchTo(current_location_ + gfx::Vector2d(x, y));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates press, move and release events to move touch
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to the center of the window.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PressMoveAndReleaseTouchToCenterOf(Window* window);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates and dispatches touch-events required to generate a TAP gesture.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that this can generate a number of other gesture events at the same
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // time (e.g. GESTURE_BEGIN, TAP_DOWN, END).
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GestureTapAt(const gfx::Point& point);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates press and release touch-events to generate a TAP_DOWN event, but
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // without generating any scroll or tap events. This can also generate a few
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // other gesture events (e.g. GESTURE_BEGIN, END).
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GestureTapDownAndUp(const gfx::Point& point);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates press, move, release touch-events to generate a sequence of
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // scroll events. |duration| and |steps| affect the velocity of the scroll,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and depending on these values, this may also generate FLING scroll
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // gestures. If velocity/fling is irrelevant for the test, then any non-zero
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // values for these should be sufficient.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GestureScrollSequence(const gfx::Point& start,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const gfx::Point& end,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const base::TimeDelta& duration,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int steps);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The same as GestureScrollSequence(), with the exception that |callback| is
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // called at each step of the scroll sequence. |callback| is called at the
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // start of the sequence with ET_GESTURE_SCROLL_BEGIN, followed by one or more
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ET_GESTURE_SCROLL_UPDATE and ends with an ET_GESTURE_SCROLL_END.
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void GestureScrollSequenceWithCallback(const gfx::Point& start,
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         const gfx::Point& end,
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         const base::TimeDelta& duration,
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         int steps,
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         const ScrollStepCallback& callback);
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates press, move, release touch-events to generate a sequence of
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // multi-finger scroll events. |count| specifies the number of touch-points
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that should generate the scroll events. |start| are the starting positions
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of all the touch points. |steps| and |event_separation_time_ms| are
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // relevant when testing velocity/fling/swipe, otherwise these can be any
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // non-zero value. |delta_x| and |delta_y| are the amount that each finger
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should be moved.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GestureMultiFingerScroll(int count,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const gfx::Point* start,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int event_separation_time_ms,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int steps,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int move_x,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int move_y);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Generates scroll sequences of a FlingCancel, Scrolls, FlingStart, with
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // constant deltas to |x_offset| and |y_offset| in |steps|.
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ScrollSequence(const gfx::Point& start,
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const base::TimeDelta& step_delay,
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      float x_offset,
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      float y_offset,
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      int steps,
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      int num_fingers);
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Generates scroll sequences of a FlingCancel, Scrolls, FlingStart, sending
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // scrolls of each of the values in |offsets|.
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ScrollSequence(const gfx::Point& start,
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const base::TimeDelta& step_delay,
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const std::vector<gfx::Point>& offsets,
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      int num_fingers);
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates a key press event. On platforms except Windows and X11, a key
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // event without native_event() is generated. Note that ui::EF_ flags should
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be passed as |flags|, not the native ones like 'ShiftMask' in <X11/X.h>.
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(yusukes): Support native_event() on all platforms.
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PressKey(ui::KeyboardCode key_code, int flags);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates a key release event. On platforms except Windows and X11, a key
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // event without native_event() is generated. Note that ui::EF_ flags should
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be passed as |flags|, not the native ones like 'ShiftMask' in <X11/X.h>.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(yusukes): Support native_event() on all platforms.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReleaseKey(ui::KeyboardCode key_code, int flags);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Dispatch the event to the RootWindow.
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Dispatch(ui::Event* event);
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_current_root_window(RootWindow* root_window) {
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_root_window_ = root_window;
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dispatch a key event to the RootWindow.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DispatchKeyEvent(bool is_press, ui::KeyboardCode key_code, int flags);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateCurrentRootWindow(const gfx::Point& point);
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PressButton(int flag);
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ReleaseButton(int flag);
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Convert a point between API's coordinates and
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |target|'s coordinates.
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ConvertPointFromTarget(const aura::Window* target,
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              gfx::Point* point) const;
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ConvertPointToTarget(const aura::Window* target,
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            gfx::Point* point) const;
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point GetLocationInCurrentRoot() const;
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point CenterOfWindow(const Window* window) const;
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DispatchNextPendingEvent();
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoDispatchEvent(ui::Event* event, bool async);
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<EventGeneratorDelegate> delegate_;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point current_location_;
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RootWindow* current_root_window_;
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int flags_;
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool grab_;
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::list<ui::Event*> pending_events_;
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set to true to cause events to be posted asynchronously.
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool async_;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(EventGenerator);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace test
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace aura
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_AURA_TEST_EVENT_GENERATOR_H_
321