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