1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_RENDERER_INPUT_INPUT_EVENT_FILTER_H_
6#define CONTENT_RENDERER_INPUT_INPUT_EVENT_FILTER_H_
7
8#include <queue>
9#include <set>
10
11#include "base/callback_forward.h"
12#include "base/synchronization/lock.h"
13#include "content/common/content_export.h"
14#include "content/port/common/input_event_ack_state.h"
15#include "content/renderer/input/input_handler_manager_client.h"
16#include "ipc/ipc_channel_proxy.h"
17#include "third_party/WebKit/public/web/WebInputEvent.h"
18
19// This class can be used to intercept InputMsg_HandleInputEvent messages
20// and have them be delivered to a target thread.  Input events are filtered
21// based on routing_id (see AddRoute and RemoveRoute).
22//
23// The user of this class provides an instance of InputEventFilter::Handler,
24// which will be passed WebInputEvents on the target thread.
25//
26
27namespace content {
28
29class CONTENT_EXPORT InputEventFilter
30    : public InputHandlerManagerClient,
31      public IPC::ChannelProxy::MessageFilter {
32 public:
33  InputEventFilter(IPC::Listener* main_listener,
34                   const scoped_refptr<base::MessageLoopProxy>& target_loop);
35
36  // The |handler| is invoked on the thread associated with |target_loop| to
37  // handle input events matching the filtered routes.
38  //
39  // If INPUT_EVENT_ACK_STATE_NOT_CONSUMED is returned by the handler,
40  // the original InputMsg_HandleInputEvent message will be delivered to
41  // |main_listener| on the main thread.  (The "main thread" in this context is
42  // the thread where the InputEventFilter was constructed.)  The responsibility
43  // is left to the eventual handler to deliver the corresponding
44  // InputHostMsg_HandleInputEvent_ACK.
45  //
46  virtual void SetBoundHandler(const Handler& handler) OVERRIDE;
47  virtual void DidAddInputHandler(int routing_id,
48                                  cc::InputHandler* input_handler) OVERRIDE;
49  virtual void DidRemoveInputHandler(int routing_id) OVERRIDE;
50  virtual void DidOverscroll(int routing_id,
51                             const cc::DidOverscrollParams& params) OVERRIDE;
52
53  // IPC::ChannelProxy::MessageFilter methods:
54  virtual void OnFilterAdded(IPC::Channel* channel) OVERRIDE;
55  virtual void OnFilterRemoved() OVERRIDE;
56  virtual void OnChannelClosing() OVERRIDE;
57  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
58
59 private:
60  friend class IPC::ChannelProxy::MessageFilter;
61  virtual ~InputEventFilter();
62
63  void ForwardToMainListener(const IPC::Message& message);
64  void ForwardToHandler(const IPC::Message& message);
65  void SendACK(blink::WebInputEvent::Type type,
66               InputEventAckState ack_result,
67               const ui::LatencyInfo& latency_info,
68               int routing_id);
69  void SendMessageOnIOThread(const IPC::Message& message);
70
71  scoped_refptr<base::MessageLoopProxy> main_loop_;
72  IPC::Listener* main_listener_;
73
74  // The sender_ only gets invoked on the thread corresponding to io_loop_.
75  scoped_refptr<base::MessageLoopProxy> io_loop_;
76  IPC::Sender* sender_;
77
78  // The handler_ only gets Run on the thread corresponding to target_loop_.
79  scoped_refptr<base::MessageLoopProxy> target_loop_;
80  Handler handler_;
81
82  // Protects access to routes_.
83  base::Lock routes_lock_;
84
85  // Indicates the routing_ids for which input events should be filtered.
86  std::set<int> routes_;
87
88  // Specifies whether overscroll notifications are forwarded to the host.
89  bool overscroll_notifications_enabled_;
90};
91
92}  // namespace content
93
94#endif  // CONTENT_RENDERER_INPUT_INPUT_EVENT_FILTER_H_
95