OLD | NEW |
| (Empty) |
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 "content/renderer/input/synchronous_input_handler_proxy.h" | |
14 #include "third_party/WebKit/public/platform/WebGestureCurve.h" | |
15 #include "third_party/WebKit/public/platform/WebGestureCurveTarget.h" | |
16 #include "third_party/WebKit/public/web/WebActiveWheelFlingParameters.h" | |
17 #include "third_party/WebKit/public/web/WebInputEvent.h" | |
18 | |
19 namespace content { | |
20 | |
21 namespace test { | |
22 class InputHandlerProxyTest; | |
23 } | |
24 | |
25 class InputHandlerProxyClient; | |
26 class InputScrollElasticityController; | |
27 | |
28 // This class is a proxy between the content input event filtering and the | |
29 // compositor's input handling logic. InputHandlerProxy instances live entirely | |
30 // on the compositor thread. Each InputHandler instance handles input events | |
31 // intended for a specific WebWidget. | |
32 class CONTENT_EXPORT InputHandlerProxy | |
33 : public cc::InputHandlerClient, | |
34 public SynchronousInputHandlerProxy, | |
35 public NON_EXPORTED_BASE(blink::WebGestureCurveTarget) { | |
36 public: | |
37 InputHandlerProxy(cc::InputHandler* input_handler, | |
38 InputHandlerProxyClient* client); | |
39 ~InputHandlerProxy() override; | |
40 | |
41 InputScrollElasticityController* scroll_elasticity_controller() { | |
42 return scroll_elasticity_controller_.get(); | |
43 } | |
44 | |
45 enum EventDisposition { | |
46 DID_HANDLE, | |
47 DID_NOT_HANDLE, | |
48 DROP_EVENT | |
49 }; | |
50 EventDisposition HandleInputEventWithLatencyInfo( | |
51 const blink::WebInputEvent& event, | |
52 ui::LatencyInfo* latency_info); | |
53 EventDisposition HandleInputEvent(const blink::WebInputEvent& event); | |
54 | |
55 // cc::InputHandlerClient implementation. | |
56 void WillShutdown() override; | |
57 void Animate(base::TimeTicks time) override; | |
58 void MainThreadHasStoppedFlinging() override; | |
59 void ReconcileElasticOverscrollAndRootScroll() override; | |
60 void UpdateRootLayerStateForSynchronousInputHandler( | |
61 const gfx::ScrollOffset& total_scroll_offset, | |
62 const gfx::ScrollOffset& max_scroll_offset, | |
63 const gfx::SizeF& scrollable_size, | |
64 float page_scale_factor, | |
65 float min_page_scale_factor, | |
66 float max_page_scale_factor) override; | |
67 | |
68 // SynchronousInputHandlerProxy implementation. | |
69 void SetOnlySynchronouslyAnimateRootFlings( | |
70 SynchronousInputHandler* synchronous_input_handler) override; | |
71 void SynchronouslyAnimate(base::TimeTicks time) override; | |
72 void SynchronouslySetRootScrollOffset( | |
73 const gfx::ScrollOffset& root_offset) override; | |
74 | |
75 // blink::WebGestureCurveTarget implementation. | |
76 bool scrollBy(const blink::WebFloatSize& offset, | |
77 const blink::WebFloatSize& velocity) override; | |
78 | |
79 bool gesture_scroll_on_impl_thread_for_testing() const { | |
80 return gesture_scroll_on_impl_thread_; | |
81 } | |
82 | |
83 private: | |
84 friend class test::InputHandlerProxyTest; | |
85 | |
86 // Helper functions for handling more complicated input events. | |
87 EventDisposition HandleMouseWheel( | |
88 const blink::WebMouseWheelEvent& event); | |
89 EventDisposition HandleGestureScrollBegin( | |
90 const blink::WebGestureEvent& event); | |
91 EventDisposition HandleGestureScrollUpdate( | |
92 const blink::WebGestureEvent& event); | |
93 EventDisposition HandleGestureScrollEnd( | |
94 const blink::WebGestureEvent& event); | |
95 EventDisposition HandleGestureFlingStart( | |
96 const blink::WebGestureEvent& event); | |
97 EventDisposition HandleTouchStart( | |
98 const blink::WebTouchEvent& event); | |
99 | |
100 // Returns true if the event should be suppressed due to to an active, | |
101 // boost-enabled fling, in which case further processing should cease. | |
102 bool FilterInputEventForFlingBoosting(const blink::WebInputEvent& event); | |
103 | |
104 // Schedule a time in the future after which a boost-enabled fling will | |
105 // terminate without further momentum from the user (see |Animate()|). | |
106 void ExtendBoostedFlingTimeout(const blink::WebGestureEvent& event); | |
107 | |
108 // Returns true if we scrolled by the increment. | |
109 bool TouchpadFlingScroll(const blink::WebFloatSize& increment); | |
110 | |
111 // Returns true if we actually had an active fling to cancel, also notifying | |
112 // the client that the fling has ended. Note that if a boosted fling is active | |
113 // and suppressing an active scroll sequence, a synthetic GestureScrollBegin | |
114 // will be injected to resume scrolling. | |
115 bool CancelCurrentFling(); | |
116 | |
117 // Returns true if we actually had an active fling to cancel. | |
118 bool CancelCurrentFlingWithoutNotifyingClient(); | |
119 | |
120 // Request a frame of animation from the InputHandler or | |
121 // SynchronousInputHandler. They can provide that by calling Animate(). | |
122 void RequestAnimation(); | |
123 | |
124 // Used to send overscroll messages to the browser. | |
125 void HandleOverscroll( | |
126 const gfx::Point& causal_event_viewport_point, | |
127 const cc::InputHandlerScrollResult& scroll_result); | |
128 | |
129 scoped_ptr<blink::WebGestureCurve> fling_curve_; | |
130 // Parameters for the active fling animation, stored in case we need to | |
131 // transfer it out later. | |
132 blink::WebActiveWheelFlingParameters fling_parameters_; | |
133 | |
134 InputHandlerProxyClient* client_; | |
135 cc::InputHandler* input_handler_; | |
136 | |
137 // Time at which an active fling should expire due to a deferred cancellation | |
138 // event. A call to |Animate()| after this time will end the fling. | |
139 double deferred_fling_cancel_time_seconds_; | |
140 | |
141 // The last event that extended the lifetime of the boosted fling. If the | |
142 // event was a scroll gesture, a GestureScrollBegin will be inserted if the | |
143 // fling terminates (via |CancelCurrentFling()|). | |
144 blink::WebGestureEvent last_fling_boost_event_; | |
145 | |
146 // When present, Animates are not requested to the InputHandler, but to this | |
147 // SynchronousInputHandler instead. And all Animate() calls are expected to | |
148 // happen via the SynchronouslyAnimate() call instead of coming directly from | |
149 // the InputHandler. | |
150 SynchronousInputHandler* synchronous_input_handler_; | |
151 bool allow_root_animate_; | |
152 | |
153 #ifndef NDEBUG | |
154 bool expect_scroll_update_end_; | |
155 #endif | |
156 bool gesture_scroll_on_impl_thread_; | |
157 bool gesture_pinch_on_impl_thread_; | |
158 // This is always false when there are no flings on the main thread, but | |
159 // conservative in the sense that we might not be actually flinging when it is | |
160 // true. | |
161 bool fling_may_be_active_on_main_thread_; | |
162 // The axes on which the current fling is allowed to scroll. If a given fling | |
163 // has overscrolled on a particular axis, further fling scrolls on that axis | |
164 // will be disabled. | |
165 bool disallow_horizontal_fling_scroll_; | |
166 bool disallow_vertical_fling_scroll_; | |
167 | |
168 // Whether an active fling has seen an |Animate()| call. This is useful for | |
169 // determining if the fling start time should be re-initialized. | |
170 bool has_fling_animation_started_; | |
171 | |
172 // Non-zero only within the scope of |scrollBy|. | |
173 gfx::Vector2dF current_fling_velocity_; | |
174 | |
175 // Used to animate rubber-band over-scroll effect on Mac. | |
176 scoped_ptr<InputScrollElasticityController> scroll_elasticity_controller_; | |
177 | |
178 bool smooth_scroll_enabled_; | |
179 | |
180 bool uma_latency_reporting_enabled_; | |
181 | |
182 base::TimeTicks last_fling_animate_time_; | |
183 | |
184 DISALLOW_COPY_AND_ASSIGN(InputHandlerProxy); | |
185 }; | |
186 | |
187 } // namespace content | |
188 | |
189 #endif // CONTENT_RENDERER_INPUT_INPUT_HANDLER_PROXY_H_ | |
OLD | NEW |