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
18namespace content {
19
20class 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.
26class 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