1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/test/event_generator.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/bind.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/location.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_ptr.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/single_thread_task_runner.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/thread_task_runner_handle.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/time/default_tick_clock.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/event.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/event_source.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/event_utils.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/test/events_test_utils.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/vector2d_conversions.h" 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(USE_X11) 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <X11/Xlib.h> 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/test/events_test_utils_x11.h" 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN) 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/keycodes/keyboard_code_conversion.h" 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace ui { 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace test { 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace { 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DummyCallback(EventType, const gfx::Vector2dF&) { 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass TestKeyEvent : public ui::KeyEvent { 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestKeyEvent(const base::NativeEvent& native_event, int flags) 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : KeyEvent(native_event) { 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch set_flags(flags); 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass TestTouchEvent : public ui::TouchEvent { 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestTouchEvent(ui::EventType type, 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Point& root_location, 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int touch_id, 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int flags, 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta timestamp) 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : TouchEvent(type, root_location, flags, touch_id, timestamp, 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1.0f, 1.0f, 0.0f, 0.0f) { 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(TestTouchEvent); 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int kAllButtonMask = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_RIGHT_MOUSE_BUTTON; 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)EventGeneratorDelegate* EventGenerator::default_delegate = NULL; 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 64116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEventGenerator::EventGenerator(gfx::NativeWindow root_window) 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) : current_target_(NULL), 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch flags_(0), 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch grab_(false), 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch async_(false), 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tick_clock_(new base::DefaultTickClock()) { 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Init(root_window, NULL); 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 73116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEventGenerator::EventGenerator(gfx::NativeWindow root_window, 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Point& point) 756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) : current_location_(point), 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) current_target_(NULL), 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch flags_(0), 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch grab_(false), 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch async_(false), 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tick_clock_(new base::DefaultTickClock()) { 816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Init(root_window, NULL); 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 84116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEventGenerator::EventGenerator(gfx::NativeWindow root_window, 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::NativeWindow window) 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) : current_target_(NULL), 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch flags_(0), 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch grab_(false), 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch async_(false), 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tick_clock_(new base::DefaultTickClock()) { 916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Init(root_window, window); 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 94116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEventGenerator::EventGenerator(EventGeneratorDelegate* delegate) 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : delegate_(delegate), 966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) current_target_(NULL), 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch flags_(0), 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch grab_(false), 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch async_(false), 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tick_clock_(new base::DefaultTickClock()) { 1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Init(NULL, NULL); 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 104116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEventGenerator::~EventGenerator() { 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (std::list<ui::Event*>::iterator i = pending_events_.begin(); 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch i != pending_events_.end(); ++i) 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delete *i; 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_events_.clear(); 1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) delegate()->SetContext(NULL, NULL, NULL); 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::PressLeftButton() { 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PressButton(ui::EF_LEFT_MOUSE_BUTTON); 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::ReleaseLeftButton() { 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReleaseButton(ui::EF_LEFT_MOUSE_BUTTON); 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::ClickLeftButton() { 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PressLeftButton(); 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReleaseLeftButton(); 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::DoubleClickLeftButton() { 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch flags_ |= ui::EF_IS_DOUBLE_CLICK; 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PressLeftButton(); 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch flags_ ^= ui::EF_IS_DOUBLE_CLICK; 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReleaseLeftButton(); 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::PressRightButton() { 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PressButton(ui::EF_RIGHT_MOUSE_BUTTON); 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::ReleaseRightButton() { 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReleaseButton(ui::EF_RIGHT_MOUSE_BUTTON); 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::MoveMouseWheel(int delta_x, int delta_y) { 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Point location = GetLocationInCurrentRoot(); 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::MouseEvent mouseev(ui::ET_MOUSEWHEEL, location, location, flags_, 0); 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::MouseWheelEvent wheelev(mouseev, delta_x, delta_y); 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&wheelev); 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::SendMouseExit() { 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Point exit_location(current_location_); 1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) delegate()->ConvertPointToTarget(current_target_, &exit_location); 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::MouseEvent mouseev(ui::ET_MOUSE_EXITED, exit_location, exit_location, 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch flags_, 0); 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&mouseev); 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::MoveMouseToInHost(const gfx::Point& point_in_host) { 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ui::EventType event_type = (flags_ & ui::EF_LEFT_MOUSE_BUTTON) ? 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::ET_MOUSE_DRAGGED : ui::ET_MOUSE_MOVED; 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::MouseEvent mouseev(event_type, point_in_host, point_in_host, flags_, 0); 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&mouseev); 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch current_location_ = point_in_host; 1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) delegate()->ConvertPointFromHost(current_target_, ¤t_location_); 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::MoveMouseTo(const gfx::Point& point_in_screen, 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int count) { 167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK_GT(count, 0); 168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ui::EventType event_type = (flags_ & ui::EF_LEFT_MOUSE_BUTTON) ? 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::ET_MOUSE_DRAGGED : ui::ET_MOUSE_MOVED; 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Vector2dF diff(point_in_screen - current_location_); 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (float i = 1; i <= count; i++) { 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Vector2dF step(diff); 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch step.Scale(i / count); 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Point move_point = current_location_ + gfx::ToRoundedVector2d(step); 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!grab_) 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UpdateCurrentDispatcher(move_point); 1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) delegate()->ConvertPointToTarget(current_target_, &move_point); 179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::MouseEvent mouseev(event_type, move_point, move_point, flags_, 0); 180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&mouseev); 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch current_location_ = point_in_screen; 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::MoveMouseRelativeTo(const EventTarget* window, 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Point& point_in_parent) { 187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Point point(point_in_parent); 1886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) delegate()->ConvertPointFromTarget(window, &point); 189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MoveMouseTo(point); 190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 192116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::DragMouseTo(const gfx::Point& point) { 193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PressLeftButton(); 194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MoveMouseTo(point); 195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReleaseLeftButton(); 196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::MoveMouseToCenterOf(EventTarget* window) { 199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MoveMouseTo(CenterOfWindow(window)); 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::PressTouch() { 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PressTouchId(0); 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 206116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::PressTouchId(int touch_id) { 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestTouchEvent touchev( 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::ET_TOUCH_PRESSED, GetLocationInCurrentRoot(), touch_id, flags_, 209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Now()); 210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&touchev); 211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 213116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::MoveTouch(const gfx::Point& point) { 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MoveTouchId(point, 0); 215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::MoveTouchId(const gfx::Point& point, int touch_id) { 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch current_location_ = point; 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestTouchEvent touchev( 220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::ET_TOUCH_MOVED, GetLocationInCurrentRoot(), touch_id, flags_, 221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Now()); 222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&touchev); 223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!grab_) 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UpdateCurrentDispatcher(point); 226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::ReleaseTouch() { 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReleaseTouchId(0); 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::ReleaseTouchId(int touch_id) { 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestTouchEvent touchev( 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::ET_TOUCH_RELEASED, GetLocationInCurrentRoot(), touch_id, flags_, 235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Now()); 236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&touchev); 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::PressMoveAndReleaseTouchTo(const gfx::Point& point) { 240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PressTouch(); 241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MoveTouch(point); 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReleaseTouch(); 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::PressMoveAndReleaseTouchToCenterOf(EventTarget* window) { 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PressMoveAndReleaseTouchTo(CenterOfWindow(window)); 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::GestureEdgeSwipe() { 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::GestureEvent gesture( 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, 0, 0, Now(), ui::GestureEventDetails(ui::ET_GESTURE_WIN8_EDGE_SWIPE)); 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&gesture); 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 255116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::GestureTapAt(const gfx::Point& location) { 256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const int kTouchId = 2; 257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::TouchEvent press(ui::ET_TOUCH_PRESSED, 258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch location, 259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kTouchId, 260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Now()); 261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&press); 262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::TouchEvent release( 264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::ET_TOUCH_RELEASED, location, kTouchId, 265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch press.time_stamp() + base::TimeDelta::FromMilliseconds(50)); 266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&release); 267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 269116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::GestureTapDownAndUp(const gfx::Point& location) { 270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const int kTouchId = 3; 271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::TouchEvent press(ui::ET_TOUCH_PRESSED, 272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch location, 273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kTouchId, 274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Now()); 275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&press); 276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::TouchEvent release( 278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::ET_TOUCH_RELEASED, location, kTouchId, 279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch press.time_stamp() + base::TimeDelta::FromMilliseconds(1000)); 280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&release); 281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 283116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::GestureScrollSequence(const gfx::Point& start, 284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Point& end, 285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::TimeDelta& step_delay, 286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int steps) { 287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GestureScrollSequenceWithCallback(start, end, step_delay, steps, 288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&DummyCallback)); 289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 291116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::GestureScrollSequenceWithCallback( 292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Point& start, 293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Point& end, 294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::TimeDelta& step_delay, 295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int steps, 296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ScrollStepCallback& callback) { 297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const int kTouchId = 5; 298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta timestamp = Now(); 299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::TouchEvent press(ui::ET_TOUCH_PRESSED, start, kTouchId, timestamp); 300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&press); 301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback.Run(ui::ET_GESTURE_SCROLL_BEGIN, gfx::Vector2dF()); 303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int dx = (end.x() - start.x()) / steps; 305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int dy = (end.y() - start.y()) / steps; 306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Point location = start; 307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (int i = 0; i < steps; ++i) { 308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch location.Offset(dx, dy); 309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch timestamp += step_delay; 310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::TouchEvent move(ui::ET_TOUCH_MOVED, location, kTouchId, timestamp); 311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&move); 312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback.Run(ui::ET_GESTURE_SCROLL_UPDATE, gfx::Vector2dF(dx, dy)); 313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::TouchEvent release(ui::ET_TOUCH_RELEASED, end, kTouchId, timestamp); 316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&release); 317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback.Run(ui::ET_GESTURE_SCROLL_END, gfx::Vector2dF()); 319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 321116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::GestureMultiFingerScroll(int count, 322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Point start[], 323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int event_separation_time_ms, 324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int steps, 325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int move_x, 326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int move_y) { 327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const int kMaxTouchPoints = 10; 328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int delays[kMaxTouchPoints] = { 0 }; 329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GestureMultiFingerScrollWithDelays( 330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch count, start, delays, event_separation_time_ms, steps, move_x, move_y); 331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 333116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::GestureMultiFingerScrollWithDelays( 334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int count, 335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Point start[], 336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const int delay_adding_finger_ms[], 337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int event_separation_time_ms, 338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int steps, 339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int move_x, 340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int move_y) { 341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const int kMaxTouchPoints = 10; 342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Point points[kMaxTouchPoints]; 343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CHECK_LE(count, kMaxTouchPoints); 344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CHECK_GT(steps, 0); 345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int delta_x = move_x / steps; 347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int delta_y = move_y / steps; 348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (int i = 0; i < count; ++i) { 350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch points[i] = start[i]; 351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta press_time_first = Now(); 354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta press_time[kMaxTouchPoints]; 355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool pressed[kMaxTouchPoints]; 356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (int i = 0; i < count; ++i) { 357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pressed[i] = false; 358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch press_time[i] = press_time_first + 359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta::FromMilliseconds(delay_adding_finger_ms[i]); 360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int last_id = 0; 363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (int step = 0; step < steps; ++step) { 364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta move_time = press_time_first + 365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta::FromMilliseconds(event_separation_time_ms * step); 366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch while (last_id < count && 368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch !pressed[last_id] && 369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch move_time >= press_time[last_id]) { 370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::TouchEvent press(ui::ET_TOUCH_PRESSED, 371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch points[last_id], 372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch last_id, 373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch press_time[last_id]); 374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&press); 375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pressed[last_id] = true; 376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch last_id++; 377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (int i = 0; i < count; ++i) { 380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch points[i].Offset(delta_x, delta_y); 381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (i >= last_id) 382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch continue; 383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::TouchEvent move(ui::ET_TOUCH_MOVED, points[i], i, move_time); 384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&move); 385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta release_time = press_time_first + 389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta::FromMilliseconds(event_separation_time_ms * steps); 390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (int i = 0; i < last_id; ++i) { 391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::TouchEvent release( 392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::ET_TOUCH_RELEASED, points[i], i, release_time); 393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&release); 394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 397116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::ScrollSequence(const gfx::Point& start, 398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::TimeDelta& step_delay, 399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch float x_offset, 400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch float y_offset, 401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int steps, 402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int num_fingers) { 403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta timestamp = Now(); 404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::ScrollEvent fling_cancel(ui::ET_SCROLL_FLING_CANCEL, 405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch start, 406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch timestamp, 407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, 408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, 0, 409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, 0, 410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch num_fingers); 411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&fling_cancel); 412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch float dx = x_offset / steps; 414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch float dy = y_offset / steps; 415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (int i = 0; i < steps; ++i) { 416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch timestamp += step_delay; 417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::ScrollEvent move(ui::ET_SCROLL, 418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch start, 419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch timestamp, 420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, 421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dx, dy, 422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dx, dy, 423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch num_fingers); 424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&move); 425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::ScrollEvent fling_start(ui::ET_SCROLL_FLING_START, 428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch start, 429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch timestamp, 430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, 431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch x_offset, y_offset, 432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch x_offset, y_offset, 433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch num_fingers); 434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&fling_start); 435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 437116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::ScrollSequence(const gfx::Point& start, 438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::TimeDelta& step_delay, 439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::vector<gfx::Point>& offsets, 440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int num_fingers) { 441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch size_t steps = offsets.size(); 442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta timestamp = Now(); 443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::ScrollEvent fling_cancel(ui::ET_SCROLL_FLING_CANCEL, 444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch start, 445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch timestamp, 446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, 447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, 0, 448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, 0, 449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch num_fingers); 450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&fling_cancel); 451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (size_t i = 0; i < steps; ++i) { 453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch timestamp += step_delay; 454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::ScrollEvent scroll(ui::ET_SCROLL, 455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch start, 456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch timestamp, 457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, 458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch offsets[i].x(), offsets[i].y(), 459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch offsets[i].x(), offsets[i].y(), 460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch num_fingers); 461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&scroll); 462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::ScrollEvent fling_start(ui::ET_SCROLL_FLING_START, 465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch start, 466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch timestamp, 467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, 468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch offsets[steps - 1].x(), offsets[steps - 1].y(), 469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch offsets[steps - 1].x(), offsets[steps - 1].y(), 470116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch num_fingers); 471116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&fling_start); 472116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 474116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::PressKey(ui::KeyboardCode key_code, int flags) { 475116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DispatchKeyEvent(true, key_code, flags); 476116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 477116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 478116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::ReleaseKey(ui::KeyboardCode key_code, int flags) { 479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DispatchKeyEvent(false, key_code, flags); 480116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 481116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 482116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::Dispatch(ui::Event* event) { 483116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DoDispatchEvent(event, async_); 484116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 485116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 486116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::SetTickClock(scoped_ptr<base::TickClock> tick_clock) { 487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tick_clock_ = tick_clock.Pass(); 488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 490116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::TimeDelta EventGenerator::Now() { 491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // This is the same as what EventTimeForNow() does, but here we do it 492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // with a tick clock that can be replaced with a simulated clock for tests. 493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return base::TimeDelta::FromInternalValue( 494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tick_clock_->NowTicks().ToInternalValue()); 495116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 496116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 4976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void EventGenerator::Init(gfx::NativeWindow root_window, 4986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::NativeWindow window_context) { 4996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) delegate()->SetContext(this, root_window, window_context); 5006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (window_context) 5016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) current_location_ = delegate()->CenterOfWindow(window_context); 5026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) current_target_ = delegate()->GetTargetAt(current_location_); 5036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 5046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 505116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::DispatchKeyEvent(bool is_press, 506116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::KeyboardCode key_code, 507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int flags) { 508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN) 509116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UINT key_press = WM_KEYDOWN; 510116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint16 character = ui::GetCharacterFromKeyCode(key_code, flags); 511116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (is_press && character) { 512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MSG native_event = { NULL, WM_KEYDOWN, key_code, 0 }; 5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestKeyEvent keyev(native_event, flags); 514116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&keyev); 515116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // On Windows, WM_KEYDOWN event is followed by WM_CHAR with a character 516116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // if the key event cooresponds to a real character. 517116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch key_press = WM_CHAR; 518116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch key_code = static_cast<ui::KeyboardCode>(character); 519116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 520116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MSG native_event = 521116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { NULL, (is_press ? key_press : WM_KEYUP), key_code, 0 }; 5225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestKeyEvent keyev(native_event, flags); 523116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#elif defined(USE_X11) 524116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::ScopedXI2Event xevent; 525116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch xevent.InitKeyEvent(is_press ? ui::ET_KEY_PRESSED : ui::ET_KEY_RELEASED, 526116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch key_code, 527116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch flags); 5285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::KeyEvent keyev(xevent); 529116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else 530116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::EventType type = is_press ? ui::ET_KEY_PRESSED : ui::ET_KEY_RELEASED; 5315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::KeyEvent keyev(type, key_code, flags); 532116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif // OS_WIN 533116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&keyev); 534116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 535116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 536116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::UpdateCurrentDispatcher(const gfx::Point& point) { 5376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) current_target_ = delegate()->GetTargetAt(point); 538116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 539116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 540116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::PressButton(int flag) { 541116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!(flags_ & flag)) { 542116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch flags_ |= flag; 543116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch grab_ = (flags_ & kAllButtonMask) != 0; 544116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Point location = GetLocationInCurrentRoot(); 545116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::MouseEvent mouseev(ui::ET_MOUSE_PRESSED, location, location, flags_, 546116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch flag); 547116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&mouseev); 548116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 549116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 550116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 551116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::ReleaseButton(int flag) { 552116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (flags_ & flag) { 553116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Point location = GetLocationInCurrentRoot(); 554116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::MouseEvent mouseev(ui::ET_MOUSE_RELEASED, location, 555116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch location, flags_, flag); 556116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Dispatch(&mouseev); 557116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch flags_ ^= flag; 558116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 559116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch grab_ = (flags_ & kAllButtonMask) != 0; 560116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 561116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 562116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::Point EventGenerator::GetLocationInCurrentRoot() const { 563116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Point p(current_location_); 5646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) delegate()->ConvertPointToTarget(current_target_, &p); 565116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return p; 566116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 567116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 568116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::Point EventGenerator::CenterOfWindow(const EventTarget* window) const { 5696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return delegate()->CenterOfTarget(window); 570116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 571116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 572116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::DoDispatchEvent(ui::Event* event, bool async) { 573116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (async) { 574116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::Event* pending_event; 575116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (event->IsKeyEvent()) { 576116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_event = new ui::KeyEvent(*static_cast<ui::KeyEvent*>(event)); 577116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else if (event->IsMouseEvent()) { 578116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_event = new ui::MouseEvent(*static_cast<ui::MouseEvent*>(event)); 579116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else if (event->IsTouchEvent()) { 580116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_event = new ui::TouchEvent(*static_cast<ui::TouchEvent*>(event)); 581116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else if (event->IsScrollEvent()) { 582116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_event = 583116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new ui::ScrollEvent(*static_cast<ui::ScrollEvent*>(event)); 584116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 585116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NOTREACHED() << "Invalid event type"; 586116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 587116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 588116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (pending_events_.empty()) { 5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::ThreadTaskRunnerHandle::Get()->PostTask( 590116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FROM_HERE, 591116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&EventGenerator::DispatchNextPendingEvent, 592116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(this))); 593116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 594116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_events_.push_back(pending_event); 595116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 5966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::EventSource* event_source = delegate()->GetEventSource(current_target_); 597116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::EventSourceTestApi event_source_test(event_source); 598116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::EventDispatchDetails details = 599116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch event_source_test.SendEventToProcessor(event); 600116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CHECK(!details.dispatcher_destroyed); 601116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 602116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 603116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 604116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGenerator::DispatchNextPendingEvent() { 605116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(!pending_events_.empty()); 606116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::Event* event = pending_events_.front(); 607116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DoDispatchEvent(event, false); 608116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_events_.pop_front(); 609116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delete event; 610116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!pending_events_.empty()) { 6111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::ThreadTaskRunnerHandle::Get()->PostTask( 612116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FROM_HERE, 613116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&EventGenerator::DispatchNextPendingEvent, 614116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(this))); 615116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 616116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 617116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 6186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const EventGeneratorDelegate* EventGenerator::delegate() const { 6196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (delegate_) 6206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return delegate_.get(); 6216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 6226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(default_delegate); 6236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return default_delegate; 6246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 6256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 6266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)EventGeneratorDelegate* EventGenerator::delegate() { 6276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return const_cast<EventGeneratorDelegate*>( 6286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const_cast<const EventGenerator*>(this)->delegate()); 6296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 6306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 631116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace test 632116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace ui 633