1 // Copyright (c) 2011 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_GPU_INPUT_EVENT_FILTER_H_ 6 #define CONTENT_RENDERER_GPU_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/gpu/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 27 namespace content { 28 29 class 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(WebKit::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_GPU_INPUT_EVENT_FILTER_H_ 95