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_HANDLER_PROXY_H_
      6 #define CONTENT_RENDERER_INPUT_INPUT_HANDLER_PROXY_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/containers/hash_tables.h"
     10 #include "base/memory/scoped_ptr.h"
     11 #include "cc/input/input_handler.h"
     12 #include "content/common/content_export.h"
     13 #include "third_party/WebKit/public/platform/WebGestureCurve.h"
     14 #include "third_party/WebKit/public/platform/WebGestureCurveTarget.h"
     15 #include "third_party/WebKit/public/web/WebActiveWheelFlingParameters.h"
     16 #include "third_party/WebKit/public/web/WebInputEvent.h"
     17 
     18 namespace content {
     19 
     20 class InputHandlerProxyClient;
     21 
     22 // This class is a proxy between the content input event filtering and the
     23 // compositor's input handling logic. InputHandlerProxy instances live entirely
     24 // on the compositor thread. Each InputHandler instance handles input events
     25 // intended for a specific WebWidget.
     26 class CONTENT_EXPORT InputHandlerProxy
     27     : public cc::InputHandlerClient,
     28       public NON_EXPORTED_BASE(blink::WebGestureCurveTarget) {
     29  public:
     30   InputHandlerProxy(cc::InputHandler* input_handler,
     31                     InputHandlerProxyClient* client);
     32   virtual ~InputHandlerProxy();
     33 
     34   enum EventDisposition {
     35     DID_HANDLE,
     36     DID_NOT_HANDLE,
     37     DROP_EVENT
     38   };
     39   EventDisposition HandleInputEventWithLatencyInfo(
     40       const blink::WebInputEvent& event,
     41       ui::LatencyInfo* latency_info);
     42   EventDisposition HandleInputEvent(const blink::WebInputEvent& event);
     43 
     44   // cc::InputHandlerClient implementation.
     45   virtual void WillShutdown() OVERRIDE;
     46   virtual void Animate(base::TimeTicks time) OVERRIDE;
     47   virtual void MainThreadHasStoppedFlinging() OVERRIDE;
     48   virtual void DidOverscroll(
     49       const gfx::PointF& causal_event_viewport_point,
     50       const gfx::Vector2dF& accumulated_overscroll,
     51       const gfx::Vector2dF& latest_overscroll_delta) OVERRIDE;
     52 
     53   // blink::WebGestureCurveTarget implementation.
     54   virtual bool scrollBy(const blink::WebFloatSize& offset,
     55                         const blink::WebFloatSize& velocity);
     56 
     57   bool gesture_scroll_on_impl_thread_for_testing() const {
     58     return gesture_scroll_on_impl_thread_;
     59   }
     60 
     61  private:
     62   EventDisposition HandleGestureFling(const blink::WebGestureEvent& event);
     63 
     64   // Returns true if the event should be suppressed due to to an active,
     65   // boost-enabled fling, in which case further processing should cease.
     66   bool FilterInputEventForFlingBoosting(const blink::WebInputEvent& event);
     67 
     68   // Schedule a time in the future after which a boost-enabled fling will
     69   // terminate without further momentum from the user (see |Animate()|).
     70   void ExtendBoostedFlingTimeout(const blink::WebGestureEvent& event);
     71 
     72   // Returns true if we scrolled by the increment.
     73   bool TouchpadFlingScroll(const blink::WebFloatSize& increment);
     74 
     75   // Returns true if we actually had an active fling to cancel, also notifying
     76   // the client that the fling has ended. Note that if a boosted fling is active
     77   // and suppressing an active scroll sequence, a synthetic GestureScrollBegin
     78   // will be injected to resume scrolling.
     79   bool CancelCurrentFling();
     80 
     81   // Returns true if we actually had an active fling to cancel.
     82   bool CancelCurrentFlingWithoutNotifyingClient();
     83 
     84   scoped_ptr<blink::WebGestureCurve> fling_curve_;
     85   // Parameters for the active fling animation, stored in case we need to
     86   // transfer it out later.
     87   blink::WebActiveWheelFlingParameters fling_parameters_;
     88 
     89   InputHandlerProxyClient* client_;
     90   cc::InputHandler* input_handler_;
     91 
     92   // Time at which an active fling should expire due to a deferred cancellation
     93   // event. A call to |Animate()| after this time will end the fling.
     94   double deferred_fling_cancel_time_seconds_;
     95 
     96   // The last event that extended the lifetime of the boosted fling. If the
     97   // event was a scroll gesture, a GestureScrollBegin will be inserted if the
     98   // fling terminates (via |CancelCurrentFling()|).
     99   blink::WebGestureEvent last_fling_boost_event_;
    100 
    101 #ifndef NDEBUG
    102   bool expect_scroll_update_end_;
    103 #endif
    104   bool gesture_scroll_on_impl_thread_;
    105   bool gesture_pinch_on_impl_thread_;
    106   // This is always false when there are no flings on the main thread, but
    107   // conservative in the sense that we might not be actually flinging when it is
    108   // true.
    109   bool fling_may_be_active_on_main_thread_;
    110   // The axes on which the current fling is allowed to scroll.  If a given fling
    111   // has overscrolled on a particular axis, further fling scrolls on that axis
    112   // will be disabled.
    113   bool disallow_horizontal_fling_scroll_;
    114   bool disallow_vertical_fling_scroll_;
    115 
    116   // Whether an active fling has seen an |Animate()| call. This is useful for
    117   // determining if the fling start time should be re-initialized.
    118   bool has_fling_animation_started_;
    119 
    120   // Non-zero only within the scope of |scrollBy|.
    121   gfx::Vector2dF current_fling_velocity_;
    122 
    123   bool smooth_scroll_enabled_;
    124 
    125   DISALLOW_COPY_AND_ASSIGN(InputHandlerProxy);
    126 };
    127 
    128 }  // namespace content
    129 
    130 #endif  // CONTENT_RENDERER_INPUT_INPUT_HANDLER_PROXY_H_
    131