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