Home | History | Annotate | Download | only in gpu
      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