input_router_impl_unittest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// found in the LICENSE file. 4558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 5558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/basictypes.h" 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/command_line.h" 7558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/memory/scoped_ptr.h" 8558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/strings/utf_string_conversions.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/renderer_host/input/gesture_event_queue.h" 10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/renderer_host/input/input_router_client.h" 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/renderer_host/input/input_router_impl.h" 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/renderer_host/input/mock_input_ack_handler.h" 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/browser/renderer_host/input/mock_input_router_client.h" 14558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/content_constants_internal.h" 15558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/edit_command.h" 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/common/input/synthetic_web_input_event_builders.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/input/touch_action.h" 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/common/input/web_input_event_traits.h" 19558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/input_messages.h" 20558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/view_messages.h" 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/common/content_switches.h" 22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/test/mock_render_process_host.h" 23558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/test/test_browser_context.h" 24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h" 26558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 27558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) || defined(USE_AURA) 28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/renderer_host/ui_events_helper.h" 29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 31558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochusing base::TimeDelta; 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebGestureEvent; 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using blink::WebKeyboardEvent; 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent; 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseEvent; 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseWheelEvent; 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchEvent; 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchPoint; 40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace content { 42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace { 44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochconst WebInputEvent* GetInputEventFromMessage(const IPC::Message& message) { 46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PickleIterator iter(message); 47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const char* data; 48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int data_length; 49558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!message.ReadData(&iter, &data, &data_length)) 50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return NULL; 51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return reinterpret_cast<const WebInputEvent*>(data); 52558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 54558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool GetIsShortcutFromHandleInputEventMessage(const IPC::Message* msg) { 55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputMsg_HandleInputEvent::Schema::Param param; 56558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputMsg_HandleInputEvent::Read(msg, ¶m); 57558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return param.c; 58558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 59558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 60558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochtemplate<typename MSG_T, typename ARG_T1> 61558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid ExpectIPCMessageWithArg1(const IPC::Message* msg, const ARG_T1& arg1) { 62558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_EQ(MSG_T::ID, msg->type()); 63558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch typename MSG_T::Schema::Param param; 64558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(MSG_T::Read(msg, ¶m)); 65558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(arg1, param.a); 66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 67558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 68558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochtemplate<typename MSG_T, typename ARG_T1, typename ARG_T2> 69558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid ExpectIPCMessageWithArg2(const IPC::Message* msg, 70558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const ARG_T1& arg1, 71558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const ARG_T2& arg2) { 72558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_EQ(MSG_T::ID, msg->type()); 73558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch typename MSG_T::Schema::Param param; 74558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(MSG_T::Read(msg, ¶m)); 75558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(arg1, param.a); 76558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(arg2, param.b); 77558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 78558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 79558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) || defined(USE_AURA) 80558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool TouchEventsAreEquivalent(const ui::TouchEvent& first, 81558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const ui::TouchEvent& second) { 82558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (first.type() != second.type()) 83558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return false; 84558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (first.location() != second.location()) 85558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return false; 86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (first.touch_id() != second.touch_id()) 87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return false; 88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (second.time_stamp().InSeconds() != first.time_stamp().InSeconds()) 89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return false; 90558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return true; 91558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 92558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 93558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool EventListIsSubset(const ScopedVector<ui::TouchEvent>& subset, 94558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const ScopedVector<ui::TouchEvent>& set) { 95558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (subset.size() > set.size()) 96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return false; 97558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch for (size_t i = 0; i < subset.size(); ++i) { 98558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const ui::TouchEvent* first = subset[i]; 99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const ui::TouchEvent* second = set[i]; 100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool equivalent = TouchEventsAreEquivalent(*first, *second); 101558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!equivalent) 102558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return false; 103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 105558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return true; 106558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 107558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif // defined(OS_WIN) || defined(USE_AURA) 108558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 109558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} // namespace 110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class InputRouterImplTest : public testing::Test { 112558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch public: 113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InputRouterImplTest() {} 114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual ~InputRouterImplTest() {} 115558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 116558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch protected: 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // testing::Test 118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void SetUp() OVERRIDE { 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) browser_context_.reset(new TestBrowserContext()); 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) process_.reset(new MockRenderProcessHost(browser_context_.get())); 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) client_.reset(new MockInputRouterClient()); 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ack_handler_.reset(new MockInputAckHandler()); 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) command_line->AppendSwitch(switches::kValidateInputEventStream); 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router_.reset(new InputRouterImpl( 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) process_.get(), client_.get(), ack_handler_.get(), MSG_ROUTING_NONE)); 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_router_->gesture_event_queue_->set_debounce_enabled_for_testing( 128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) false); 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) client_->set_input_router(input_router()); 130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ack_handler_->set_input_router(input_router()); 131558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 132558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void TearDown() OVERRIDE { 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Process all pending tasks to avoid leaks. 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router_.reset(); 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) client_.reset(); 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) process_.reset(); 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) browser_context_.reset(); 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SimulateKeyboardEvent(WebInputEvent::Type type, bool is_shortcut) { 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebKeyboardEvent event = SyntheticWebKeyboardEventBuilder::Build(type); 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NativeWebKeyboardEvent native_event; 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) memcpy(&native_event, &event, sizeof(event)); 147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router_->SendKeyboardEvent( 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) native_event, 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::LatencyInfo(), 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_shortcut); 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SimulateWheelEvent(float dX, float dY, int modifiers, bool precise) { 154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router_->SendWheelEvent(MouseWheelEventWithLatencyInfo( 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyntheticWebMouseWheelEventBuilder::Build(dX, dY, modifiers, precise), 156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::LatencyInfo())); 157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SimulateMouseEvent(WebInputEvent::Type type, int x, int y) { 160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router_->SendMouseEvent(MouseEventWithLatencyInfo( 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SyntheticWebMouseEventBuilder::Build(type, x, y, 0), 162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::LatencyInfo())); 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SimulateWheelEventWithPhase(WebMouseWheelEvent::Phase phase) { 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router_->SendWheelEvent(MouseWheelEventWithLatencyInfo( 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyntheticWebMouseWheelEventBuilder::Build(phase), ui::LatencyInfo())); 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SimulateGestureEvent(const WebGestureEvent& gesture) { 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router_->SendGestureEvent( 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GestureEventWithLatencyInfo(gesture, ui::LatencyInfo())); 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SimulateGestureEvent(WebInputEvent::Type type, 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebGestureEvent::SourceDevice sourceDevice) { 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SimulateGestureEvent( 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyntheticWebGestureEventBuilder::Build(type, sourceDevice)); 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SimulateGestureScrollUpdateEvent(float dX, float dY, int modifiers) { 182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SimulateGestureEvent( 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyntheticWebGestureEventBuilder::BuildScrollUpdate(dX, dY, modifiers)); 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SimulateGesturePinchUpdateEvent(float scale, 187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) float anchorX, 188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) float anchorY, 189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int modifiers) { 190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SimulateGestureEvent( 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyntheticWebGestureEventBuilder::BuildPinchUpdate(scale, 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) anchorX, 193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) anchorY, 194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) modifiers)); 195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SimulateGestureFlingStartEvent( 198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) float velocityX, 199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) float velocityY, 200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebGestureEvent::SourceDevice sourceDevice) { 201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SimulateGestureEvent( 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyntheticWebGestureEventBuilder::BuildFling(velocityX, 203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) velocityY, 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) sourceDevice)); 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SimulateTouchEvent(WebInputEvent::Type type) { 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch_event_.ResetPoints(); 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int index = PressTouchPoint(0, 0); 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) switch (type) { 211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case WebInputEvent::TouchStart: 212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Already handled by |PressTouchPoint()|. 213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case WebInputEvent::TouchMove: 215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MoveTouchPoint(index, 5, 5); 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case WebInputEvent::TouchEnd: 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ReleaseTouchPoint(index); 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case WebInputEvent::TouchCancel: 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CancelTouchPoint(index); 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) default: 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FAIL() << "Invalid touch event type."; 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SendTouchEvent(); 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SetTouchTimestamp(base::TimeDelta timestamp) { 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch_event_.SetTimestamp(timestamp); 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SendTouchEvent() { 235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router_->SendTouchEvent( 236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TouchEventWithLatencyInfo(touch_event_, ui::LatencyInfo())); 237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch_event_.ResetPoints(); 238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int PressTouchPoint(int x, int y) { 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return touch_event_.PressPoint(x, y); 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void MoveTouchPoint(int index, int x, int y) { 245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch_event_.MovePoint(index, x, y); 246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void ReleaseTouchPoint(int index) { 249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch_event_.ReleasePoint(index); 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void CancelTouchPoint(int index) { 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch_event_.CancelPoint(index); 254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SendInputEventACK(blink::WebInputEvent::Type type, 256558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputEventAckState ack_result) { 257558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_ptr<IPC::Message> response( 2583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch new InputHostMsg_HandleInputEvent_ACK(0, type, ack_result, 2593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ui::LatencyInfo())); 260558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch input_router_->OnMessageReceived(*response); 261558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 262558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InputRouterImpl* input_router() const { 264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return input_router_.get(); 265558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 266558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool TouchEventQueueEmpty() const { 2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return input_router()->touch_event_queue_->empty(); 269558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 270558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool TouchEventTimeoutEnabled() const { 272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return input_router()->touch_event_queue_->ack_timeout_enabled(); 273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnHasTouchEventHandlers(bool has_handlers) { 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_router_->OnMessageReceived( 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ViewHostMsg_HasTouchEventHandlers(0, has_handlers)); 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnSetTouchAction(content::TouchAction touch_action) { 281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) input_router_->OnMessageReceived( 282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) InputHostMsg_SetTouchAction(0, touch_action)); 283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t GetSentMessageCountAndResetSink() { 2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t count = process_->sink().message_count(); 2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) process_->sink().ClearMessages(); 2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return count; 289558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void RunTasksAndWait(base::TimeDelta delay) { 292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FROM_HERE, base::MessageLoop::QuitClosure(), delay); 294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::MessageLoop::current()->Run(); 295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<MockRenderProcessHost> process_; 298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<MockInputRouterClient> client_; 299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<MockInputAckHandler> ack_handler_; 300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<InputRouterImpl> input_router_; 301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::MessageLoopForUI message_loop_; 304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyntheticWebTouchEvent touch_event_; 305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<TestBrowserContext> browser_context_; 307558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}; 308558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, CoalescesRangeSelection) { 31058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) input_router_->SendInput(scoped_ptr<IPC::Message>( 31158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new InputMsg_SelectRange(0, gfx::Point(1, 2), gfx::Point(3, 4)))); 312558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ExpectIPCMessageWithArg2<InputMsg_SelectRange>( 313558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch process_->sink().GetMessageAt(0), 314558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::Point(1, 2), 315558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::Point(3, 4)); 3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1u, GetSentMessageCountAndResetSink()); 317558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 318558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Send two more messages without acking. 31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) input_router_->SendInput(scoped_ptr<IPC::Message>( 32058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new InputMsg_SelectRange(0, gfx::Point(5, 6), gfx::Point(7, 8)))); 3214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 322558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 32358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) input_router_->SendInput(scoped_ptr<IPC::Message>( 32458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new InputMsg_SelectRange(0, gfx::Point(9, 10), gfx::Point(11, 12)))); 3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 326558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 327558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Now ack the first message. 328558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch { 329558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_ptr<IPC::Message> response(new ViewHostMsg_SelectRange_ACK(0)); 330558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch input_router_->OnMessageReceived(*response); 331558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 332558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 333558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Verify that the two messages are coalesced into one message. 334558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ExpectIPCMessageWithArg2<InputMsg_SelectRange>( 335558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch process_->sink().GetMessageAt(0), 336558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::Point(9, 10), 337558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::Point(11, 12)); 3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1u, GetSentMessageCountAndResetSink()); 339558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 340558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Acking the coalesced msg should not send any more msg. 341558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch { 342558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_ptr<IPC::Message> response(new ViewHostMsg_SelectRange_ACK(0)); 343558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch input_router_->OnMessageReceived(*response); 344558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 346558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 347558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, CoalescesCaretMove) { 34958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) input_router_->SendInput( 35058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(1, 2)))); 351558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ExpectIPCMessageWithArg1<InputMsg_MoveCaret>( 352558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch process_->sink().GetMessageAt(0), gfx::Point(1, 2)); 3534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1u, GetSentMessageCountAndResetSink()); 354558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 355558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Send two more messages without acking. 35658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) input_router_->SendInput( 35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(5, 6)))); 3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 359558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 36058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) input_router_->SendInput( 36158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(9, 10)))); 3624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 363558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 364558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Now ack the first message. 365558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch { 366558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_ptr<IPC::Message> response(new ViewHostMsg_MoveCaret_ACK(0)); 367558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch input_router_->OnMessageReceived(*response); 368558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 369558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 370558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Verify that the two messages are coalesced into one message. 371558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ExpectIPCMessageWithArg1<InputMsg_MoveCaret>( 372558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch process_->sink().GetMessageAt(0), gfx::Point(9, 10)); 3734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1u, GetSentMessageCountAndResetSink()); 374558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 375558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Acking the coalesced msg should not send any more msg. 376558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch { 377558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_ptr<IPC::Message> response(new ViewHostMsg_MoveCaret_ACK(0)); 378558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch input_router_->OnMessageReceived(*response); 379558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 3804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 381558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 382558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, HandledInputEvent) { 384558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch client_->set_filter_state(INPUT_EVENT_ACK_STATE_CONSUMED); 385558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 386558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Simulate a keyboard event. 3874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false); 388558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 389558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Make sure no input event is sent to the renderer. 3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 391558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 392558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // OnKeyboardEventAck should be triggered without actual ack. 3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 394558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 395558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // As the event was acked already, keyboard event queue should be 396558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // empty. 397558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_EQ(NULL, input_router_->GetLastKeyboardEvent()); 398558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 399558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, ClientCanceledKeyboardEvent) { 4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client_->set_filter_state(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); 402558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Simulate a keyboard event that has no consumer. 4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false); 405558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 406558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Make sure no input event is sent to the renderer. 4074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 4094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Simulate a keyboard event that should be dropped. 4124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client_->set_filter_state(INPUT_EVENT_ACK_STATE_UNKNOWN); 4134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false); 4144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Make sure no input event is sent to the renderer, and no ack is sent. 4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 418558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 419558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, ShortcutKeyboardEvent) { 4214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SimulateKeyboardEvent(WebInputEvent::RawKeyDown, true); 422558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(GetIsShortcutFromHandleInputEventMessage( 423558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch process_->sink().GetMessageAt(0))); 424558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 425558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch process_->sink().ClearMessages(); 426558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 4274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false); 428558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_FALSE(GetIsShortcutFromHandleInputEventMessage( 429558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch process_->sink().GetMessageAt(0))); 430558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 431558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, NoncorrespondingKeyEvents) { 4334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false); 434558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 435558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::KeyUp, 436558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(ack_handler_->unexpected_event_ack_called()); 438558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 439558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 440558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Tests ported from RenderWidgetHostTest -------------------------------------- 441558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, HandleKeyEventsWeSent) { 443558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Simulate a keyboard event. 4444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false); 445558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(input_router_->GetLastKeyboardEvent()); 446558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(WebInputEvent::RawKeyDown, 447558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch input_router_->GetLastKeyboardEvent()->type); 448558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 449558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Make sure we sent the input event to the renderer. 450558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( 451558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputMsg_HandleInputEvent::ID)); 452558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch process_->sink().ClearMessages(); 453558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 454558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Send the simulated response from the renderer back. 455558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::RawKeyDown, 456558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 45858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(WebInputEvent::RawKeyDown, 45958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ack_handler_->acked_keyboard_event().type); 460558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 461558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, IgnoreKeyEventsWeDidntSend) { 463558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Send a simulated, unrequested key response. We should ignore this. 464558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::RawKeyDown, 465558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 466558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 4674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 468558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 469558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, CoalescesWheelEvents) { 471558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Simulate wheel events. 472558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SimulateWheelEvent(0, -5, 0, false); // sent directly 473558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SimulateWheelEvent(0, -10, 0, false); // enqueued 474558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SimulateWheelEvent(8, -6, 0, false); // coalesced into previous event 475558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SimulateWheelEvent(9, -7, 1, false); // enqueued, different modifiers 476558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 477558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Check that only the first event was sent. 478558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( 479558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputMsg_HandleInputEvent::ID)); 4804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 481558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Check that the ACK sends the second message immediately. 483558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::MouseWheel, 484558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_CONSUMED); 485558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // The coalesced events can queue up a delayed ack 486558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // so that additional input events can be processed before 487558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // we turn off coalescing. 488558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::MessageLoop::current()->RunUntilIdle(); 4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 490558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( 491558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputMsg_HandleInputEvent::ID)); 4924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 493558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 494558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // One more time. 495558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::MouseWheel, 496558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_CONSUMED); 497558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::MessageLoop::current()->RunUntilIdle(); 4984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 499558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( 500558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputMsg_HandleInputEvent::ID)); 5014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 502558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 503558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // After the final ack, the queue should be empty. 504558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::MouseWheel, 505558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_CONSUMED); 506558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::MessageLoop::current()->RunUntilIdle(); 5074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 509558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 510558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, 512558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CoalescesWheelEventsQueuedPhaseEndIsNotDropped) { 513558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Send an initial gesture begin and ACK it. 514558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 515558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch WebGestureEvent::Touchpad); 5164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 517558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::GestureScrollBegin, 518558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_CONSUMED); 519558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::MessageLoop::current()->RunUntilIdle(); 520558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 521558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Send a wheel event, should get sent directly. 522558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SimulateWheelEvent(0, -5, 0, false); 5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 524558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 525558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Send a wheel phase end event before an ACK is received for the previous 526558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // wheel event, which should get queued. 527558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SimulateWheelEventWithPhase(WebMouseWheelEvent::PhaseEnded); 5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 529558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 530558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // A gesture event should now result in the queued phase ended event being 531558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // transmitted before it. 532558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SimulateGestureEvent(WebInputEvent::GestureScrollEnd, 533558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch WebGestureEvent::Touchpad); 534558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 535558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Verify the events that were sent. 536558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const WebInputEvent* input_event = 5374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); 538558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); 539558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const WebMouseWheelEvent* wheel_event = 540558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch static_cast<const WebMouseWheelEvent*>(input_event); 541558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_EQ(WebMouseWheelEvent::PhaseEnded, wheel_event->phase); 542558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(1)); 544558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(WebInputEvent::GestureScrollEnd, input_event->type); 545558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_EQ(2U, GetSentMessageCountAndResetSink()); 547558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 548558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 549558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Tests that touch-events are queued properly. 550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchEventQueue) { 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnHasTouchEventHandlers(true); 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 553558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PressTouchPoint(1, 1); 554558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendTouchEvent(); 5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(client_->GetAndResetFilterEventCalled()); 5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 5574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TouchEventQueueEmpty()); 558558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 559558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // The second touch should not be sent since one is already in queue. 560558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MoveTouchPoint(0, 5, 5); 561558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendTouchEvent(); 5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(client_->GetAndResetFilterEventCalled()); 5634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TouchEventQueueEmpty()); 565558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 566558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Receive an ACK for the first touch-event. 567558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::TouchStart, 568558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_CONSUMED); 5694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TouchEventQueueEmpty()); 5704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 571558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(WebInputEvent::TouchStart, 57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ack_handler_->acked_touch_event().event.type); 5734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 574558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 575558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::TouchMove, 576558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_CONSUMED); 5774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(TouchEventQueueEmpty()); 5784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 579558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(WebInputEvent::TouchMove, 58058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ack_handler_->acked_touch_event().event.type); 5814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 582558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 583558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 584558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Tests that the touch-queue is emptied if a page stops listening for touch 585558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// events. 586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchEventQueueFlush) { 5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnHasTouchEventHandlers(true); 588558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(client_->has_touch_handler()); 5894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 5904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(TouchEventQueueEmpty()); 591558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 592558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(input_router_->ShouldForwardTouchEvent()); 593558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 594558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Send a touch-press event. 595558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PressTouchPoint(1, 1); 596558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendTouchEvent(); 5974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TouchEventQueueEmpty()); 5984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 599558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 600558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // The page stops listening for touch-events. The touch-event queue should now 601558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // be emptied, but none of the queued touch-events should be sent to the 602558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // renderer. 6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnHasTouchEventHandlers(false); 604558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_FALSE(client_->has_touch_handler()); 6054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 6064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(TouchEventQueueEmpty()); 607558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_FALSE(input_router_->ShouldForwardTouchEvent()); 608558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 609558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 610558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) || defined(USE_AURA) 611558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Tests that the acked events have correct state. (ui::Events are used only on 612558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// windows and aura) 613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, AckedTouchEventState) { 614558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true)); 6154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 6164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(TouchEventQueueEmpty()); 617558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(input_router_->ShouldForwardTouchEvent()); 618558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 619558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Send a bunch of events, and make sure the ACKed events are correct. 620558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ScopedVector<ui::TouchEvent> expected_events; 621558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 622558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Use a custom timestamp for all the events to test that the acked events 623558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // have the same timestamp; 624558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::TimeDelta timestamp = base::Time::NowFromSystemTime() - base::Time(); 625558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch timestamp -= base::TimeDelta::FromSeconds(600); 626558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 627558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Press the first finger. 628558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PressTouchPoint(1, 1); 629558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SetTouchTimestamp(timestamp); 630558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendTouchEvent(); 6314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 632558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_PRESSED, 633558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::Point(1, 1), 0, timestamp)); 634558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 635558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Move the finger. 636558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch timestamp += base::TimeDelta::FromSeconds(10); 6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MoveTouchPoint(0, 500, 500); 638558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SetTouchTimestamp(timestamp); 639558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendTouchEvent(); 6404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TouchEventQueueEmpty()); 641558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED, 6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point(500, 500), 0, timestamp)); 643558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 644558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Now press a second finger. 645558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch timestamp += base::TimeDelta::FromSeconds(10); 646558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PressTouchPoint(2, 2); 647558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SetTouchTimestamp(timestamp); 648558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendTouchEvent(); 6494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TouchEventQueueEmpty()); 650558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_PRESSED, 651558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::Point(2, 2), 1, timestamp)); 652558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 653558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Move both fingers. 654558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch timestamp += base::TimeDelta::FromSeconds(10); 655558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MoveTouchPoint(0, 10, 10); 656558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MoveTouchPoint(1, 20, 20); 657558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SetTouchTimestamp(timestamp); 658558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendTouchEvent(); 6594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TouchEventQueueEmpty()); 660558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED, 661558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::Point(10, 10), 0, timestamp)); 662558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED, 663558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::Point(20, 20), 1, timestamp)); 664558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 665558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Receive the ACKs and make sure the generated events from the acked events 666558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // are correct. 667558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch WebInputEvent::Type acks[] = { WebInputEvent::TouchStart, 668558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch WebInputEvent::TouchMove, 669558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch WebInputEvent::TouchStart, 670558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch WebInputEvent::TouchMove }; 671558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 672558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch TouchEventCoordinateSystem coordinate_system = LOCAL_COORDINATES; 673558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if !defined(OS_WIN) 674558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch coordinate_system = SCREEN_COORDINATES; 675558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 676558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch for (size_t i = 0; i < arraysize(acks); ++i) { 677558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(acks[i], 678558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 67958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(acks[i], ack_handler_->acked_touch_event().event.type); 680558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ScopedVector<ui::TouchEvent> acked; 681558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 682558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MakeUITouchEventsFromWebTouchEvents( 68358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ack_handler_->acked_touch_event(), &acked, coordinate_system); 684558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool success = EventListIsSubset(acked, expected_events); 685558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(success) << "Failed on step: " << i; 686558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!success) 687558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch break; 688558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_events.erase(expected_events.begin(), 689558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_events.begin() + acked.size()); 690558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 691558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 6924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(TouchEventQueueEmpty()); 693558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(0U, expected_events.size()); 694558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 695558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif // defined(OS_WIN) || defined(USE_AURA) 696558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 697a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, UnhandledWheelEvent) { 698558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Simulate wheel events. 699558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SimulateWheelEvent(0, -5, 0, false); // sent directly 700558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SimulateWheelEvent(0, -10, 0, false); // enqueued 701558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 702558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Check that only the first event was sent. 703558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( 704558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputMsg_HandleInputEvent::ID)); 7054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 706558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 707558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Indicate that the wheel event was unhandled. 708558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::MouseWheel, 709558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 710558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 711558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Check that the correct unhandled wheel event was received. 7124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 71358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_handler_->ack_state()); 71458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5); 715558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 716558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Check that the second event was sent. 717558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( 718558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputMsg_HandleInputEvent::ID)); 7194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 720558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 721558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Check that the correct unhandled wheel event was received. 72258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5); 723558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 724558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 725a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchTypesIgnoringAck) { 7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnHasTouchEventHandlers(true); 7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int start_type = static_cast<int>(WebInputEvent::TouchStart); 729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int end_type = static_cast<int>(WebInputEvent::TouchCancel); 7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_LT(start_type, end_type); 731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (int i = start_type; i <= end_type; ++i) { 732f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WebInputEvent::Type type = static_cast<WebInputEvent::Type>(i); 733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!WebInputEventTraits::IgnoresAckDisposition(type)) 734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) continue; 735f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 736f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The TouchEventQueue requires an initial TouchStart for it to begin 737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // forwarding other touch event types. 738f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (type != WebInputEvent::TouchStart) { 739f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SimulateTouchEvent(WebInputEvent::TouchStart); 740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, 741f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) INPUT_EVENT_ACK_STATE_CONSUMED); 742f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_EQ(1U, GetSentMessageCountAndResetSink()); 743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_EQ(1U, ack_handler_->GetAndResetAckCount()); 7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(0, client_->in_flight_event_count()); 745f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 746f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 747f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SimulateTouchEvent(type); 748f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 749f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, client_->in_flight_event_count()); 751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SendInputEventACK(type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 752f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 753f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 754f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 755f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 756f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 757a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, GestureTypesIgnoringAck) { 758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // We test every gesture type, ensuring that the stream of gestures is valid. 759a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const int kEventTypesLength = 29; 760a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::Type eventTypes[kEventTypesLength] = { 761a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapDown, 762a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureShowPress, 763a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapCancel, 764a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureScrollBegin, 765a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureFlingStart, 766a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureFlingCancel, 767a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapDown, 768a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTap, 769a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapDown, 770a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureLongPress, 771a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapCancel, 772a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureLongTap, 773a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapDown, 774a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapUnconfirmed, 775a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapCancel, 776a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapDown, 777a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureDoubleTap, 778a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapDown, 779a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapCancel, 780a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTwoFingerTap, 781a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapDown, 782a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapCancel, 783a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureScrollBegin, 784a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureScrollUpdate, 785a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureScrollUpdateWithoutPropagation, 786a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GesturePinchBegin, 787a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GesturePinchUpdate, 788a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GesturePinchEnd, 789a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureScrollEnd}; 790a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (int i = 0; i < kEventTypesLength; ++i) { 791a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::Type type = eventTypes[i]; 792a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!WebInputEventTraits::IgnoresAckDisposition(type)) { 793a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(type, WebGestureEvent::Touchscreen); 794a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 795a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 796a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1, client_->in_flight_event_count()); 797a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 798a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 799a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 800a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 801a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0, client_->in_flight_event_count()); 802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) continue; 803a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 804f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 805f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SimulateGestureEvent(type, WebGestureEvent::Touchscreen); 806f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 807f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, client_->in_flight_event_count()); 8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SendInputEventACK(type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(InputRouterImplTest, MouseTypesIgnoringAck) { 8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int start_type = static_cast<int>(WebInputEvent::MouseDown); 8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int end_type = static_cast<int>(WebInputEvent::ContextMenu); 8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_LT(start_type, end_type); 8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int i = start_type; i <= end_type; ++i) { 8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::Type type = static_cast<WebInputEvent::Type>(i); 8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int expected_in_flight_event_count = 8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEventTraits::IgnoresAckDisposition(type) ? 0 : 1; 8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Note: Mouse event acks are never forwarded to the ack handler, so the key 8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // result here is that ignored ack types don't affect the in-flight count. 8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SimulateMouseEvent(type, 0, 0); 8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 8285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_in_flight_event_count, client_->in_flight_event_count()); 830f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SendInputEventACK(type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 831f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 832f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 8335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, client_->in_flight_event_count()); 8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Guard against breaking changes to the list of ignored event ack types in 8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// |WebInputEventTraits::IgnoresAckDisposition|. 8395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(InputRouterImplTest, RequiredEventAckTypes) { 8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const WebInputEvent::Type kRequiredEventAckTypes[] = { 8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::MouseMove, 8425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::MouseWheel, 8435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::RawKeyDown, 8445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::KeyDown, 8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::KeyUp, 8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::Char, 8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::GestureScrollUpdate, 8485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::GestureFlingStart, 8495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::GestureFlingCancel, 8505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::GesturePinchUpdate, 8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::TouchStart, 8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::TouchMove 8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < arraysize(kRequiredEventAckTypes); ++i) { 8555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const WebInputEvent::Type required_ack_type = kRequiredEventAckTypes[i]; 8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(WebInputEventTraits::IgnoresAckDisposition(required_ack_type)); 857f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 858f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 859f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 860f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Test that GestureShowPress, GestureTapDown and GestureTapCancel events don't 861f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// wait for ACKs. 862a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, GestureTypesIgnoringAckInterleaved) { 863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Interleave a few events that do and do not ignore acks, ensuring that 864f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // ack-ignoring events aren't dispatched until all prior events which observe 865f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // their ack disposition have been dispatched. 866a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 867a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 868a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebGestureEvent::Touchscreen); 869a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(1U, GetSentMessageCountAndResetSink()); 870a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 871a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0, client_->in_flight_event_count()); 872a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 873a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollUpdate, 874f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WebGestureEvent::Touchscreen); 875f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_EQ(1U, GetSentMessageCountAndResetSink()); 876f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, client_->in_flight_event_count()); 878f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 879f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureTapDown, 880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WebGestureEvent::Touchscreen); 881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 882f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, client_->in_flight_event_count()); 884f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 885a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollUpdate, 886f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WebGestureEvent::Touchscreen); 887f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 888f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 889f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 890f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureShowPress, 891f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WebGestureEvent::Touchscreen); 892f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 894f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 895a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollUpdate, 896f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WebGestureEvent::Touchscreen); 897f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 898f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 899f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 900f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureTapCancel, 901f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WebGestureEvent::Touchscreen); 902f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 903f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 904f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 905f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Now ack each event. Ack-ignoring events should not be dispatched until all 906f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // prior events which observe ack disposition have been fired, at which 9075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // point they should be sent immediately. They should also have no effect 9085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // on the in-flight event count. 909a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::GestureScrollBegin, 910a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 911a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 912a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::GestureScrollUpdate, 913f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 914f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2U, GetSentMessageCountAndResetSink()); 915f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2U, ack_handler_->GetAndResetAckCount()); 9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, client_->in_flight_event_count()); 917f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 918f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // For events which ignore ack disposition, non-synthetic acks are ignored. 919f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SendInputEventACK(WebInputEvent::GestureTapDown, 920f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 921f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 922f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 9235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, client_->in_flight_event_count()); 924f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 925a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::GestureScrollUpdate, 926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 927f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2U, GetSentMessageCountAndResetSink()); 928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2U, ack_handler_->GetAndResetAckCount()); 9295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, client_->in_flight_event_count()); 930f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 931f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // For events which ignore ack disposition, non-synthetic acks are ignored. 932f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SendInputEventACK(WebInputEvent::GestureShowPress, 933f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 934f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 935f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 9365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, client_->in_flight_event_count()); 937f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 938a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::GestureScrollUpdate, 939f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 940f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 941f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2U, ack_handler_->GetAndResetAckCount()); 9425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, client_->in_flight_event_count()); 943f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 944f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // For events which ignore ack disposition, non-synthetic acks are ignored. 945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SendInputEventACK(WebInputEvent::GestureTapCancel, 946f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 947f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 9495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, client_->in_flight_event_count()); 950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 952f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Test that GestureShowPress events don't get out of order due to 953f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// ignoring their acks. 954a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, GestureShowPressIsInOrder) { 955a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 956a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebGestureEvent::Touchscreen); 957a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 958a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 959a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 960a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 9615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // GesturePinchBegin ignores its ack. 9625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GesturePinchBegin, 963f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WebGestureEvent::Touchscreen); 9645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 9655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 966f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 967a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // GesturePinchUpdate waits for an ack. 9685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GesturePinchUpdate, 9695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebGestureEvent::Touchscreen); 970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 971f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 972f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 973f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureShowPress, 974f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WebGestureEvent::Touchscreen); 975f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 976f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The ShowPress, though it ignores ack, is still stuck in the queue 9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // behind the PinchUpdate which requires an ack. 978f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 979f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 980f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureShowPress, 981f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WebGestureEvent::Touchscreen); 982f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 983f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // ShowPress has entered the queue. 984f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 985f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 9865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This ack is ignored. 9875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SendInputEventACK(WebInputEvent::GesturePinchBegin, 988f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 9895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 991f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 9925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SendInputEventACK(WebInputEvent::GesturePinchUpdate, 9935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 994f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Now that the Tap has been ACKed, the ShowPress events should receive 9955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // synthetic acks, and fire immediately. 996f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2U, GetSentMessageCountAndResetSink()); 997f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(3U, ack_handler_->GetAndResetAckCount()); 998f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 999f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1000a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Test that touch ack timeout behavior is properly configured via the command 1001a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// line, and toggled by view update flags and allowed touch actions. 1002a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchAckTimeoutConfigured) { 1003a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Unless explicitly supported via the command-line, the touch timeout should 1004a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // be disabled. 1005a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(TouchEventTimeoutEnabled()); 1006a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1007a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitchASCII( 1008a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switches::kTouchAckTimeoutDelayMs, "1"); 1009a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TearDown(); 1010a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetUp(); 1011a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(TouchEventTimeoutEnabled()); 1012a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1013a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Verify that the touch ack timeout fires upon the delayed ack. 1014a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1015a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1016a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1017a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1018a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RunTasksAndWait(base::TimeDelta::FromMilliseconds(2)); 1019a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1020a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The timed-out event should have been ack'ed. 1021a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1022a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1023a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1024a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ack'ing the timed-out event should fire a TouchCancel. 1025a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 1026a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1027a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1028a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1029a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The remainder of the touch sequence should be dropped. 1030a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReleaseTouchPoint(0); 1031a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1032a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1033a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1034a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(TouchEventTimeoutEnabled()); 1035a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1036a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // A fixed page scale or mobile viewport should disable the touch timeout. 1037a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router()->OnViewUpdated(InputRouter::FIXED_PAGE_SCALE); 1038a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(TouchEventTimeoutEnabled()); 1039a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1040a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router()->OnViewUpdated(InputRouter::VIEW_FLAGS_NONE); 1041a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(TouchEventTimeoutEnabled()); 1042a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1043a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router()->OnViewUpdated(InputRouter::MOBILE_VIEWPORT); 1044a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(TouchEventTimeoutEnabled()); 1045a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1046a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router()->OnViewUpdated(InputRouter::MOBILE_VIEWPORT | 1047a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InputRouter::FIXED_PAGE_SCALE); 1048a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(TouchEventTimeoutEnabled()); 1049a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1050a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router()->OnViewUpdated(InputRouter::VIEW_FLAGS_NONE); 1051a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(TouchEventTimeoutEnabled()); 1052a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1053a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TOUCH_ACTION_NONE (and no other touch-action) should disable the timeout. 1054a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnHasTouchEventHandlers(true); 1055a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1056a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1057a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnSetTouchAction(TOUCH_ACTION_PAN_Y); 1058a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(TouchEventTimeoutEnabled()); 1059a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReleaseTouchPoint(0); 1060a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1061a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 1062a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); 1063a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1064a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1065a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1066a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnSetTouchAction(TOUCH_ACTION_NONE); 1067a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(TouchEventTimeoutEnabled()); 1068a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReleaseTouchPoint(0); 1069a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1070a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 1071a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); 1072a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1073a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // As the touch-action is reset by a new touch sequence, the timeout behavior 1074a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // should be restored. 1075a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1076a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1077a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(TouchEventTimeoutEnabled()); 1078a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1079a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1080a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that a touch sequenced preceded by TOUCH_ACTION_NONE is not affected by 1081a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// the touch timeout. 1082a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(InputRouterImplTest, 1083a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TouchAckTimeoutDisabledForTouchSequenceAfterTouchActionNone) { 1084a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitchASCII( 1085a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switches::kTouchAckTimeoutDelayMs, "1"); 1086a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TearDown(); 1087a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetUp(); 1088a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(TouchEventTimeoutEnabled()); 1089a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnHasTouchEventHandlers(true); 1090a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1091a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Start a touch sequence. 1092a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1093a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1094a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1095a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TOUCH_ACTION_NONE should disable the timeout. 1096a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnSetTouchAction(TOUCH_ACTION_NONE); 1097a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 1098a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(TouchEventTimeoutEnabled()); 1099a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // End the touch sequence. 1101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReleaseTouchPoint(0); 1102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); 1104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(TouchEventTimeoutEnabled()); 1105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ack_handler_->GetAndResetAckCount(); 1106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetSentMessageCountAndResetSink(); 1107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Start another touch sequence. While this does restore the touch timeout 1109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // the timeout will not apply until the *next* touch sequence. This affords a 1110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // touch-action response from the renderer without racing against the timeout. 1111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(TouchEventTimeoutEnabled()); 1114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Delay the ack. The timeout should *not* fire. 1117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RunTasksAndWait(base::TimeDelta::FromMilliseconds(2)); 1118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Finally send the ack. The touch sequence should not have been cancelled. 1122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, 1123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(TouchEventTimeoutEnabled()); 1125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // End the sequence. 1129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReleaseTouchPoint(0); 1130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); 1132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // A new touch sequence should (finally) be subject to the timeout. 1136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(TouchEventTimeoutEnabled()); 1139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Wait for the touch ack timeout to fire. 1143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RunTasksAndWait(base::TimeDelta::FromMilliseconds(2)); 1144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that TouchActionFilter::ResetTouchAction is called before the 1148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// first touch event for a touch sequence reaches the renderer. 1149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(InputRouterImplTest, ResetTouchActionBeforeEventReachesRenderer) { 1150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnHasTouchEventHandlers(true); 1151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sequence 1. 1153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnSetTouchAction(TOUCH_ACTION_NONE); 1156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MoveTouchPoint(0, 5, 5); 1157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReleaseTouchPoint(0); 1159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sequence 2. 1162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MoveTouchPoint(0, 5, 5); 1165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReleaseTouchPoint(0); 1167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 1170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchMove, INPUT_EVENT_ACK_STATE_CONSUMED); 1171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ensure touch action is still none, as the next touch start hasn't been 1173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // acked yet. ScrollBegin and ScrollEnd don't require acks. 1174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(3U, GetSentMessageCountAndResetSink()); 1175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 1176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebGestureEvent::Touchpad); 1177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollEnd, 1179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebGestureEvent::Touchpad); 1180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This allows the next touch sequence to start. 1183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); 1184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ensure touch action has been set to auto, as a new touch sequence has 1186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // started. 1187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 1189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebGestureEvent::Touchpad); 1190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollEnd, 1192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebGestureEvent::Touchpad); 1193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 1196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchMove, INPUT_EVENT_ACK_STATE_CONSUMED); 1197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); 1198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that TouchActionFilter::OnStartNewTouchSequence is called when a touch 1201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// handler is removed. 1202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(InputRouterImplTest, OnStartNewTouchSequenceWhenTouchHandlerRemoved) { 1203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnHasTouchEventHandlers(true); 1204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sequence 1. 1206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnSetTouchAction(TOUCH_ACTION_NONE); 1209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 1210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReleaseTouchPoint(0); 1212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sequence 2 1215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ensure we have touch-action:none. ScrollBegin and ScrollEnd don't require 1219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // acks. 1220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(2U, GetSentMessageCountAndResetSink()); 1221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 1222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebGestureEvent::Touchpad); 1223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollEnd, 1225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebGestureEvent::Touchpad); 1226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); 1229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, 1230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); 1231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ensure touch action has been set to auto, the touch handler has been 1233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // removed. 1234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 1236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebGestureEvent::Touchpad); 1237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollEnd, 1239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebGestureEvent::Touchpad); 1240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that the double tap gesture depends on the touch action of the first 1244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// tap. 1245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(InputRouterImplTest, DoubleTapGestureDependsOnFirstTap) { 1246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnHasTouchEventHandlers(true); 1247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sequence 1. 1249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnSetTouchAction(TOUCH_ACTION_NONE); 1252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 1253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReleaseTouchPoint(0); 1255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sequence 2 1258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // First tap. 1262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(2U, GetSentMessageCountAndResetSink()); 1263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureTapDown, 1264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebGestureEvent::Touchscreen); 1265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The GestureTapUnconfirmed is converted into a tap, as the touch action is 1268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // auto. 1269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureTapUnconfirmed, 1270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebGestureEvent::Touchscreen); 1271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::GestureTap, 1272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) INPUT_EVENT_ACK_STATE_CONSUMED); 1273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This tap gesture is dropped, since the GestureTapUnconfirmed was turned 1276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // into a tap. 1277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureTap, WebGestureEvent::Touchscreen); 1278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); 1281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, 1282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); 1283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Second Tap. 1285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureTapDown, 1287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebGestureEvent::Touchscreen); 1288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Although the touch-action is now auto, the double tap still won't be 1291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // dispatched, because the first tap occured when the touch-action was none. 1292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureDoubleTap, 1293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebGestureEvent::Touchscreen); 1294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This test will become invalid if GestureDoubleTap stops requiring an ack. 1295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!WebInputEventTraits::IgnoresAckDisposition( 1296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureDoubleTap)); 1297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0, client_->in_flight_event_count()); 1298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1300558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} // namespace content 1301