1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// found in the LICENSE file. 4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <vector> 6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/basictypes.h" 8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/memory/scoped_ptr.h" 9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/message_loop/message_loop.h" 10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/time/time.h" 11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/browser/renderer_host/input/touch_emulator.h" 12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/browser/renderer_host/input/touch_emulator_client.h" 13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/common/input/web_input_event_traits.h" 14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/events/gesture_detection/gesture_config_helper.h" 16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA) 18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/aura/env.h" 19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/aura/test/test_screen.h" 20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebGestureEvent; 23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebInputEvent; 24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebKeyboardEvent; 25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebMouseEvent; 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using blink::WebMouseWheelEvent; 27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebTouchEvent; 28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebTouchPoint; 29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace content { 31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass TouchEmulatorTest : public testing::Test, 33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public TouchEmulatorClient { 34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public: 35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch TouchEmulatorTest() 36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : shift_pressed_(false), 37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch mouse_pressed_(false), 3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ack_touches_synchronously_(true), 39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch last_mouse_x_(-1), 40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch last_mouse_y_(-1) { 41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch last_event_time_seconds_ = 42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); 43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch event_time_delta_seconds_ = 0.1; 44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual ~TouchEmulatorTest() {} 47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // testing::Test 49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void SetUp() OVERRIDE { 50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA) 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) aura::Env::CreateInstance(true); 526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) screen_.reset(aura::TestScreen::Create(gfx::Size())); 53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, screen_.get()); 54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch emulator_.reset(new TouchEmulator(this)); 5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) emulator_->Enable(); 58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void TearDown() OVERRIDE { 61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch emulator_->Disable(); 62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("", ExpectedEvents()); 63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA) 65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch aura::Env::DeleteInstance(); 66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch screen_.reset(); 67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void ForwardGestureEvent( 71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const blink::WebGestureEvent& event) OVERRIDE { 72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch forwarded_events_.push_back(event.type); 73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void ForwardEmulatedTouchEvent( 76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const blink::WebTouchEvent& event) OVERRIDE { 77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch forwarded_events_.push_back(event.type); 78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(1U, event.touchesLength); 79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(last_mouse_x_, event.touches[0].position.x); 80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(last_mouse_y_, event.touches[0].position.y); 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int expectedCancelable = event.type != WebInputEvent::TouchCancel; 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(expectedCancelable, event.cancelable); 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (ack_touches_synchronously_) { 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) emulator()->HandleTouchEventAck( 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) event, INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void SetCursor(const WebCursor& cursor) OVERRIDE {} 90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void ShowContextMenuAtPoint(const gfx::Point& point) OVERRIDE {} 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch protected: 94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch TouchEmulator* emulator() const { 95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return emulator_.get(); 96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int modifiers() const { 99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return shift_pressed_ ? WebInputEvent::ShiftKey : 0; 100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch std::string ExpectedEvents() { 103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch std::string result; 104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (size_t i = 0; i < forwarded_events_.size(); ++i) { 105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (i != 0) 106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch result += " "; 107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch result += WebInputEventTraits::GetName(forwarded_events_[i]); 108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 109a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch forwarded_events_.clear(); 110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return result; 111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch double GetNextEventTimeSeconds() { 114a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch last_event_time_seconds_ += event_time_delta_seconds_; 115a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return last_event_time_seconds_; 116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void set_event_time_delta_seconds_(double delta) { 119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch event_time_delta_seconds_ = delta; 120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void SendKeyboardEvent(WebInputEvent::Type type) { 123a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch WebKeyboardEvent event; 124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch event.timeStampSeconds = GetNextEventTimeSeconds(); 125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch event.type = type; 126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch event.modifiers = modifiers(); 127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch emulator()->HandleKeyboardEvent(event); 128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 130a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void PressShift() { 131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DCHECK(!shift_pressed_); 132a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch shift_pressed_ = true; 133a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SendKeyboardEvent(WebInputEvent::KeyDown); 134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 135a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void ReleaseShift() { 137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DCHECK(shift_pressed_); 138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch shift_pressed_ = false; 139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SendKeyboardEvent(WebInputEvent::KeyUp); 140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 142a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void SendMouseEvent(WebInputEvent::Type type, int x, int y) { 143a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch WebMouseEvent event; 144a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch event.timeStampSeconds = GetNextEventTimeSeconds(); 145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch event.type = type; 146a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch event.button = mouse_pressed_ ? WebMouseEvent::ButtonLeft : 147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch WebMouseEvent::ButtonNone; 148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch event.modifiers = modifiers(); 149a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch last_mouse_x_ = x; 150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch last_mouse_y_ = y; 151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch event.x = event.windowX = event.globalX = x; 152a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch event.y = event.windowY = event.globalY = y; 153a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch emulator()->HandleMouseEvent(event); 154a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 155a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool SendMouseWheelEvent() { 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WebMouseWheelEvent event; 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event.type = WebInputEvent::MouseWheel; 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event.timeStampSeconds = GetNextEventTimeSeconds(); 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Return whether mouse wheel is forwarded. 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return !emulator()->HandleMouseWheelEvent(event); 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 164a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void MouseDown(int x, int y) { 165a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DCHECK(!mouse_pressed_); 166a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (x != last_mouse_x_ || y != last_mouse_y_) 167a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SendMouseEvent(WebInputEvent::MouseMove, x, y); 168a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch mouse_pressed_ = true; 169a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SendMouseEvent(WebInputEvent::MouseDown, x, y); 170a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 171a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 172a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void MouseDrag(int x, int y) { 173a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DCHECK(mouse_pressed_); 174a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SendMouseEvent(WebInputEvent::MouseMove, x, y); 175a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 176a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void MouseMove(int x, int y) { 178a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DCHECK(!mouse_pressed_); 179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SendMouseEvent(WebInputEvent::MouseMove, x, y); 180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 181a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 182a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void MouseUp(int x, int y) { 183a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DCHECK(mouse_pressed_); 184a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (x != last_mouse_x_ || y != last_mouse_y_) 185a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SendMouseEvent(WebInputEvent::MouseMove, x, y); 186a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SendMouseEvent(WebInputEvent::MouseUp, x, y); 187a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch mouse_pressed_ = false; 188a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 189a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool TouchStart(int x, int y, bool ack) { 1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return SendTouchEvent( 1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebInputEvent::TouchStart, WebTouchPoint::StatePressed, x, y, ack); 1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool TouchMove(int x, int y, bool ack) { 1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return SendTouchEvent( 1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebInputEvent::TouchMove, WebTouchPoint::StateMoved, x, y, ack); 1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool TouchEnd(int x, int y, bool ack) { 2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return SendTouchEvent( 2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebInputEvent::TouchEnd, WebTouchPoint::StateReleased, x, y, ack); 2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebTouchEvent MakeTouchEvent(WebInputEvent::Type type, 2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebTouchPoint::State state, int x, int y) { 2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebTouchEvent event; 2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) event.type = type; 2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) event.timeStampSeconds = GetNextEventTimeSeconds(); 2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) event.touchesLength = 1; 2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) event.touches[0].id = 0; 2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) event.touches[0].state = state; 2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) event.touches[0].position.x = x; 2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) event.touches[0].position.y = y; 2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) event.touches[0].screenPosition.x = x; 2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) event.touches[0].screenPosition.y = y; 2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return event; 2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool SendTouchEvent(WebInputEvent::Type type, WebTouchPoint::State state, 2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int x, int y, bool ack) { 2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebTouchEvent event = MakeTouchEvent(type, state, x, y); 2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (emulator()->HandleTouchEvent(event)) { 2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Touch event is not forwarded. 2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return false; 2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (ack) { 2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Can't send ack if there are some pending acks. 2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(!touch_events_to_ack_.size()); 2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Touch event is forwarded, ack should not be handled by emulator. 2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(emulator()->HandleTouchEventAck( 2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) event, INPUT_EVENT_ACK_STATE_CONSUMED)); 2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else { 2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) touch_events_to_ack_.push_back(event); 2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return true; 2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void AckOldestTouchEvent() { 2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(touch_events_to_ack_.size()); 2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebTouchEvent event = touch_events_to_ack_[0]; 2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) touch_events_to_ack_.erase(touch_events_to_ack_.begin()); 2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Emulator should not handle ack from native stream. 2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(emulator()->HandleTouchEventAck( 2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) event, INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS)); 2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 25003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void DisableSynchronousTouchAck() { ack_touches_synchronously_ = false; } 25103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 252a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private: 253a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch scoped_ptr<TouchEmulator> emulator_; 254a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch std::vector<WebInputEvent::Type> forwarded_events_; 255a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA) 256a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch scoped_ptr<gfx::Screen> screen_; 257a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 258a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch double last_event_time_seconds_; 259a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch double event_time_delta_seconds_; 260a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool shift_pressed_; 261a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool mouse_pressed_; 26203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool ack_touches_synchronously_; 263a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int last_mouse_x_; 264a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int last_mouse_y_; 2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::vector<WebTouchEvent> touch_events_to_ack_; 266a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::MessageLoopForUI message_loop_; 267a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}; 268a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 269a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 270a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(TouchEmulatorTest, NoTouches) { 271a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseMove(100, 200); 272a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseMove(300, 300); 273a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("", ExpectedEvents()); 274a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 275a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 276a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(TouchEmulatorTest, Touch) { 277a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseMove(100, 200); 278a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("", ExpectedEvents()); 279a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDown(100, 200); 280a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents()); 281a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseUp(200, 200); 282a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ( 283a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate" 284a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch " TouchEnd GestureScrollEnd", 285a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectedEvents()); 286a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 287a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 288a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(TouchEmulatorTest, MultipleTouches) { 289a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseMove(100, 200); 290a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("", ExpectedEvents()); 291a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDown(100, 200); 292a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents()); 293a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseUp(200, 200); 294a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ( 295a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate" 296a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch " TouchEnd GestureScrollEnd", 297a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectedEvents()); 298a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseMove(300, 200); 299a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseMove(200, 200); 300a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("", ExpectedEvents()); 301a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDown(300, 200); 302a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents()); 303a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDrag(300, 300); 304a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ( 305a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate", 306a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectedEvents()); 307a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDrag(300, 400); 308a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("TouchMove GestureScrollUpdate", ExpectedEvents()); 309a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseUp(300, 500); 310a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ( 311a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "TouchMove GestureScrollUpdate TouchEnd GestureScrollEnd", 312a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectedEvents()); 313a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 314a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 315a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(TouchEmulatorTest, Pinch) { 316a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDown(100, 200); 317a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents()); 318a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDrag(200, 200); 319a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ( 320a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate", 321a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectedEvents()); 322a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch PressShift(); 323a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("", ExpectedEvents()); 324a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDrag(300, 200); 325a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("TouchMove GesturePinchBegin", ExpectedEvents()); 326a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ReleaseShift(); 327a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("", ExpectedEvents()); 328a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDrag(400, 200); 329a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ( 330a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "TouchMove GesturePinchEnd GestureScrollUpdate", 331a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectedEvents()); 332a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseUp(400, 200); 333a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("TouchEnd GestureScrollEnd", ExpectedEvents()); 334a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 335a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 33603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(TouchEmulatorTest, CancelWithDelayedAck) { 33703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DisableSynchronousTouchAck(); 33803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 33903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Simulate a sequence that is interrupted by |CancelTouch()|. 34003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MouseDown(100, 200); 34103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("TouchStart", ExpectedEvents()); 34203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MouseDrag(200, 200); 34303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("TouchMove", ExpectedEvents()); 34403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) emulator()->CancelTouch(); 34503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("TouchCancel", ExpectedEvents()); 34603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // The mouse up should have no effect as the sequence was already cancelled. 34703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MouseUp(400, 200); 34803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("", ExpectedEvents()); 34903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 35003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Simulate a sequence that fully completes before |CancelTouch()|. 35103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MouseDown(100, 200); 35203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("TouchStart", ExpectedEvents()); 35303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MouseUp(100, 200); 35403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("TouchEnd", ExpectedEvents()); 35503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // |CancelTouch| should have no effect as the sequence was already terminated. 35603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) emulator()->CancelTouch(); 35703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("", ExpectedEvents()); 35803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 35903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 360a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(TouchEmulatorTest, DisableAndReenable) { 361a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDown(100, 200); 362a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents()); 363a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDrag(200, 200); 364a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ( 365a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate", 366a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectedEvents()); 367a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch PressShift(); 368a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDrag(300, 200); 369a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("TouchMove GesturePinchBegin", ExpectedEvents()); 370a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 371a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Disable while pinch is in progress. 372a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch emulator()->Disable(); 373a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("TouchCancel GesturePinchEnd GestureScrollEnd", ExpectedEvents()); 374a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseUp(300, 200); 375a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ReleaseShift(); 376a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseMove(300, 300); 377a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("", ExpectedEvents()); 378a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 37903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) emulator()->Enable(); 380a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDown(300, 300); 381a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents()); 382a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDrag(300, 400); 383a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ( 384a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate", 385a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectedEvents()); 386a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 387a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Disable while scroll is in progress. 388a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch emulator()->Disable(); 389a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("TouchCancel GestureScrollEnd", ExpectedEvents()); 390a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 391a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 392a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(TouchEmulatorTest, MouseMovesDropped) { 393a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseMove(100, 200); 394a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("", ExpectedEvents()); 395a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDown(100, 200); 396a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents()); 397a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 398a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Mouse move after mouse down is never dropped. 399a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch set_event_time_delta_seconds_(0.001); 400a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDrag(200, 200); 401a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ( 402a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate", 403a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectedEvents()); 404a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 405a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // The following mouse moves are dropped. 406a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDrag(300, 200); 407a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("", ExpectedEvents()); 408a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDrag(350, 200); 409a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ("", ExpectedEvents()); 410a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 411a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Dispatching again. 412a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch set_event_time_delta_seconds_(0.1); 413a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseDrag(400, 200); 414a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ( 415a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "TouchMove GestureScrollUpdate", 416a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectedEvents()); 417a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MouseUp(400, 200); 418a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ( 419a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "TouchEnd GestureScrollEnd", 420a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectedEvents()); 421a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 422a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(TouchEmulatorTest, MouseWheel) { 424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MouseMove(100, 200); 425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ("", ExpectedEvents()); 426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(SendMouseWheelEvent()); 427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MouseDown(100, 200); 428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents()); 429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(SendMouseWheelEvent()); 430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MouseUp(100, 200); 431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ("TouchEnd GestureShowPress GestureTap", ExpectedEvents()); 432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(SendMouseWheelEvent()); 433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MouseDown(300, 200); 434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents()); 435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(SendMouseWheelEvent()); 436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) emulator()->Disable(); 437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ("TouchCancel GestureTapCancel", ExpectedEvents()); 438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(SendMouseWheelEvent()); 43903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) emulator()->Enable(); 440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(SendMouseWheelEvent()); 441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(TouchEmulatorTest, MultipleTouchStreams) { 4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Native stream should be blocked while emulated is active. 4455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MouseMove(100, 200); 4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("", ExpectedEvents()); 4475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MouseDown(100, 200); 4485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents()); 4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(TouchStart(10, 10, true)); 4505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(TouchMove(20, 20, true)); 4515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MouseUp(200, 200); 4525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ( 4535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate" 4545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) " TouchEnd GestureScrollEnd", 4555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExpectedEvents()); 4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(TouchEnd(20, 20, true)); 4575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Emulated stream should be blocked while native is active. 4595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(TouchStart(10, 10, true)); 4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(TouchMove(20, 20, true)); 4615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MouseDown(300, 200); 4625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("", ExpectedEvents()); 4635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Re-enabling in the middle of a touch sequence should not affect this. 4645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) emulator()->Disable(); 46503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) emulator()->Enable(); 4665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MouseDrag(300, 300); 4675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("", ExpectedEvents()); 4685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MouseUp(300, 300); 4695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("", ExpectedEvents()); 4705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(TouchEnd(20, 20, true)); 4715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("", ExpectedEvents()); 4725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Late ack for TouchEnd should not mess things up. 4745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(TouchStart(10, 10, false)); 4755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(TouchMove(20, 20, false)); 4765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) emulator()->Disable(); 4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(TouchEnd(20, 20, false)); 4785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(TouchStart(30, 30, false)); 4795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AckOldestTouchEvent(); // TouchStart. 48003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) emulator()->Enable(); 4815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AckOldestTouchEvent(); // TouchMove. 4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AckOldestTouchEvent(); // TouchEnd. 4835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MouseDown(300, 200); 4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("", ExpectedEvents()); 4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MouseDrag(300, 300); 4865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("", ExpectedEvents()); 4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MouseUp(300, 300); 4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("", ExpectedEvents()); 4895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AckOldestTouchEvent(); // TouchStart. 4905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MouseDown(300, 200); 4915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("", ExpectedEvents()); 4925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(TouchMove(30, 40, true)); 4935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(TouchEnd(30, 40, true)); 4945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MouseUp(300, 200); 4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("", ExpectedEvents()); 4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Emulation should be back to normal. 4985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MouseDown(100, 200); 4995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents()); 5005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MouseUp(200, 200); 5015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ( 5025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate" 5035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) " TouchEnd GestureScrollEnd", 5045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExpectedEvents()); 5055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 5065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(TouchEmulatorTest, MultipleTouchStreamsLateEnable) { 5085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Enabling in the middle of native touch sequence should be handled. 5095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Send artificial late TouchEnd ack, like it is the first thing emulator 5105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // does see. 5115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebTouchEvent event = MakeTouchEvent( 5125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebInputEvent::TouchEnd, WebTouchPoint::StateReleased, 10, 10); 5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(emulator()->HandleTouchEventAck( 5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) event, INPUT_EVENT_ACK_STATE_CONSUMED)); 5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MouseDown(100, 200); 5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents()); 5185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MouseUp(200, 200); 5195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ( 5205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate" 5215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) " TouchEnd GestureScrollEnd", 5225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExpectedEvents()); 5235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 5245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 525a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} // namespace content 526