1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file. 4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#ifndef CONTENT_BROWSER_RENDERER_HOST_INPUT_INPUT_ROUTER_IMPL_H_ 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define CONTENT_BROWSER_RENDERER_HOST_INPUT_INPUT_ROUTER_IMPL_H_ 7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include <queue> 9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/basictypes.h" 11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/memory/scoped_ptr.h" 12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/time/time.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/renderer_host/input/gesture_event_queue.h" 14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/browser/renderer_host/input/input_router.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/renderer_host/input/touch_action_filter.h" 16558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/renderer_host/input/touch_event_queue.h" 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/browser/renderer_host/input/touchpad_tap_suppression_controller.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/input/input_event_stream_validator.h" 19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/browser/native_web_keyboard_event.h" 20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)struct InputHostMsg_HandleInputEvent_ACK_Params; 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace IPC { 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class Sender; 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 27ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace ui { 28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstruct LatencyInfo; 29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace content { 32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class InputAckHandler; 34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass InputRouterClient; 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class OverscrollController; 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)struct DidOverscrollParams; 37ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// A default implementation for browser input event routing. 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class CONTENT_EXPORT InputRouterImpl 40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch : public NON_EXPORTED_BASE(InputRouter), 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public NON_EXPORTED_BASE(GestureEventQueueClient), 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public NON_EXPORTED_BASE(TouchEventQueueClient), 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public NON_EXPORTED_BASE(TouchpadTapSuppressionControllerClient) { 44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public: 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) struct CONTENT_EXPORT Config { 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Config(); 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GestureEventQueue::Config gesture_config; 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TouchEventQueue::Config touch_config; 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InputRouterImpl(IPC::Sender* sender, 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InputRouterClient* client, 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InputAckHandler* ack_handler, 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int routing_id, 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const Config& config); 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual ~InputRouterImpl(); 57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // InputRouter 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void Flush() OVERRIDE; 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual bool SendInput(scoped_ptr<IPC::Message> message) OVERRIDE; 61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void SendMouseEvent( 62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const MouseEventWithLatencyInfo& mouse_event) OVERRIDE; 63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void SendWheelEvent( 64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const MouseWheelEventWithLatencyInfo& wheel_event) OVERRIDE; 65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void SendKeyboardEvent( 66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const NativeWebKeyboardEvent& key_event, 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const ui::LatencyInfo& latency_info, 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool is_keyboard_shortcut) OVERRIDE; 69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void SendGestureEvent( 70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const GestureEventWithLatencyInfo& gesture_event) OVERRIDE; 71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void SendTouchEvent( 72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const TouchEventWithLatencyInfo& touch_event) OVERRIDE; 73ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual const NativeWebKeyboardEvent* GetLastKeyboardEvent() const OVERRIDE; 74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual bool ShouldForwardTouchEvent() const OVERRIDE; 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnViewUpdated(int view_flags) OVERRIDE; 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual bool HasPendingEvents() const OVERRIDE; 77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 78ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // IPC::Listener 79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 81ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochprivate: 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) friend class InputRouterImplTest; 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TouchpadTapSuppressionControllerClient 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SendMouseEventImmediately( 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const MouseEventWithLatencyInfo& mouse_event) OVERRIDE; 873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 88ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // TouchEventQueueClient 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SendTouchEventImmediately( 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const TouchEventWithLatencyInfo& touch_event) OVERRIDE; 91ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void OnTouchEventAck(const TouchEventWithLatencyInfo& event, 92ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch InputEventAckState ack_result) OVERRIDE; 93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // GetureEventFilterClient 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SendGestureEventImmediately( 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const GestureEventWithLatencyInfo& gesture_event) OVERRIDE; 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void OnGestureEventAck(const GestureEventWithLatencyInfo& event, 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) InputEventAckState ack_result) OVERRIDE; 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool SendMoveCaret(scoped_ptr<IPC::Message> message); 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool SendSelectRange(scoped_ptr<IPC::Message> message); 102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool Send(IPC::Message* message); 103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Filters and forwards |input_event| to the appropriate handler. 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void FilterAndSendWebInputEvent(const blink::WebInputEvent& input_event, 106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const ui::LatencyInfo& latency_info, 107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool is_keyboard_shortcut); 1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Utility routine for filtering and forwarding |input_event| to the 1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // appropriate handler. |input_event| will be offered to the overscroll 1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // controller, client and renderer, in that order. 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void OfferToHandlers(const blink::WebInputEvent& input_event, 1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const ui::LatencyInfo& latency_info, 1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool is_keyboard_shortcut); 1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Returns true if |input_event| was consumed by the overscroll controller. 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool OfferToOverscrollController(const blink::WebInputEvent& input_event, 1188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const ui::LatencyInfo& latency_info); 1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Returns true if |input_event| was consumed by the client. 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool OfferToClient(const blink::WebInputEvent& input_event, 1228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const ui::LatencyInfo& latency_info); 123ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Returns true if |input_event| was successfully sent to the renderer 1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // as an async IPC Message. 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool OfferToRenderer(const blink::WebInputEvent& input_event, 1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const ui::LatencyInfo& latency_info, 1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool is_keyboard_shortcut); 1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // A data structure that attaches some metadata to a WebMouseWheelEvent 131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // and its latency info. 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) struct QueuedWheelEvent { 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) QueuedWheelEvent(); 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) QueuedWheelEvent(const MouseWheelEventWithLatencyInfo& event, 135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool synthesized_from_pinch); 136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ~QueuedWheelEvent(); 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) MouseWheelEventWithLatencyInfo event; 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool synthesized_from_pinch; 140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Enqueue or send a mouse wheel event. 143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void SendWheelEvent(const QueuedWheelEvent& wheel_event); 144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Given a Touchpad GesturePinchUpdate event, create and send a synthetic 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // wheel event for it. 147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void SendSyntheticWheelEventForPinch( 148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GestureEventWithLatencyInfo& pinch_event); 149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 150ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // IPC message handlers 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnInputEventAck(const InputHostMsg_HandleInputEvent_ACK_Params& ack); 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnDidOverscroll(const DidOverscrollParams& params); 153ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch void OnMsgMoveCaretAck(); 154ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch void OnSelectRangeAck(); 155ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch void OnHasTouchEventHandlers(bool has_handlers); 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnSetTouchAction(TouchAction touch_action); 157ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Indicates the source of an ack provided to |ProcessInputEventAck()|. 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The source is tracked by |current_ack_source_|, which aids in ack routing. 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) enum AckSource { 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RENDERER, 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CLIENT, 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IGNORING_DISPOSITION, 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ACK_SOURCE_NONE 1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) }; 1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Note: This function may result in |this| being deleted, and as such 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // should be the last method called in any internal chain of event handling. 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void ProcessInputEventAck(blink::WebInputEvent::Type event_type, 1693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch InputEventAckState ack_result, 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const ui::LatencyInfo& latency_info, 1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AckSource ack_source); 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Dispatches the ack'ed event to |ack_handler_|. 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void ProcessKeyboardAck(blink::WebInputEvent::Type type, 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) InputEventAckState ack_result); 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Forwards a valid |next_mouse_move_| if |type| is MouseMove. 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void ProcessMouseAck(blink::WebInputEvent::Type type, 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) InputEventAckState ack_result); 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Dispatches the ack'ed event to |ack_handler_|, forwarding queued events 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // from |coalesced_mouse_wheel_events_|. 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void ProcessWheelAck(InputEventAckState ack_result, 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const ui::LatencyInfo& latency); 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Forwards the event ack to |gesture_event_queue|, potentially triggering 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // dispatch of queued gesture events. 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void ProcessGestureAck(blink::WebInputEvent::Type type, 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) InputEventAckState ack_result, 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const ui::LatencyInfo& latency); 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Forwards the event ack to |touch_event_queue_|, potentially triggering 1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // dispatch of queued touch events, or the creation of gesture events. 1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void ProcessTouchAck(InputEventAckState ack_result, 1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const ui::LatencyInfo& latency); 196ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Called when a touch timeout-affecting bit has changed, in turn toggling the 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // touch ack timeout feature of the |touch_event_queue_| as appropriate. Input 199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // to that determination includes current view properties and the allowed 200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // touch action. Note that this will only affect platforms that have a 201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // non-zero touch timeout configuration. 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void UpdateTouchAckTimeoutEnabled(); 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // If a flush has been requested, signals a completed flush to the client if 205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // all events have been dispatched (i.e., |HasPendingEvents()| is false). 206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void SignalFlushedIfNecessary(); 207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool IsInOverscrollGesture() const; 2093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 210ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int routing_id() const { return routing_id_; } 211ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 212ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IPC::Sender* sender_; 214ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch InputRouterClient* client_; 21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) InputAckHandler* ack_handler_; 216ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int routing_id_; 217ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 218ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // (Similar to |mouse_move_pending_|.) True while waiting for SelectRange_ACK. 219ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool select_range_pending_; 220ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 221ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // (Similar to |next_mouse_move_|.) The next SelectRange to send, if any. 222ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<IPC::Message> next_selection_range_; 223ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 224ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // (Similar to |mouse_move_pending_|.) True while waiting for MoveCaret_ACK. 225ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool move_caret_pending_; 226ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 227ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // (Similar to |next_mouse_move_|.) The next MoveCaret to send, if any. 228ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<IPC::Message> next_move_caret_; 229ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 230ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // True if a mouse move event was sent to the render view and we are waiting 231ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // for a corresponding InputHostMsg_HandleInputEvent_ACK message. 232ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool mouse_move_pending_; 233ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 234ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // The next mouse move event to send (only non-null while mouse_move_pending_ 235ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // is true). 236ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<MouseEventWithLatencyInfo> next_mouse_move_; 237ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 238ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // (Similar to |mouse_move_pending_|.) True if a mouse wheel event was sent 239ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // and we are waiting for a corresponding ack. 240ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool mouse_wheel_pending_; 241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) QueuedWheelEvent current_wheel_event_; 242ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 243ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // (Similar to |next_mouse_move_|.) The next mouse wheel events to send. 244ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Unlike mouse moves, mouse wheel events received while one is pending are 245ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // coalesced (by accumulating deltas) if they match the previous event in 246ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // modifiers. On the Mac, in particular, mouse wheel events are received at a 247ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // high rate; not waiting for the ack results in jankiness, and using the same 248ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // mechanism as for mouse moves (just dropping old events when multiple ones 249ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // would be queued) results in very slow scrolling. 250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typedef std::deque<QueuedWheelEvent> WheelEventQueue; 251ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WheelEventQueue coalesced_mouse_wheel_events_; 252ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 253ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // A queue of keyboard events. We can't trust data from the renderer so we 254ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // stuff key events into a queue and pop them out on ACK, feeding our copy 255ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // back to whatever unhandled handler instead of the returned version. 256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch typedef std::deque<NativeWebKeyboardEvent> KeyQueue; 257ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KeyQueue key_queue_; 258ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The time when an input event was sent to the client. 260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::TimeTicks input_event_start_time_; 261c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Cached flags from |OnViewUpdated()|, defaults to 0. 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int current_view_flags_; 264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The source of the ack within the scope of |ProcessInputEventAck()|. 2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Defaults to ACK_SOURCE_NONE. 2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AckSource current_ack_source_; 2683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 269c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Whether a call to |Flush()| has yet been accompanied by a |DidFlush()| call 270c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // to the client_ after all events have been dispatched/acked. 271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool flush_requested_; 272c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 273c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TouchEventQueue touch_event_queue_; 274c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GestureEventQueue gesture_event_queue_; 275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TouchActionFilter touch_action_filter_; 27646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) InputEventStreamValidator input_stream_validator_; 27746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) InputEventStreamValidator output_stream_validator_; 278ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(InputRouterImpl); 280ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 281ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 282ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} // namespace content 283ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // CONTENT_BROWSER_RENDERER_HOST_INPUT_INPUT_ROUTER_IMPL_H_ 285