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 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <math.h> 6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 7558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/basictypes.h" 8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/command_line.h" 9558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/memory/scoped_ptr.h" 10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/strings/utf_string_conversions.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/renderer_host/input/gesture_event_queue.h" 12558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/renderer_host/input/input_router_client.h" 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/renderer_host/input/input_router_impl.h" 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/renderer_host/input/mock_input_ack_handler.h" 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/browser/renderer_host/input/mock_input_router_client.h" 16558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/content_constants_internal.h" 17558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/edit_command.h" 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/common/input/synthetic_web_input_event_builders.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/input/touch_action.h" 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/common/input/web_input_event_traits.h" 21558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/input_messages.h" 22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/view_messages.h" 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/common/content_switches.h" 24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/test/mock_render_process_host.h" 25558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/test/test_browser_context.h" 26558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h" 28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA) 30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/renderer_host/ui_events_helper.h" 31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 33558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochusing base::TimeDelta; 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using blink::WebGestureDevice; 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebGestureEvent; 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using blink::WebKeyboardEvent; 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent; 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseEvent; 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseWheelEvent; 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchEvent; 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchPoint; 43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace content { 45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace { 47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochconst WebInputEvent* GetInputEventFromMessage(const IPC::Message& message) { 49558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PickleIterator iter(message); 50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const char* data; 51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int data_length; 52558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!message.ReadData(&iter, &data, &data_length)) 53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return NULL; 54558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return reinterpret_cast<const WebInputEvent*>(data); 55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 56558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuWebInputEvent& GetEventWithType(WebInputEvent::Type type) { 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebInputEvent* event = NULL; 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (WebInputEvent::isMouseEventType(type)) { 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu static WebMouseEvent mouse; 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu event = &mouse; 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else if (WebInputEvent::isTouchEventType(type)) { 635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu static WebTouchEvent touch; 645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu event = &touch; 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else if (WebInputEvent::isKeyboardEventType(type)) { 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu static WebKeyboardEvent key; 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu event = &key; 685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else if (WebInputEvent::isGestureEventType(type)) { 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu static WebGestureEvent gesture; 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu event = &gesture; 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else if (type == WebInputEvent::MouseWheel) { 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu static WebMouseWheelEvent wheel; 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu event = &wheel; 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CHECK(event); 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu event->type = type; 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return *event; 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 80558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool GetIsShortcutFromHandleInputEventMessage(const IPC::Message* msg) { 81558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputMsg_HandleInputEvent::Schema::Param param; 82558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputMsg_HandleInputEvent::Read(msg, ¶m); 83558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return param.c; 84558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 85558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochtemplate<typename MSG_T, typename ARG_T1> 87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid ExpectIPCMessageWithArg1(const IPC::Message* msg, const ARG_T1& arg1) { 88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_EQ(MSG_T::ID, msg->type()); 89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch typename MSG_T::Schema::Param param; 90558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(MSG_T::Read(msg, ¶m)); 91558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(arg1, param.a); 92558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 93558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 94558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochtemplate<typename MSG_T, typename ARG_T1, typename ARG_T2> 95558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid ExpectIPCMessageWithArg2(const IPC::Message* msg, 96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const ARG_T1& arg1, 97558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const ARG_T2& arg2) { 98558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_EQ(MSG_T::ID, msg->type()); 99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch typename MSG_T::Schema::Param param; 100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(MSG_T::Read(msg, ¶m)); 101558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(arg1, param.a); 102558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(arg2, param.b); 103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA) 106558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool TouchEventsAreEquivalent(const ui::TouchEvent& first, 107558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const ui::TouchEvent& second) { 108558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (first.type() != second.type()) 109558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return false; 110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (first.location() != second.location()) 111558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return false; 112558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (first.touch_id() != second.touch_id()) 113558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return false; 114558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (second.time_stamp().InSeconds() != first.time_stamp().InSeconds()) 115558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return false; 116558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return true; 117558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 118558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 119558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool EventListIsSubset(const ScopedVector<ui::TouchEvent>& subset, 120558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const ScopedVector<ui::TouchEvent>& set) { 121558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (subset.size() > set.size()) 122558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return false; 123558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch for (size_t i = 0; i < subset.size(); ++i) { 124558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const ui::TouchEvent* first = subset[i]; 125558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const ui::TouchEvent* second = set[i]; 126558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool equivalent = TouchEventsAreEquivalent(*first, *second); 127558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!equivalent) 128558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return false; 129558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 130558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 131558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return true; 132558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 133a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif // defined(USE_AURA) 134558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Expected function used for converting pinch scales to deltaY values. 136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)float PinchScaleToWheelDelta(float scale) { 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return 100.0 * log(scale); 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 140558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} // namespace 141558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class InputRouterImplTest : public testing::Test { 143558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch public: 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InputRouterImplTest() {} 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual ~InputRouterImplTest() {} 146558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 147558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch protected: 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // testing::Test 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void SetUp() OVERRIDE { 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) browser_context_.reset(new TestBrowserContext()); 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) process_.reset(new MockRenderProcessHost(browser_context_.get())); 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) client_.reset(new MockInputRouterClient()); 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ack_handler_.reset(new MockInputAckHandler()); 1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) command_line->AppendSwitch(switches::kValidateInputEventStream); 156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input_router_.reset(new InputRouterImpl(process_.get(), 157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) client_.get(), 158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ack_handler_.get(), 159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) MSG_ROUTING_NONE, 160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) config_)); 161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) client_->set_input_router(input_router()); 162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ack_handler_->set_input_router(input_router()); 163558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 164558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void TearDown() OVERRIDE { 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Process all pending tasks to avoid leaks. 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router_.reset(); 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) client_.reset(); 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) process_.reset(); 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) browser_context_.reset(); 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void SetUpForTouchAckTimeoutTest(int timeout_ms) { 176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) config_.touch_config.touch_ack_timeout_delay = 177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(timeout_ms); 178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) config_.touch_config.touch_ack_timeout_supported = true; 179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TearDown(); 180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SetUp(); 181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SimulateKeyboardEvent(WebInputEvent::Type type, bool is_shortcut) { 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebKeyboardEvent event = SyntheticWebKeyboardEventBuilder::Build(type); 185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NativeWebKeyboardEvent native_event; 186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) memcpy(&native_event, &event, sizeof(event)); 187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router_->SendKeyboardEvent( 188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) native_event, 189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::LatencyInfo(), 190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_shortcut); 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SimulateWheelEvent(float dX, float dY, int modifiers, bool precise) { 194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router_->SendWheelEvent(MouseWheelEventWithLatencyInfo( 195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyntheticWebMouseWheelEventBuilder::Build(dX, dY, modifiers, precise), 196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::LatencyInfo())); 197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SimulateMouseEvent(WebInputEvent::Type type, int x, int y) { 200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router_->SendMouseEvent(MouseEventWithLatencyInfo( 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SyntheticWebMouseEventBuilder::Build(type, x, y, 0), 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::LatencyInfo())); 203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SimulateWheelEventWithPhase(WebMouseWheelEvent::Phase phase) { 206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router_->SendWheelEvent(MouseWheelEventWithLatencyInfo( 207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyntheticWebMouseWheelEventBuilder::Build(phase), ui::LatencyInfo())); 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SimulateGestureEvent(const WebGestureEvent& gesture) { 211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router_->SendGestureEvent( 212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GestureEventWithLatencyInfo(gesture, ui::LatencyInfo())); 213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SimulateGestureEvent(WebInputEvent::Type type, 21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) WebGestureDevice sourceDevice) { 217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SimulateGestureEvent( 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyntheticWebGestureEventBuilder::Build(type, sourceDevice)); 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SimulateGestureScrollUpdateEvent(float dX, float dY, int modifiers) { 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SimulateGestureEvent( 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyntheticWebGestureEventBuilder::BuildScrollUpdate(dX, dY, modifiers)); 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 22646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SimulateGesturePinchUpdateEvent(float scale, 22746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) float anchorX, 22846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) float anchorY, 22946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int modifiers, 23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) WebGestureDevice sourceDevice) { 231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SimulateGestureEvent(SyntheticWebGestureEventBuilder::BuildPinchUpdate( 232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scale, anchorX, anchorY, modifiers, sourceDevice)); 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SimulateGestureFlingStartEvent(float velocityX, 23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) float velocityY, 23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) WebGestureDevice sourceDevice) { 238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SimulateGestureEvent( 239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyntheticWebGestureEventBuilder::BuildFling(velocityX, 240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) velocityY, 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) sourceDevice)); 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SetTouchTimestamp(base::TimeDelta timestamp) { 245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch_event_.SetTimestamp(timestamp); 246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SendTouchEvent() { 249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router_->SendTouchEvent( 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TouchEventWithLatencyInfo(touch_event_, ui::LatencyInfo())); 251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch_event_.ResetPoints(); 252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int PressTouchPoint(int x, int y) { 255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return touch_event_.PressPoint(x, y); 256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void MoveTouchPoint(int index, int x, int y) { 259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch_event_.MovePoint(index, x, y); 260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void ReleaseTouchPoint(int index) { 263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch_event_.ReleasePoint(index); 264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void CancelTouchPoint(int index) { 267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch_event_.CancelPoint(index); 268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 2695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SendInputEventACK(blink::WebInputEvent::Type type, 271558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputEventAckState ack_result) { 272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InputHostMsg_HandleInputEvent_ACK_Params ack; 273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ack.type = type; 274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ack.state = ack_result; 275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) input_router_->OnMessageReceived(InputHostMsg_HandleInputEvent_ACK(0, ack)); 276558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 277558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InputRouterImpl* input_router() const { 279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return input_router_.get(); 280558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 281558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool TouchEventQueueEmpty() const { 283c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return input_router()->touch_event_queue_.empty(); 284558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 285558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool TouchEventTimeoutEnabled() const { 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return input_router()->touch_event_queue_.IsAckTimeoutEnabled(); 288c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 290c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void Flush() const { 291c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return input_router_->Flush(); 292c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 293c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 294c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch size_t GetAndResetDidFlushCount() { 295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return client_->GetAndResetDidFlushCount(); 296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 297c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 298c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool HasPendingEvents() const { 299c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return input_router_->HasPendingEvents(); 300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnHasTouchEventHandlers(bool has_handlers) { 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input_router_->OnMessageReceived( 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ViewHostMsg_HasTouchEventHandlers(0, has_handlers)); 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnSetTouchAction(content::TouchAction touch_action) { 308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) input_router_->OnMessageReceived( 309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) InputHostMsg_SetTouchAction(0, touch_action)); 310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t GetSentMessageCountAndResetSink() { 3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t count = process_->sink().message_count(); 3144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) process_->sink().ClearMessages(); 3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return count; 316558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void RunTasksAndWait(base::TimeDelta delay) { 319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FROM_HERE, base::MessageLoop::QuitClosure(), delay); 321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::MessageLoop::current()->Run(); 322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) InputRouterImpl::Config config_; 325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<MockRenderProcessHost> process_; 326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<MockInputRouterClient> client_; 327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<MockInputAckHandler> ack_handler_; 328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<InputRouterImpl> input_router_; 329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::MessageLoopForUI message_loop_; 332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyntheticWebTouchEvent touch_event_; 333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<TestBrowserContext> browser_context_; 335558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}; 336558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, CoalescesRangeSelection) { 33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) input_router_->SendInput(scoped_ptr<IPC::Message>( 33958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new InputMsg_SelectRange(0, gfx::Point(1, 2), gfx::Point(3, 4)))); 340558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ExpectIPCMessageWithArg2<InputMsg_SelectRange>( 341558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch process_->sink().GetMessageAt(0), 342558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::Point(1, 2), 343558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::Point(3, 4)); 3444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1u, GetSentMessageCountAndResetSink()); 345558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 346558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Send two more messages without acking. 34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) input_router_->SendInput(scoped_ptr<IPC::Message>( 34858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new InputMsg_SelectRange(0, gfx::Point(5, 6), gfx::Point(7, 8)))); 3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 350558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 35158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) input_router_->SendInput(scoped_ptr<IPC::Message>( 35258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new InputMsg_SelectRange(0, gfx::Point(9, 10), gfx::Point(11, 12)))); 3534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 354558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 355558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Now ack the first message. 356558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch { 357558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_ptr<IPC::Message> response(new ViewHostMsg_SelectRange_ACK(0)); 358558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch input_router_->OnMessageReceived(*response); 359558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 360558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 361558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Verify that the two messages are coalesced into one message. 362558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ExpectIPCMessageWithArg2<InputMsg_SelectRange>( 363558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch process_->sink().GetMessageAt(0), 364558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::Point(9, 10), 365558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::Point(11, 12)); 3664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1u, GetSentMessageCountAndResetSink()); 367558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 368558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Acking the coalesced msg should not send any more msg. 369558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch { 370558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_ptr<IPC::Message> response(new ViewHostMsg_SelectRange_ACK(0)); 371558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch input_router_->OnMessageReceived(*response); 372558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 3734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 374558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 375558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, CoalescesCaretMove) { 37758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) input_router_->SendInput( 37858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(1, 2)))); 379558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ExpectIPCMessageWithArg1<InputMsg_MoveCaret>( 380558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch process_->sink().GetMessageAt(0), gfx::Point(1, 2)); 3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1u, GetSentMessageCountAndResetSink()); 382558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 383558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Send two more messages without acking. 38458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) input_router_->SendInput( 38558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(5, 6)))); 3864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 387558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) input_router_->SendInput( 38958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(9, 10)))); 3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 391558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 392558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Now ack the first message. 393558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch { 394558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_ptr<IPC::Message> response(new ViewHostMsg_MoveCaret_ACK(0)); 395558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch input_router_->OnMessageReceived(*response); 396558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 397558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 398558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Verify that the two messages are coalesced into one message. 399558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ExpectIPCMessageWithArg1<InputMsg_MoveCaret>( 400558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch process_->sink().GetMessageAt(0), gfx::Point(9, 10)); 4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1u, GetSentMessageCountAndResetSink()); 402558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 403558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Acking the coalesced msg should not send any more msg. 404558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch { 405558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_ptr<IPC::Message> response(new ViewHostMsg_MoveCaret_ACK(0)); 406558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch input_router_->OnMessageReceived(*response); 407558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 409558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 410558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, HandledInputEvent) { 412558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch client_->set_filter_state(INPUT_EVENT_ACK_STATE_CONSUMED); 413558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 414558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Simulate a keyboard event. 4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false); 416558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 417558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Make sure no input event is sent to the renderer. 4184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 419558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 420558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // OnKeyboardEventAck should be triggered without actual ack. 4214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 422558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 423558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // As the event was acked already, keyboard event queue should be 424558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // empty. 425558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_EQ(NULL, input_router_->GetLastKeyboardEvent()); 426558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 427558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, ClientCanceledKeyboardEvent) { 4294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client_->set_filter_state(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); 430558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 4314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Simulate a keyboard event that has no consumer. 4324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false); 433558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 434558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Make sure no input event is sent to the renderer. 4354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 4364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 4374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Simulate a keyboard event that should be dropped. 4404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client_->set_filter_state(INPUT_EVENT_ACK_STATE_UNKNOWN); 4414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false); 4424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Make sure no input event is sent to the renderer, and no ack is sent. 4444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, GetSentMessageCountAndResetSink()); 4454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 446558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 447558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, ShortcutKeyboardEvent) { 4494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SimulateKeyboardEvent(WebInputEvent::RawKeyDown, true); 450558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(GetIsShortcutFromHandleInputEventMessage( 451558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch process_->sink().GetMessageAt(0))); 452558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 453558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch process_->sink().ClearMessages(); 454558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false); 456558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_FALSE(GetIsShortcutFromHandleInputEventMessage( 457558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch process_->sink().GetMessageAt(0))); 458558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 459558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, NoncorrespondingKeyEvents) { 4614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false); 462558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 463558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::KeyUp, 464558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(ack_handler_->unexpected_event_ack_called()); 466558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 467558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 468558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Tests ported from RenderWidgetHostTest -------------------------------------- 469558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, HandleKeyEventsWeSent) { 471558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Simulate a keyboard event. 4724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SimulateKeyboardEvent(WebInputEvent::RawKeyDown, false); 473558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ASSERT_TRUE(input_router_->GetLastKeyboardEvent()); 474558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(WebInputEvent::RawKeyDown, 475558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch input_router_->GetLastKeyboardEvent()->type); 476558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 477558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Make sure we sent the input event to the renderer. 478558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( 479558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputMsg_HandleInputEvent::ID)); 480558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch process_->sink().ClearMessages(); 481558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 482558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Send the simulated response from the renderer back. 483558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::RawKeyDown, 484558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 48658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(WebInputEvent::RawKeyDown, 48758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ack_handler_->acked_keyboard_event().type); 488558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 489558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, IgnoreKeyEventsWeDidntSend) { 491558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Send a simulated, unrequested key response. We should ignore this. 492558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::RawKeyDown, 493558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 494558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 496558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 497558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, CoalescesWheelEvents) { 499558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Simulate wheel events. 500558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SimulateWheelEvent(0, -5, 0, false); // sent directly 501558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SimulateWheelEvent(0, -10, 0, false); // enqueued 502558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SimulateWheelEvent(8, -6, 0, false); // coalesced into previous event 503558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SimulateWheelEvent(9, -7, 1, false); // enqueued, different modifiers 504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SimulateWheelEvent(0, -10, 0, false); // enqueued, different modifiers 505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Explicitly verify that PhaseEnd isn't coalesced to avoid bugs like 506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // https://crbug.com/154740. 507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SimulateWheelEventWithPhase(WebMouseWheelEvent::PhaseEnded); // enqueued 508558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 509558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Check that only the first event was sent. 510558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( 511558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputMsg_HandleInputEvent::ID)); 512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const WebInputEvent* input_event = 513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); 514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); 515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const WebMouseWheelEvent* wheel_event = 516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<const WebMouseWheelEvent*>(input_event); 517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0, wheel_event->deltaX); 518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(-5, wheel_event->deltaY); 5194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 520558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Check that the ACK sends the second message immediately. 522558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::MouseWheel, 523558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_CONSUMED); 524558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // The coalesced events can queue up a delayed ack 525558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // so that additional input events can be processed before 526558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // we turn off coalescing. 527558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::MessageLoop::current()->RunUntilIdle(); 5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 529558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( 530558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputMsg_HandleInputEvent::ID)); 531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); 532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); 533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); 534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(8, wheel_event->deltaX); 535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(-10 + -6, wheel_event->deltaY); // coalesced 5364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 537558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Ack the second event (which had the third coalesced into it). 539558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::MouseWheel, 540558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_CONSUMED); 541558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::MessageLoop::current()->RunUntilIdle(); 5424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 543558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( 544558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputMsg_HandleInputEvent::ID)); 545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); 546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); 547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); 548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(9, wheel_event->deltaX); 549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(-7, wheel_event->deltaY); 5504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 551558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Ack the fourth event. 553558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::MouseWheel, 554558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_CONSUMED); 555558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::MessageLoop::current()->RunUntilIdle(); 5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE( 558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) process_->sink().GetUniqueMessageMatching(InputMsg_HandleInputEvent::ID)); 559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); 560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); 561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); 562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0, wheel_event->deltaX); 563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(-10, wheel_event->deltaY); 5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 565558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Ack the fifth event. 567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED); 568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE( 571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) process_->sink().GetUniqueMessageMatching(InputMsg_HandleInputEvent::ID)); 572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); 573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); 574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); 575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0, wheel_event->deltaX); 576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0, wheel_event->deltaY); 577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(WebMouseWheelEvent::PhaseEnded, wheel_event->phase); 5784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 579558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // After the final ack, the queue should be empty. 581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED); 582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 5844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 585558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 586558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 587558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Tests that touch-events are queued properly. 588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchEventQueue) { 5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnHasTouchEventHandlers(true); 5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 591558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PressTouchPoint(1, 1); 592558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendTouchEvent(); 5934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(client_->GetAndResetFilterEventCalled()); 5944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 5954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TouchEventQueueEmpty()); 596558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 597558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // The second touch should not be sent since one is already in queue. 598558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MoveTouchPoint(0, 5, 5); 599558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendTouchEvent(); 6004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(client_->GetAndResetFilterEventCalled()); 6014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 6024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TouchEventQueueEmpty()); 603558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 604558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Receive an ACK for the first touch-event. 605558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::TouchStart, 606558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_CONSUMED); 6074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TouchEventQueueEmpty()); 6084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 609558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(WebInputEvent::TouchStart, 61058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ack_handler_->acked_touch_event().event.type); 6114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 612558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 613558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::TouchMove, 614558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_CONSUMED); 6154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(TouchEventQueueEmpty()); 6164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 617558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(WebInputEvent::TouchMove, 61858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ack_handler_->acked_touch_event().event.type); 6194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 620558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 621558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that the touch-queue is emptied after a page stops listening for touch 6231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// events and the outstanding ack is received. 624a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchEventQueueFlush) { 6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnHasTouchEventHandlers(true); 626558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(client_->has_touch_handler()); 6274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 6284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(TouchEventQueueEmpty()); 629558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 630558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(input_router_->ShouldForwardTouchEvent()); 631558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 632558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Send a touch-press event. 633558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PressTouchPoint(1, 1); 634558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendTouchEvent(); 6351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MoveTouchPoint(0, 2, 2); 6361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MoveTouchPoint(0, 3, 3); 6374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TouchEventQueueEmpty()); 6384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 639558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 6401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The page stops listening for touch-events. Note that flushing is deferred 6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // until the outstanding ack is received. 6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnHasTouchEventHandlers(false); 643558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_FALSE(client_->has_touch_handler()); 6444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(TouchEventQueueEmpty()); 6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(input_router_->ShouldForwardTouchEvent()); 6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // After the ack, the touch-event queue should be empty, and none of the 6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // flushed touch-events should have been sent to the renderer. 6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 6524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(TouchEventQueueEmpty()); 653558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_FALSE(input_router_->ShouldForwardTouchEvent()); 654558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 655558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 656a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA) 657558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Tests that the acked events have correct state. (ui::Events are used only on 658558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// windows and aura) 659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, AckedTouchEventState) { 660558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true)); 6614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 6624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(TouchEventQueueEmpty()); 663558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(input_router_->ShouldForwardTouchEvent()); 664558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 665558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Send a bunch of events, and make sure the ACKed events are correct. 666558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ScopedVector<ui::TouchEvent> expected_events; 667558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 668558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Use a custom timestamp for all the events to test that the acked events 669558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // have the same timestamp; 670558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::TimeDelta timestamp = base::Time::NowFromSystemTime() - base::Time(); 671558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch timestamp -= base::TimeDelta::FromSeconds(600); 672558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 673558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Press the first finger. 674558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PressTouchPoint(1, 1); 675558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SetTouchTimestamp(timestamp); 676558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendTouchEvent(); 6774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 678558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_PRESSED, 679558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::Point(1, 1), 0, timestamp)); 680558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 681558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Move the finger. 682558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch timestamp += base::TimeDelta::FromSeconds(10); 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MoveTouchPoint(0, 500, 500); 684558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SetTouchTimestamp(timestamp); 685558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendTouchEvent(); 6864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TouchEventQueueEmpty()); 687558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED, 6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point(500, 500), 0, timestamp)); 689558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 690558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Now press a second finger. 691558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch timestamp += base::TimeDelta::FromSeconds(10); 692558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PressTouchPoint(2, 2); 693558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SetTouchTimestamp(timestamp); 694558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendTouchEvent(); 6954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TouchEventQueueEmpty()); 696558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_PRESSED, 697558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::Point(2, 2), 1, timestamp)); 698558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 699558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Move both fingers. 700558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch timestamp += base::TimeDelta::FromSeconds(10); 701558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MoveTouchPoint(0, 10, 10); 702558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MoveTouchPoint(1, 20, 20); 703558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SetTouchTimestamp(timestamp); 704558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendTouchEvent(); 7054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TouchEventQueueEmpty()); 706558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED, 707558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::Point(10, 10), 0, timestamp)); 708558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED, 709558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::Point(20, 20), 1, timestamp)); 710558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 711558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Receive the ACKs and make sure the generated events from the acked events 712558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // are correct. 713558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch WebInputEvent::Type acks[] = { WebInputEvent::TouchStart, 714558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch WebInputEvent::TouchMove, 715558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch WebInputEvent::TouchStart, 716558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch WebInputEvent::TouchMove }; 717558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 718558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch TouchEventCoordinateSystem coordinate_system = LOCAL_COORDINATES; 719558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if !defined(OS_WIN) 720558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch coordinate_system = SCREEN_COORDINATES; 721558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 722558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch for (size_t i = 0; i < arraysize(acks); ++i) { 723558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(acks[i], 724558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 72558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(acks[i], ack_handler_->acked_touch_event().event.type); 726558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ScopedVector<ui::TouchEvent> acked; 727558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 728558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MakeUITouchEventsFromWebTouchEvents( 72958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ack_handler_->acked_touch_event(), &acked, coordinate_system); 730558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool success = EventListIsSubset(acked, expected_events); 731558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(success) << "Failed on step: " << i; 732558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!success) 733558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch break; 734558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_events.erase(expected_events.begin(), 735558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_events.begin() + acked.size()); 736558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 737558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 7384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(TouchEventQueueEmpty()); 739558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(0U, expected_events.size()); 740558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 741a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif // defined(USE_AURA) 742558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 743a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, UnhandledWheelEvent) { 744558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Simulate wheel events. 745558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SimulateWheelEvent(0, -5, 0, false); // sent directly 746558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SimulateWheelEvent(0, -10, 0, false); // enqueued 747558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 748558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Check that only the first event was sent. 749558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( 750558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputMsg_HandleInputEvent::ID)); 7514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 752558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 753558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Indicate that the wheel event was unhandled. 754558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SendInputEventACK(WebInputEvent::MouseWheel, 755558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 756558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 757558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Check that the correct unhandled wheel event was received. 7584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 75958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_handler_->ack_state()); 76058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5); 761558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 762558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Check that the second event was sent. 763558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( 764558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InputMsg_HandleInputEvent::ID)); 7654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 766558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 767558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Check that the correct unhandled wheel event was received. 76858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5); 769558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 770558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 771a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchTypesIgnoringAck) { 7725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnHasTouchEventHandlers(true); 77346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Only acks for TouchCancel should always be ignored. 77446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition( 77546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetEventWithType(WebInputEvent::TouchStart))); 77646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition( 77746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetEventWithType(WebInputEvent::TouchMove))); 77846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition( 77946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetEventWithType(WebInputEvent::TouchEnd))); 7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 78146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Precede the TouchCancel with an appropriate TouchStart; 78246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PressTouchPoint(1, 1); 78346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SendTouchEvent(); 78446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 78546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_EQ(1U, GetSentMessageCountAndResetSink()); 78646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_EQ(1U, ack_handler_->GetAndResetAckCount()); 78746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_EQ(0, client_->in_flight_event_count()); 788f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 78946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The TouchCancel ack is always ignored. 79046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CancelTouchPoint(0); 79146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SendTouchEvent(); 79246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 79346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 79446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, client_->in_flight_event_count()); 79546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(HasPendingEvents()); 79646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SendInputEventACK(WebInputEvent::TouchCancel, 79746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 79846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 79946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 80046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(HasPendingEvents()); 801f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 803a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, GestureTypesIgnoringAck) { 804a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // We test every gesture type, ensuring that the stream of gestures is valid. 805a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const int kEventTypesLength = 29; 806a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::Type eventTypes[kEventTypesLength] = { 807a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapDown, 808a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureShowPress, 809a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapCancel, 810a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureScrollBegin, 811a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureFlingStart, 812a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureFlingCancel, 813a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapDown, 814a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTap, 815a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapDown, 816a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureLongPress, 817a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapCancel, 818a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureLongTap, 819a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapDown, 820a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapUnconfirmed, 821a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapCancel, 822a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapDown, 823a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureDoubleTap, 824a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapDown, 825a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapCancel, 826a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTwoFingerTap, 827a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapDown, 828a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureTapCancel, 829a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureScrollBegin, 830a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureScrollUpdate, 831a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureScrollUpdateWithoutPropagation, 832a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GesturePinchBegin, 833a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GesturePinchUpdate, 834a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GesturePinchEnd, 835a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::GestureScrollEnd}; 836a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (int i = 0; i < kEventTypesLength; ++i) { 837a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebInputEvent::Type type = eventTypes[i]; 8385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!WebInputEventTraits::IgnoresAckDisposition(GetEventWithType(type))) { 83946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SimulateGestureEvent(type, blink::WebGestureDeviceTouchscreen); 840a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 841a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 842a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1, client_->in_flight_event_count()); 843c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(HasPendingEvents()); 844a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 845a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 846a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 847a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 848a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0, client_->in_flight_event_count()); 849c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(HasPendingEvents()); 850f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) continue; 851a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 852f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 85346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SimulateGestureEvent(type, blink::WebGestureDeviceTouchscreen); 854f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 855f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, client_->in_flight_event_count()); 857c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(HasPendingEvents()); 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(InputRouterImplTest, MouseTypesIgnoringAck) { 8625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int start_type = static_cast<int>(WebInputEvent::MouseDown); 8635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int end_type = static_cast<int>(WebInputEvent::ContextMenu); 8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_LT(start_type, end_type); 8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int i = start_type; i <= end_type; ++i) { 8665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::Type type = static_cast<WebInputEvent::Type>(i); 8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int expected_in_flight_event_count = 8685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebInputEventTraits::IgnoresAckDisposition(GetEventWithType(type)) ? 0 8695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : 1; 8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Note: Mouse event acks are never forwarded to the ack handler, so the key 8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // result here is that ignored ack types don't affect the in-flight count. 8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SimulateMouseEvent(type, 0, 0); 8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_in_flight_event_count, client_->in_flight_event_count()); 8775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (expected_in_flight_event_count) { 8785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SendInputEventACK(type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 8795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 8805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 8815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(0, client_->in_flight_event_count()); 8825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Guard against breaking changes to the list of ignored event ack types in 8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// |WebInputEventTraits::IgnoresAckDisposition|. 8885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(InputRouterImplTest, RequiredEventAckTypes) { 8895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const WebInputEvent::Type kRequiredEventAckTypes[] = { 8905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::MouseMove, 8915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::MouseWheel, 8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::RawKeyDown, 8935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::KeyDown, 8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::KeyUp, 8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::Char, 8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::GestureScrollUpdate, 8975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::GestureFlingStart, 8985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::GestureFlingCancel, 8995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::GesturePinchUpdate, 9005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::TouchStart, 9015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebInputEvent::TouchMove 9025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < arraysize(kRequiredEventAckTypes); ++i) { 9045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const WebInputEvent::Type required_ack_type = kRequiredEventAckTypes[i]; 9055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_FALSE(WebInputEventTraits::IgnoresAckDisposition( 9065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetEventWithType(required_ack_type))); 907f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 908f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 909f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 910f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Test that GestureShowPress, GestureTapDown and GestureTapCancel events don't 911f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// wait for ACKs. 912a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, GestureTypesIgnoringAckInterleaved) { 913f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Interleave a few events that do and do not ignore acks, ensuring that 914f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // ack-ignoring events aren't dispatched until all prior events which observe 915f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // their ack disposition have been dispatched. 916a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 917a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 91846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 919a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(1U, GetSentMessageCountAndResetSink()); 920a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 921a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0, client_->in_flight_event_count()); 922a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 923a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollUpdate, 92446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 925f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_EQ(1U, GetSentMessageCountAndResetSink()); 926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 9275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, client_->in_flight_event_count()); 928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureTapDown, 93046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 931f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 932f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 9335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, client_->in_flight_event_count()); 934f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 935a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollUpdate, 93646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 937f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 938f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 939f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 940f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureShowPress, 94146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 942f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 943f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 944f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 945a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollUpdate, 94646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 947f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureTapCancel, 95146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 952f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 953f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 954f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 9555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Now ack each ack-respecting event. Ack-ignoring events should not be 9565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // dispatched until all prior events which observe ack disposition have been 9575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // fired, at which point they should be sent immediately. They should also 9585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // have no effect on the in-flight event count. 959a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::GestureScrollUpdate, 960f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 961f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2U, GetSentMessageCountAndResetSink()); 962f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2U, ack_handler_->GetAndResetAckCount()); 9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, client_->in_flight_event_count()); 964f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 965a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::GestureScrollUpdate, 966f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 967f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2U, GetSentMessageCountAndResetSink()); 968f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2U, ack_handler_->GetAndResetAckCount()); 9695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, client_->in_flight_event_count()); 970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 971a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::GestureScrollUpdate, 972f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 973f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 974f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2U, ack_handler_->GetAndResetAckCount()); 9755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, client_->in_flight_event_count()); 976f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 977f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 978f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Test that GestureShowPress events don't get out of order due to 979f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// ignoring their acks. 980a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, GestureShowPressIsInOrder) { 981a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 98246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 983a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 984a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 985a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 986a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 9875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // GesturePinchBegin ignores its ack. 9885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GesturePinchBegin, 98946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 9915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 992f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 993a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // GesturePinchUpdate waits for an ack. 994effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // This also verifies that GesturePinchUpdates for touchscreen are sent 995effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // to the renderer (in contrast to the TrackpadPinchUpdate test). 9965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GesturePinchUpdate, 99746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 998f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 999f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1000f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1001f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureShowPress, 100246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1003f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1004f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The ShowPress, though it ignores ack, is still stuck in the queue 10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // behind the PinchUpdate which requires an ack. 1006f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1007f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1008f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureShowPress, 100946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1010f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1011f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // ShowPress has entered the queue. 1012f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1013f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 10145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SendInputEventACK(WebInputEvent::GesturePinchUpdate, 10155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1016f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Now that the Tap has been ACKed, the ShowPress events should receive 10175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // synthetic acks, and fire immediately. 1018f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2U, GetSentMessageCountAndResetSink()); 1019f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(3U, ack_handler_->GetAndResetAckCount()); 1020f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 1021f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1022010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Test that touch ack timeout behavior is properly toggled by view update flags 1023010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// and allowed touch actions. 1024a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchAckTimeoutConfigured) { 1025010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const int timeout_ms = 1; 1026010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SetUpForTouchAckTimeoutTest(timeout_ms); 1027a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(TouchEventTimeoutEnabled()); 1028a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1029a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Verify that the touch ack timeout fires upon the delayed ack. 1030a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1031a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1032a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1033a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1034010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RunTasksAndWait(base::TimeDelta::FromMilliseconds(timeout_ms + 1)); 1035a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1036a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The timed-out event should have been ack'ed. 1037a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1038a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1039a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1040a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ack'ing the timed-out event should fire a TouchCancel. 1041a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 1042a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1043a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1044a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1045a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The remainder of the touch sequence should be dropped. 1046a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReleaseTouchPoint(0); 1047a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1048a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1049a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1050a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(TouchEventTimeoutEnabled()); 1051a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1052a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // A fixed page scale or mobile viewport should disable the touch timeout. 1053a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router()->OnViewUpdated(InputRouter::FIXED_PAGE_SCALE); 1054a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(TouchEventTimeoutEnabled()); 1055a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1056a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router()->OnViewUpdated(InputRouter::VIEW_FLAGS_NONE); 1057a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(TouchEventTimeoutEnabled()); 1058a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1059a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router()->OnViewUpdated(InputRouter::MOBILE_VIEWPORT); 1060a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(TouchEventTimeoutEnabled()); 1061a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1062a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router()->OnViewUpdated(InputRouter::MOBILE_VIEWPORT | 1063a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InputRouter::FIXED_PAGE_SCALE); 1064a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(TouchEventTimeoutEnabled()); 1065a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1066a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) input_router()->OnViewUpdated(InputRouter::VIEW_FLAGS_NONE); 1067a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(TouchEventTimeoutEnabled()); 1068a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1069a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TOUCH_ACTION_NONE (and no other touch-action) should disable the timeout. 1070a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnHasTouchEventHandlers(true); 1071a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1072a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1073a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnSetTouchAction(TOUCH_ACTION_PAN_Y); 1074a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(TouchEventTimeoutEnabled()); 1075a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReleaseTouchPoint(0); 1076a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1077a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 1078a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); 1079a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1080a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1081a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1082a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnSetTouchAction(TOUCH_ACTION_NONE); 1083a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(TouchEventTimeoutEnabled()); 1084a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReleaseTouchPoint(0); 1085a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1086a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 1087a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); 1088a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1089a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // As the touch-action is reset by a new touch sequence, the timeout behavior 1090a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // should be restored. 1091a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1092a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1093a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(TouchEventTimeoutEnabled()); 1094a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1095a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1096a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that a touch sequenced preceded by TOUCH_ACTION_NONE is not affected by 1097a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// the touch timeout. 1098a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(InputRouterImplTest, 1099a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TouchAckTimeoutDisabledForTouchSequenceAfterTouchActionNone) { 1100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const int timeout_ms = 1; 1101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SetUpForTouchAckTimeoutTest(timeout_ms); 1102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(TouchEventTimeoutEnabled()); 1103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnHasTouchEventHandlers(true); 1104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Start a touch sequence. 1106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 11081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TOUCH_ACTION_NONE should disable the timeout. 1111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnSetTouchAction(TOUCH_ACTION_NONE); 1112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 11131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(TouchEventTimeoutEnabled()); 1115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 11161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MoveTouchPoint(0, 1, 1); 1117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(TouchEventTimeoutEnabled()); 1119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 11211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Delay the move ack. The timeout should not fire. 1122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RunTasksAndWait(base::TimeDelta::FromMilliseconds(timeout_ms + 1)); 1123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 11251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); 1126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 11281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // End the touch sequence. 1129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReleaseTouchPoint(0); 1130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); 11321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(TouchEventTimeoutEnabled()); 11331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ack_handler_->GetAndResetAckCount(); 11341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetSentMessageCountAndResetSink(); 1135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 11361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Start another touch sequence. This should restore the touch timeout. 1137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(TouchEventTimeoutEnabled()); 1140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 11411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Wait for the touch ack timeout to fire. 1144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RunTasksAndWait(base::TimeDelta::FromMilliseconds(timeout_ms + 1)); 1145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that TouchActionFilter::ResetTouchAction is called before the 1149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// first touch event for a touch sequence reaches the renderer. 1150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchActionResetBeforeEventReachesRenderer) { 1151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnHasTouchEventHandlers(true); 1152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sequence 1. 1154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnSetTouchAction(TOUCH_ACTION_NONE); 1157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MoveTouchPoint(0, 50, 50); 1158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReleaseTouchPoint(0); 1160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sequence 2. 1163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MoveTouchPoint(0, 50, 50); 1166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReleaseTouchPoint(0); 1168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 1171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchMove, INPUT_EVENT_ACK_STATE_CONSUMED); 1172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ensure touch action is still none, as the next touch start hasn't been 1174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // acked yet. ScrollBegin and ScrollEnd don't require acks. 1175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(3U, GetSentMessageCountAndResetSink()); 1176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 117746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollEnd, 118046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This allows the next touch sequence to start. 1184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); 1185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ensure touch action has been set to auto, as a new touch sequence has 1187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // started. 1188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 1189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchMove, INPUT_EVENT_ACK_STATE_CONSUMED); 1190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(3U, GetSentMessageCountAndResetSink()); 1191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 119246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollEnd, 119546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); 1198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that TouchActionFilter::ResetTouchAction is called when a new touch 1201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// sequence has no consumer. 1202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchActionResetWhenTouchHasNoConsumer) { 1203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnHasTouchEventHandlers(true); 1204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sequence 1. 1206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MoveTouchPoint(0, 50, 50); 1209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendTouchEvent(); 1210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnSetTouchAction(TOUCH_ACTION_NONE); 1211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 1212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchMove, INPUT_EVENT_ACK_STATE_CONSUMED); 1213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReleaseTouchPoint(0); 1215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sequence 2 1218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MoveTouchPoint(0, 50, 50); 1221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendTouchEvent(); 1222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ReleaseTouchPoint(0); 1223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendTouchEvent(); 1224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ensure we have touch-action:none. ScrollBegin and ScrollEnd don't require 1226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // acks. 1227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(3U, GetSentMessageCountAndResetSink()); 1228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 122946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollEnd, 123246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); 1236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, 1237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); 1238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Ensure touch action has been set to auto, as the touch had no consumer. 1240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 124246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollEnd, 124546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that TouchActionFilter::ResetTouchAction is called when the touch 1250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// handler is removed. 1251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(InputRouterImplTest, TouchActionResetWhenTouchHandlerRemoved) { 1252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Touch sequence with touch handler. 1253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnHasTouchEventHandlers(true); 1254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PressTouchPoint(1, 1); 1255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendTouchEvent(); 1256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MoveTouchPoint(0, 50, 50); 1257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendTouchEvent(); 1258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnSetTouchAction(TOUCH_ACTION_NONE); 1259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ReleaseTouchPoint(0); 1260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendTouchEvent(); 1261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Ensure we have touch-action:none, suppressing scroll events. 1264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 1265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchMove, 1267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 127046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchEnd, 1274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollEnd, 127646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Sequence without a touch handler. Note that in this case, the view may not 1280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // necessarily forward touches to the router (as no touch handler exists). 1281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnHasTouchEventHandlers(false); 1282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Ensure touch action has been set to auto, as the touch handler has been 1284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // removed. 1285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 128646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureScrollEnd, 128946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that the double tap gesture depends on the touch action of the first 1294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// tap. 1295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(InputRouterImplTest, DoubleTapGestureDependsOnFirstTap) { 1296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnHasTouchEventHandlers(true); 1297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sequence 1. 1299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnSetTouchAction(TOUCH_ACTION_NONE); 1302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 1303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReleaseTouchPoint(0); 1305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sequence 2 1308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PressTouchPoint(1, 1); 1309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendTouchEvent(); 1310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // First tap. 1312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(2U, GetSentMessageCountAndResetSink()); 1313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureTapDown, 131446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The GestureTapUnconfirmed is converted into a tap, as the touch action is 13185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // none. 1319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureTapUnconfirmed, 132046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 13215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 13225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // This test will become invalid if GestureTap stops requiring an ack. 13235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition( 13245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetEventWithType(WebInputEvent::GestureTap))); 13255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(2, client_->in_flight_event_count()); 1326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::GestureTap, 1327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) INPUT_EVENT_ACK_STATE_CONSUMED); 13285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(1, client_->in_flight_event_count()); 1329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This tap gesture is dropped, since the GestureTapUnconfirmed was turned 1331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // into a tap. 133246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureTap, 133346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); 1337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendInputEventACK(WebInputEvent::TouchStart, 1338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); 1339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Second Tap. 1341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureTapDown, 134346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Although the touch-action is now auto, the double tap still won't be 1347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // dispatched, because the first tap occured when the touch-action was none. 1348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SimulateGestureEvent(WebInputEvent::GestureDoubleTap, 134946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This test will become invalid if GestureDoubleTap stops requiring an ack. 13515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition( 13525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetEventWithType(WebInputEvent::GestureDoubleTap))); 13535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(1, client_->in_flight_event_count()); 13545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SendInputEventACK(WebInputEvent::GestureTap, INPUT_EVENT_ACK_STATE_CONSUMED); 1355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0, client_->in_flight_event_count()); 1356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1358c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Test that the router will call the client's |DidFlush| after all events have 1359c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// been dispatched following a call to |Flush|. 1360c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(InputRouterImplTest, InputFlush) { 1361c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(HasPendingEvents()); 1362c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Flushing an empty router should immediately trigger DidFlush. 1364c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Flush(); 1365c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(1U, GetAndResetDidFlushCount()); 1366c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(HasPendingEvents()); 1367c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1368c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Queue a TouchStart. 1369c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OnHasTouchEventHandlers(true); 1370c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch PressTouchPoint(1, 1); 1371c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SendTouchEvent(); 1372c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(HasPendingEvents()); 1373c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1374c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // DidFlush should be called only after the event is ack'ed. 1375c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Flush(); 1376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(0U, GetAndResetDidFlushCount()); 1377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SendInputEventACK(WebInputEvent::TouchStart, 1378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1379c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(1U, GetAndResetDidFlushCount()); 1380c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1381c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Ensure different types of enqueued events will prevent the DidFlush call 1382c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // until all such events have been fully dispatched. 1383c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MoveTouchPoint(0, 50, 50); 1384c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SendTouchEvent(); 1385c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(HasPendingEvents()); 1386c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 138746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1388c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SimulateGestureEvent(WebInputEvent::GestureScrollUpdate, 138946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 13905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SimulateGestureEvent(WebInputEvent::GesturePinchBegin, 139146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 13925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SimulateGestureEvent(WebInputEvent::GesturePinchUpdate, 139346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchscreen); 1394c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Flush(); 1395c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(0U, GetAndResetDidFlushCount()); 1396c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1397c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Repeated flush calls should have no effect. 1398c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Flush(); 1399c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(0U, GetAndResetDidFlushCount()); 1400c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1401c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // There are still pending gestures. 1402c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SendInputEventACK(WebInputEvent::TouchMove, 1403c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1404c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(0U, GetAndResetDidFlushCount()); 1405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(HasPendingEvents()); 1406c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1407c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // One more gesture to go. 14085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SendInputEventACK(WebInputEvent::GestureScrollUpdate, 1409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch INPUT_EVENT_ACK_STATE_CONSUMED); 1410c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(0U, GetAndResetDidFlushCount()); 1411c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(HasPendingEvents()); 1412c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1413c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The final ack'ed gesture should trigger the DidFlush. 14145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SendInputEventACK(WebInputEvent::GesturePinchUpdate, 1415c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch INPUT_EVENT_ACK_STATE_CONSUMED); 1416c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(1U, GetAndResetDidFlushCount()); 1417c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(HasPendingEvents()); 1418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1419c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1420effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Test that GesturePinchUpdate is handled specially for trackpad 1421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(InputRouterImplTest, TouchpadPinchUpdate) { 1422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // GesturePinchUpdate for trackpad sends synthetic wheel events. 1423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Note that the Touchscreen case is verified as NOT doing this as 1424effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // part of the ShowPressIsInOrder test. 1425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 142646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SimulateGesturePinchUpdateEvent( 142746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1.5f, 20, 25, 0, blink::WebGestureDeviceTouchpad); 1428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify we actually sent a special wheel event to the renderer. 1430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const WebInputEvent* input_event = 1431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); 1432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); 1433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const WebMouseWheelEvent* wheel_event = 1434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<const WebMouseWheelEvent*>(input_event); 1435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(20, wheel_event->x); 1436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(25, wheel_event->y); 1437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(20, wheel_event->globalX); 1438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(25, wheel_event->globalY); 1439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(20, wheel_event->windowX); 1440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(25, wheel_event->windowY); 1441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(PinchScaleToWheelDelta(1.5), wheel_event->deltaY); 1442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0, wheel_event->deltaX); 1443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1, wheel_event->hasPreciseScrollingDeltas); 1444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1, wheel_event->wheelTicksY); 1445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0, wheel_event->wheelTicksX); 1446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Indicate that the wheel event was unhandled. 1449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendInputEventACK(WebInputEvent::MouseWheel, 1450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check that the correct unhandled pinch event was received. 1453effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type()); 1455effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_handler_->ack_state()); 1456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1.5f, ack_handler_->acked_gesture_event().data.pinchUpdate.scale); 1457effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(0, client_->in_flight_event_count()); 1458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Second a second pinch event. 146046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SimulateGesturePinchUpdateEvent( 146146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 0.3f, 20, 25, 0, blink::WebGestureDeviceTouchpad); 1462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); 1463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); 1464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); 1465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FLOAT_EQ(PinchScaleToWheelDelta(0.3f), wheel_event->deltaY); 1466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1, wheel_event->hasPreciseScrollingDeltas); 1467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(-1, wheel_event->wheelTicksY); 1468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Indicate that the wheel event was handled this time. 1471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED); 1472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check that the correct HANDLED pinch event was received. 1474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type()); 1476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, ack_handler_->ack_state()); 1477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FLOAT_EQ(0.3f, 1478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ack_handler_->acked_gesture_event().data.pinchUpdate.scale); 1479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Test that touchpad pinch events are coalesced property, with their synthetic 1482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// wheel events getting the right ACKs. 1483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(InputRouterImplTest, TouchpadPinchCoalescing) { 1484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Send the first pinch. 148546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SimulateGesturePinchUpdateEvent( 148646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1.5f, 20, 25, 0, blink::WebGestureDeviceTouchpad); 1487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify we sent the wheel event to the renderer. 1489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const WebInputEvent* input_event = 1490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); 1491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); 1492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const WebMouseWheelEvent* wheel_event = 1493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<const WebMouseWheelEvent*>(input_event); 1494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(PinchScaleToWheelDelta(1.5f), wheel_event->deltaY); 1495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1, client_->in_flight_event_count()); 1498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Send a second pinch, this should be queued in the GestureEventQueue. 150046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SimulateGesturePinchUpdateEvent( 150146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1.6f, 20, 25, 0, blink::WebGestureDeviceTouchpad); 1502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Send a third pinch, this should be coalesced into the second in the 1506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // GestureEventQueue. 150746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SimulateGesturePinchUpdateEvent( 150846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1.7f, 20, 25, 0, blink::WebGestureDeviceTouchpad); 1509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Indicate that the first wheel event was unhandled and verify the ACK. 1513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendInputEventACK(WebInputEvent::MouseWheel, 1514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type()); 1517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_handler_->ack_state()); 1518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1.5f, ack_handler_->acked_gesture_event().data.pinchUpdate.scale); 1519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify a second wheel event was sent representing the 2nd and 3rd pinch 1521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // events. 1522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1, client_->in_flight_event_count()); 1523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); 1524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); 1525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); 1526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FLOAT_EQ(PinchScaleToWheelDelta(1.6f * 1.7f), 1527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PinchScaleToWheelDelta(1.6f) + PinchScaleToWheelDelta(1.7f)); 1528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FLOAT_EQ(PinchScaleToWheelDelta(1.6f * 1.7f), wheel_event->deltaY); 1529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Indicate that the second wheel event was handled and verify the ACK. 1533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED); 1534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type()); 1536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, ack_handler_->ack_state()); 1537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FLOAT_EQ(1.6f * 1.7f, 1538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ack_handler_->acked_gesture_event().data.pinchUpdate.scale); 1539effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1540effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Test interleaving pinch and wheel events. 1542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(InputRouterImplTest, TouchpadPinchAndWheel) { 1543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Simulate queued wheel and pinch events events. 1544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Note that in practice interleaving pinch and wheel events should be rare 1545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // (eg. requires the use of a mouse and trackpad at the same time). 1546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Use the control modifier to match the synthetic wheel events so that 1548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // they're elligble for coalescing. 1549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int mod = WebInputEvent::ControlKey; 1550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Event 1: sent directly. 1552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SimulateWheelEvent(0, -5, mod, true); 1553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Event 2: enqueued in InputRouter. 1556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SimulateWheelEvent(0, -10, mod, true); 1557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Event 3: enqueued in InputRouter, not coalesced into #2. 156046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SimulateGesturePinchUpdateEvent( 156146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1.5f, 20, 25, 0, blink::WebGestureDeviceTouchpad); 1562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Event 4: enqueued in GestureEventQueue. 156546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SimulateGesturePinchUpdateEvent( 156646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1.2f, 20, 25, 0, blink::WebGestureDeviceTouchpad); 1567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Event 5: coalesced into wheel event for #3. 1570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SimulateWheelEvent(2, 0, mod, true); 1571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Send ack for #1. 1574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendInputEventACK(WebInputEvent::MouseWheel, 1575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(WebInputEvent::MouseWheel, ack_handler_->ack_event_type()); 1578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify we sent #2. 1580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(1U, process_->sink().message_count()); 1581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const WebInputEvent* input_event = 1582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); 1583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); 1584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const WebMouseWheelEvent* wheel_event = 1585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<const WebMouseWheelEvent*>(input_event); 1586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0, wheel_event->deltaX); 1587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(-10, wheel_event->deltaY); 1588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(mod, wheel_event->modifiers); 1589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Send ack for #2. 1592010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendInputEventACK(WebInputEvent::MouseWheel, 1593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1595010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(WebInputEvent::MouseWheel, ack_handler_->ack_event_type()); 1596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1597010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify we sent #3 (with #5 coalesced in). 1598010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(1U, process_->sink().message_count()); 1599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); 1600010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); 1601010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); 1602010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(2, wheel_event->deltaX); 1603010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(PinchScaleToWheelDelta(1.5f), wheel_event->deltaY); 1604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(mod, wheel_event->modifiers); 1605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1606010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1607010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Send ack for #3. 1608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendInputEventACK(WebInputEvent::MouseWheel, 1609010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1610010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1611010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type()); 1612010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1613010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify we sent #4. 1614010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(1U, process_->sink().message_count()); 1615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); 1616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); 1617010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); 1618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0, wheel_event->deltaX); 1619010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FLOAT_EQ(PinchScaleToWheelDelta(1.2f), wheel_event->deltaY); 1620010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(mod, wheel_event->modifiers); 1621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1622010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1623010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Send ack for #4. 1624010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendInputEventACK(WebInputEvent::MouseWheel, 1625010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1626010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1627010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type()); 1628010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1629010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1630010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Test proper handling of touchpad Gesture{Pinch,Scroll}Update sequences. 1631010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(InputRouterImplTest, TouchpadPinchAndScrollUpdate) { 1632e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // The first scroll should be sent immediately. 1633e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch SimulateGestureEvent(WebInputEvent::GestureScrollUpdate, 163446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchpad); 1635e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ASSERT_EQ(1U, GetSentMessageCountAndResetSink()); 1636e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_EQ(1, client_->in_flight_event_count()); 1637e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1638e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Subsequent scroll and pinch events should remain queued, coalescing as 1639e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // more trackpad events arrive. 1640e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch SimulateGestureEvent(WebInputEvent::GesturePinchUpdate, 164146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchpad); 1642e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ASSERT_EQ(0U, GetSentMessageCountAndResetSink()); 1643e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_EQ(1, client_->in_flight_event_count()); 1644e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1645e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch SimulateGestureEvent(WebInputEvent::GestureScrollUpdate, 164646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchpad); 1647e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ASSERT_EQ(0U, GetSentMessageCountAndResetSink()); 1648e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_EQ(1, client_->in_flight_event_count()); 1649e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1650e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch SimulateGestureEvent(WebInputEvent::GesturePinchUpdate, 165146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchpad); 1652e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ASSERT_EQ(0U, GetSentMessageCountAndResetSink()); 1653e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_EQ(1, client_->in_flight_event_count()); 1654e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1655e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch SimulateGestureEvent(WebInputEvent::GestureScrollUpdate, 165646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebGestureDeviceTouchpad); 1657e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ASSERT_EQ(0U, GetSentMessageCountAndResetSink()); 1658e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_EQ(1, client_->in_flight_event_count()); 1659e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1660e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Ack'ing the first scroll should trigger both the coalesced scroll and the 1661010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // coalesced pinch events (which is sent to the renderer as a wheel event). 1662e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch SendInputEventACK(WebInputEvent::GestureScrollUpdate, 1663e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch INPUT_EVENT_ACK_STATE_CONSUMED); 1664010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1665010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(2U, GetSentMessageCountAndResetSink()); 1666010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(2, client_->in_flight_event_count()); 1667e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1668e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Ack the second scroll. 1669e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch SendInputEventACK(WebInputEvent::GestureScrollUpdate, 1670e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch INPUT_EVENT_ACK_STATE_CONSUMED); 1671e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1672e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1673010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1, client_->in_flight_event_count()); 1674010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1675010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Ack the wheel event. 1676010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED); 1677010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1678010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1679e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_EQ(0, client_->in_flight_event_count()); 1680e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 1681e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1682cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test proper routing of overscroll notifications received either from 1683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// event acks or from |DidOverscroll| IPC messages. 1684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(InputRouterImplTest, OverscrollDispatch) { 1685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DidOverscrollParams overscroll; 1686cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) overscroll.accumulated_overscroll = gfx::Vector2dF(-14, 14); 1687cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) overscroll.latest_overscroll_delta = gfx::Vector2dF(-7, 0); 1688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) overscroll.current_fling_velocity = gfx::Vector2dF(-1, 0); 1689cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1690cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) input_router_->OnMessageReceived(InputHostMsg_DidOverscroll(0, overscroll)); 1691cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DidOverscrollParams client_overscroll = client_->GetAndResetOverscroll(); 1692cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(overscroll.accumulated_overscroll, 1693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) client_overscroll.accumulated_overscroll); 1694cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(overscroll.latest_overscroll_delta, 1695cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) client_overscroll.latest_overscroll_delta); 1696cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(overscroll.current_fling_velocity, 1697cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) client_overscroll.current_fling_velocity); 1698cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1699cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DidOverscrollParams wheel_overscroll; 1700cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wheel_overscroll.accumulated_overscroll = gfx::Vector2dF(7, -7); 1701cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wheel_overscroll.latest_overscroll_delta = gfx::Vector2dF(3, 0); 1702cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wheel_overscroll.current_fling_velocity = gfx::Vector2dF(1, 0); 1703cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1704cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SimulateWheelEvent(3, 0, 0, false); 1705cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InputHostMsg_HandleInputEvent_ACK_Params ack; 1706cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ack.type = WebInputEvent::MouseWheel; 1707cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ack.state = INPUT_EVENT_ACK_STATE_NOT_CONSUMED; 1708cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ack.overscroll.reset(new DidOverscrollParams(wheel_overscroll)); 1709cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) input_router_->OnMessageReceived(InputHostMsg_HandleInputEvent_ACK(0, ack)); 1710cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1711cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) client_overscroll = client_->GetAndResetOverscroll(); 1712cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(wheel_overscroll.accumulated_overscroll, 1713cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) client_overscroll.accumulated_overscroll); 1714cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(wheel_overscroll.latest_overscroll_delta, 1715cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) client_overscroll.latest_overscroll_delta); 1716cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(wheel_overscroll.current_fling_velocity, 1717cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) client_overscroll.current_fling_velocity); 1718cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1719cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1720558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} // namespace content 1721