Home | History | Annotate | Download | only in input
      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/common/input/input_event_ack_state.h"
     15 #include "content/renderer/input/input_handler_manager_client.h"
     16 #include "ipc/message_filter.h"
     17 #include "third_party/WebKit/public/web/WebInputEvent.h"
     18 
     19 namespace base {
     20 class MessageLoopProxy;
     21 }
     22 
     23 namespace IPC {
     24 class Listener;
     25 class Sender;
     26 }
     27 
     28 // This class can be used to intercept InputMsg_HandleInputEvent messages
     29 // and have them be delivered to a target thread.  Input events are filtered
     30 // based on routing_id (see AddRoute and RemoveRoute).
     31 //
     32 // The user of this class provides an instance of InputEventFilter::Handler,
     33 // which will be passed WebInputEvents on the target thread.
     34 //
     35 
     36 namespace content {
     37 
     38 class CONTENT_EXPORT InputEventFilter : public InputHandlerManagerClient,
     39                                         public IPC::MessageFilter {
     40  public:
     41   InputEventFilter(IPC::Listener* main_listener,
     42                    const scoped_refptr<base::MessageLoopProxy>& target_loop);
     43 
     44   // The |handler| is invoked on the thread associated with |target_loop| to
     45   // handle input events matching the filtered routes.
     46   //
     47   // If INPUT_EVENT_ACK_STATE_NOT_CONSUMED is returned by the handler,
     48   // the original InputMsg_HandleInputEvent message will be delivered to
     49   // |main_listener| on the main thread.  (The "main thread" in this context is
     50   // the thread where the InputEventFilter was constructed.)  The responsibility
     51   // is left to the eventual handler to deliver the corresponding
     52   // InputHostMsg_HandleInputEvent_ACK.
     53   //
     54   virtual void SetBoundHandler(const Handler& handler) OVERRIDE;
     55   virtual void DidAddInputHandler(int routing_id,
     56                                   cc::InputHandler* input_handler) OVERRIDE;
     57   virtual void DidRemoveInputHandler(int routing_id) OVERRIDE;
     58   virtual void DidOverscroll(int routing_id,
     59                              const DidOverscrollParams& params) OVERRIDE;
     60   virtual void DidStopFlinging(int routing_id) OVERRIDE;
     61 
     62   // IPC::MessageFilter methods:
     63   virtual void OnFilterAdded(IPC::Sender* sender) OVERRIDE;
     64   virtual void OnFilterRemoved() OVERRIDE;
     65   virtual void OnChannelClosing() OVERRIDE;
     66   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
     67 
     68  private:
     69   virtual ~InputEventFilter();
     70 
     71   void ForwardToMainListener(const IPC::Message& message);
     72   void ForwardToHandler(const IPC::Message& message);
     73   void SendMessage(scoped_ptr<IPC::Message> message);
     74   void SendMessageOnIOThread(scoped_ptr<IPC::Message> message);
     75 
     76   scoped_refptr<base::MessageLoopProxy> main_loop_;
     77   IPC::Listener* main_listener_;
     78 
     79   // The sender_ only gets invoked on the thread corresponding to io_loop_.
     80   scoped_refptr<base::MessageLoopProxy> io_loop_;
     81   IPC::Sender* sender_;
     82 
     83   // The handler_ only gets Run on the thread corresponding to target_loop_.
     84   scoped_refptr<base::MessageLoopProxy> target_loop_;
     85   Handler handler_;
     86 
     87   // Protects access to routes_.
     88   base::Lock routes_lock_;
     89 
     90   // Indicates the routing_ids for which input events should be filtered.
     91   std::set<int> routes_;
     92 
     93   // Specifies whether overscroll notifications are forwarded to the host.
     94   bool overscroll_notifications_enabled_;
     95 
     96   // Used to intercept overscroll notifications while an event is being
     97   // dispatched.  If the event causes overscroll, the overscroll metadata can be
     98   // bundled in the event ack, saving an IPC.  Note that we must continue
     99   // supporting overscroll IPC notifications due to fling animation updates.
    100   scoped_ptr<DidOverscrollParams>* current_overscroll_params_;
    101 };
    102 
    103 }  // namespace content
    104 
    105 #endif  // CONTENT_RENDERER_INPUT_INPUT_EVENT_FILTER_H_
    106