OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/input/input_handler_proxy.h" | 5 #include "content/renderer/input/input_handler_proxy.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "cc/base/swap_promise_monitor.h" | 9 #include "cc/base/swap_promise_monitor.h" |
10 #include "content/common/input/did_overscroll_params.h" | |
11 #include "content/renderer/input/input_handler_proxy_client.h" | 10 #include "content/renderer/input/input_handler_proxy_client.h" |
12 #include "testing/gmock/include/gmock/gmock.h" | 11 #include "testing/gmock/include/gmock/gmock.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
14 #include "third_party/WebKit/public/platform/WebFloatPoint.h" | 13 #include "third_party/WebKit/public/platform/WebFloatPoint.h" |
15 #include "third_party/WebKit/public/platform/WebFloatSize.h" | 14 #include "third_party/WebKit/public/platform/WebFloatSize.h" |
16 #include "third_party/WebKit/public/platform/WebGestureCurve.h" | 15 #include "third_party/WebKit/public/platform/WebGestureCurve.h" |
17 #include "third_party/WebKit/public/platform/WebPoint.h" | 16 #include "third_party/WebKit/public/platform/WebPoint.h" |
18 #include "third_party/WebKit/public/web/WebInputEvent.h" | 17 #include "third_party/WebKit/public/web/WebInputEvent.h" |
19 #include "ui/events/latency_info.h" | 18 #include "ui/events/latency_info.h" |
20 | 19 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 return scoped_ptr<cc::SwapPromiseMonitor>(); | 60 return scoped_ptr<cc::SwapPromiseMonitor>(); |
62 } | 61 } |
63 | 62 |
64 virtual void BindToClient(cc::InputHandlerClient* client) OVERRIDE {} | 63 virtual void BindToClient(cc::InputHandlerClient* client) OVERRIDE {} |
65 | 64 |
66 virtual void StartPageScaleAnimation(const gfx::Vector2d& target_offset, | 65 virtual void StartPageScaleAnimation(const gfx::Vector2d& target_offset, |
67 bool anchor_point, | 66 bool anchor_point, |
68 float page_scale, | 67 float page_scale, |
69 base::TimeDelta duration) OVERRIDE {} | 68 base::TimeDelta duration) OVERRIDE {} |
70 | 69 |
| 70 virtual void NotifyCurrentFlingVelocity( |
| 71 const gfx::Vector2dF& velocity) OVERRIDE {} |
71 virtual void MouseMoveAt(const gfx::Point& mouse_position) OVERRIDE {} | 72 virtual void MouseMoveAt(const gfx::Point& mouse_position) OVERRIDE {} |
72 | 73 |
73 MOCK_METHOD1(HaveTouchEventHandlersAt, bool(const gfx::Point& point)); | 74 MOCK_METHOD1(HaveTouchEventHandlersAt, bool(const gfx::Point& point)); |
74 | 75 |
75 virtual void SetRootLayerScrollOffsetDelegate( | 76 virtual void SetRootLayerScrollOffsetDelegate( |
76 cc::LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) | 77 cc::LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) |
77 OVERRIDE {} | 78 OVERRIDE {} |
78 | 79 |
79 virtual void OnRootLayerDelegatedScrollOffsetChanged() OVERRIDE {} | 80 virtual void OnRootLayerDelegatedScrollOffsetChanged() OVERRIDE {} |
80 | 81 |
81 DISALLOW_COPY_AND_ASSIGN(MockInputHandler); | 82 DISALLOW_COPY_AND_ASSIGN(MockInputHandler); |
82 }; | 83 }; |
83 | 84 |
84 // A simple WebGestureCurve implementation that flings at a constant velocity | 85 // A simple WebGestureCurve implementation that flings at a constant velocity |
85 // indefinitely. | 86 // indefinitely. |
86 class FakeWebGestureCurve : public blink::WebGestureCurve { | 87 class FakeWebGestureCurve : public blink::WebGestureCurve { |
87 public: | 88 public: |
88 FakeWebGestureCurve(const blink::WebFloatSize& velocity, | 89 FakeWebGestureCurve(const blink::WebFloatPoint& velocity, |
89 const blink::WebFloatSize& cumulative_scroll) | 90 const blink::WebSize& cumulative_scroll) |
90 : velocity_(velocity), cumulative_scroll_(cumulative_scroll) {} | 91 : velocity_(velocity), cumulative_scroll_(cumulative_scroll) {} |
91 | 92 |
92 virtual ~FakeWebGestureCurve() {} | 93 virtual ~FakeWebGestureCurve() {} |
93 | 94 |
94 // Returns false if curve has finished and can no longer be applied. | 95 // Returns false if curve has finished and can no longer be applied. |
95 virtual bool apply(double time, blink::WebGestureCurveTarget* target) { | 96 virtual bool apply(double time, blink::WebGestureCurveTarget* target) { |
96 blink::WebFloatSize displacement(velocity_.width * time, | 97 blink::WebSize displacement(velocity_.x * time, velocity_.y * time); |
97 velocity_.height * time); | |
98 blink::WebFloatSize increment( | 98 blink::WebFloatSize increment( |
99 displacement.width - cumulative_scroll_.width, | 99 displacement.width - cumulative_scroll_.width, |
100 displacement.height - cumulative_scroll_.height); | 100 displacement.height - cumulative_scroll_.height); |
101 cumulative_scroll_ = displacement; | 101 cumulative_scroll_ = displacement; |
102 // scrollBy() could delete this curve if the animation is over, so don't | 102 // scrollBy() could delete this curve if the animation is over, so don't |
103 // touch any member variables after making that call. | 103 // touch any member variables after making that call. |
104 target->scrollBy(increment, velocity_); | 104 target->scrollBy(increment); |
105 return true; | 105 return true; |
106 } | 106 } |
107 | 107 |
108 private: | 108 private: |
109 blink::WebFloatSize velocity_; | 109 blink::WebFloatPoint velocity_; |
110 blink::WebFloatSize cumulative_scroll_; | 110 blink::WebSize cumulative_scroll_; |
111 | 111 |
112 DISALLOW_COPY_AND_ASSIGN(FakeWebGestureCurve); | 112 DISALLOW_COPY_AND_ASSIGN(FakeWebGestureCurve); |
113 }; | 113 }; |
114 | 114 |
115 class MockInputHandlerProxyClient | 115 class MockInputHandlerProxyClient |
116 : public content::InputHandlerProxyClient { | 116 : public content::InputHandlerProxyClient { |
117 public: | 117 public: |
118 MockInputHandlerProxyClient() {} | 118 MockInputHandlerProxyClient() {} |
119 virtual ~MockInputHandlerProxyClient() {} | 119 virtual ~MockInputHandlerProxyClient() {} |
120 | 120 |
121 virtual void WillShutdown() OVERRIDE {} | 121 virtual void WillShutdown() OVERRIDE {} |
122 | 122 |
123 MOCK_METHOD1(TransferActiveWheelFlingAnimation, | 123 MOCK_METHOD1(TransferActiveWheelFlingAnimation, |
124 void(const WebActiveWheelFlingParameters&)); | 124 void(const WebActiveWheelFlingParameters&)); |
125 | 125 |
126 virtual blink::WebGestureCurve* CreateFlingAnimationCurve( | 126 virtual blink::WebGestureCurve* CreateFlingAnimationCurve( |
127 int deviceSource, | 127 int deviceSource, |
128 const WebFloatPoint& velocity, | 128 const WebFloatPoint& velocity, |
129 const WebSize& cumulative_scroll) OVERRIDE { | 129 const WebSize& cumulative_scroll) OVERRIDE { |
130 return new FakeWebGestureCurve( | 130 return new FakeWebGestureCurve(velocity, cumulative_scroll); |
131 blink::WebFloatSize(velocity.x, velocity.y), | |
132 blink::WebFloatSize(cumulative_scroll.width, cumulative_scroll.height)); | |
133 } | 131 } |
134 | 132 |
135 MOCK_METHOD1(DidOverscroll, void(const DidOverscrollParams&)); | 133 virtual void DidOverscroll(const cc::DidOverscrollParams& params) OVERRIDE {} |
136 virtual void DidStopFlinging() OVERRIDE {} | 134 virtual void DidStopFlinging() OVERRIDE {} |
137 | 135 |
138 private: | 136 private: |
139 DISALLOW_COPY_AND_ASSIGN(MockInputHandlerProxyClient); | 137 DISALLOW_COPY_AND_ASSIGN(MockInputHandlerProxyClient); |
140 }; | 138 }; |
141 | 139 |
142 WebTouchPoint CreateWebTouchPoint(WebTouchPoint::State state, float x, | 140 WebTouchPoint CreateWebTouchPoint(WebTouchPoint::State state, float x, |
143 float y) { | 141 float y) { |
144 WebTouchPoint point; | 142 WebTouchPoint point; |
145 point.state = state; | 143 point.state = state; |
(...skipping 934 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1080 EXPECT_CALL(mock_input_handler_, | 1078 EXPECT_CALL(mock_input_handler_, |
1081 ScrollBy(testing::_, | 1079 ScrollBy(testing::_, |
1082 testing::Property(&gfx::Vector2dF::y, testing::Lt(0)))) | 1080 testing::Property(&gfx::Vector2dF::y, testing::Lt(0)))) |
1083 .WillOnce(testing::Return(true)); | 1081 .WillOnce(testing::Return(true)); |
1084 EXPECT_CALL(mock_input_handler_, ScrollEnd()); | 1082 EXPECT_CALL(mock_input_handler_, ScrollEnd()); |
1085 time += base::TimeDelta::FromMilliseconds(100); | 1083 time += base::TimeDelta::FromMilliseconds(100); |
1086 input_handler_->Animate(time); | 1084 input_handler_->Animate(time); |
1087 testing::Mock::VerifyAndClearExpectations(&mock_input_handler_); | 1085 testing::Mock::VerifyAndClearExpectations(&mock_input_handler_); |
1088 | 1086 |
1089 // Simulate hitting the bottom content edge. | 1087 // Simulate hitting the bottom content edge. |
1090 gfx::Vector2dF accumulated_overscroll(0, 100); | 1088 cc::DidOverscrollParams overscroll_params; |
1091 gfx::Vector2dF latest_overscroll_delta(0, 10); | 1089 overscroll_params.accumulated_overscroll = gfx::Vector2dF(0, 100); |
1092 EXPECT_CALL(mock_client_, | 1090 overscroll_params.current_fling_velocity = gfx::Vector2dF(0, 10); |
1093 DidOverscroll(testing::AllOf( | 1091 input_handler_->DidOverscroll(overscroll_params); |
1094 testing::Field(&DidOverscrollParams::accumulated_overscroll, | |
1095 testing::Eq(accumulated_overscroll)), | |
1096 testing::Field(&DidOverscrollParams::latest_overscroll_delta, | |
1097 testing::Eq(latest_overscroll_delta)), | |
1098 testing::Field( | |
1099 &DidOverscrollParams::current_fling_velocity, | |
1100 testing::Property(&gfx::Vector2dF::y, testing::Gt(0)))))); | |
1101 input_handler_->DidOverscroll(accumulated_overscroll, | |
1102 latest_overscroll_delta); | |
1103 | 1092 |
1104 // The next call to animate will no longer scroll vertically. | 1093 // The next call to animate will no longer scroll vertically. |
1105 EXPECT_CALL(mock_input_handler_, ScheduleAnimation()); | 1094 EXPECT_CALL(mock_input_handler_, ScheduleAnimation()); |
1106 EXPECT_CALL(mock_input_handler_, ScrollBegin(testing::_, testing::_)) | 1095 EXPECT_CALL(mock_input_handler_, ScrollBegin(testing::_, testing::_)) |
1107 .WillOnce(testing::Return(cc::InputHandler::ScrollStarted)); | 1096 .WillOnce(testing::Return(cc::InputHandler::ScrollStarted)); |
1108 EXPECT_CALL(mock_input_handler_, | 1097 EXPECT_CALL(mock_input_handler_, |
1109 ScrollBy(testing::_, | 1098 ScrollBy(testing::_, |
1110 testing::Property(&gfx::Vector2dF::y, testing::Eq(0)))) | 1099 testing::Property(&gfx::Vector2dF::y, testing::Eq(0)))) |
1111 .WillOnce(testing::Return(true)); | 1100 .WillOnce(testing::Return(true)); |
1112 EXPECT_CALL(mock_input_handler_, ScrollEnd()); | 1101 EXPECT_CALL(mock_input_handler_, ScrollEnd()); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1149 EXPECT_CALL(mock_input_handler_, ScheduleAnimation()); | 1138 EXPECT_CALL(mock_input_handler_, ScheduleAnimation()); |
1150 EXPECT_CALL(mock_input_handler_, | 1139 EXPECT_CALL(mock_input_handler_, |
1151 ScrollBy(testing::_, | 1140 ScrollBy(testing::_, |
1152 testing::Property(&gfx::Vector2dF::y, testing::Lt(0)))) | 1141 testing::Property(&gfx::Vector2dF::y, testing::Lt(0)))) |
1153 .WillOnce(testing::Return(true)); | 1142 .WillOnce(testing::Return(true)); |
1154 time += base::TimeDelta::FromMilliseconds(10); | 1143 time += base::TimeDelta::FromMilliseconds(10); |
1155 input_handler_->Animate(time); | 1144 input_handler_->Animate(time); |
1156 testing::Mock::VerifyAndClearExpectations(&mock_input_handler_); | 1145 testing::Mock::VerifyAndClearExpectations(&mock_input_handler_); |
1157 | 1146 |
1158 // Simulate hitting the bottom content edge. | 1147 // Simulate hitting the bottom content edge. |
1159 gfx::Vector2dF accumulated_overscroll(0, 100); | 1148 cc::DidOverscrollParams overscroll_params; |
1160 gfx::Vector2dF latest_overscroll_delta(0, 100); | 1149 overscroll_params.accumulated_overscroll = gfx::Vector2dF(0, 100); |
1161 EXPECT_CALL(mock_client_, | 1150 input_handler_->DidOverscroll(overscroll_params); |
1162 DidOverscroll(testing::AllOf( | |
1163 testing::Field(&DidOverscrollParams::accumulated_overscroll, | |
1164 testing::Eq(accumulated_overscroll)), | |
1165 testing::Field(&DidOverscrollParams::latest_overscroll_delta, | |
1166 testing::Eq(latest_overscroll_delta)), | |
1167 testing::Field( | |
1168 &DidOverscrollParams::current_fling_velocity, | |
1169 testing::Property(&gfx::Vector2dF::y, testing::Gt(0)))))); | |
1170 input_handler_->DidOverscroll(accumulated_overscroll, | |
1171 latest_overscroll_delta); | |
1172 | 1151 |
1173 // The next call to animate will no longer scroll vertically. | 1152 // The next call to animate will no longer scroll vertically. |
1174 EXPECT_CALL(mock_input_handler_, ScheduleAnimation()); | 1153 EXPECT_CALL(mock_input_handler_, ScheduleAnimation()); |
1175 EXPECT_CALL(mock_input_handler_, | 1154 EXPECT_CALL(mock_input_handler_, |
1176 ScrollBy(testing::_, | 1155 ScrollBy(testing::_, |
1177 testing::Property(&gfx::Vector2dF::y, testing::Eq(0)))) | 1156 testing::Property(&gfx::Vector2dF::y, testing::Eq(0)))) |
1178 .WillOnce(testing::Return(true)); | 1157 .WillOnce(testing::Return(true)); |
1179 time += base::TimeDelta::FromMilliseconds(10); | 1158 time += base::TimeDelta::FromMilliseconds(10); |
1180 input_handler_->Animate(time); | 1159 input_handler_->Animate(time); |
1181 testing::Mock::VerifyAndClearExpectations(&mock_input_handler_); | 1160 testing::Mock::VerifyAndClearExpectations(&mock_input_handler_); |
1182 | 1161 |
1183 // Simulate hitting the right content edge. | 1162 // Simulate hitting the right content edge. |
1184 accumulated_overscroll = gfx::Vector2dF(100, 100); | 1163 overscroll_params.accumulated_overscroll = gfx::Vector2dF(100, 100); |
1185 latest_overscroll_delta = gfx::Vector2dF(100, 0); | 1164 input_handler_->DidOverscroll(overscroll_params); |
1186 EXPECT_CALL(mock_client_, | 1165 |
1187 DidOverscroll(testing::AllOf( | |
1188 testing::Field(&DidOverscrollParams::accumulated_overscroll, | |
1189 testing::Eq(accumulated_overscroll)), | |
1190 testing::Field(&DidOverscrollParams::latest_overscroll_delta, | |
1191 testing::Eq(latest_overscroll_delta)), | |
1192 testing::Field( | |
1193 &DidOverscrollParams::current_fling_velocity, | |
1194 testing::Property(&gfx::Vector2dF::x, testing::Gt(0)))))); | |
1195 input_handler_->DidOverscroll(accumulated_overscroll, | |
1196 latest_overscroll_delta); | |
1197 // The next call to animate will no longer scroll horizontally or vertically, | 1166 // The next call to animate will no longer scroll horizontally or vertically, |
1198 // and the fling should be cancelled. | 1167 // and the fling should be cancelled. |
1199 EXPECT_CALL(mock_input_handler_, ScheduleAnimation()).Times(0); | 1168 EXPECT_CALL(mock_input_handler_, ScheduleAnimation()).Times(0); |
1200 EXPECT_CALL(mock_input_handler_, ScrollBy(testing::_, testing::_)).Times(0); | 1169 EXPECT_CALL(mock_input_handler_, ScrollBy(testing::_, testing::_)).Times(0); |
1201 EXPECT_CALL(mock_input_handler_, ScrollEnd()); | 1170 EXPECT_CALL(mock_input_handler_, ScrollEnd()); |
1202 time += base::TimeDelta::FromMilliseconds(10); | 1171 time += base::TimeDelta::FromMilliseconds(10); |
1203 input_handler_->Animate(time); | 1172 input_handler_->Animate(time); |
1204 testing::Mock::VerifyAndClearExpectations(&mock_input_handler_); | 1173 testing::Mock::VerifyAndClearExpectations(&mock_input_handler_); |
1205 EXPECT_FALSE(input_handler_->gesture_scroll_on_impl_thread_for_testing()); | 1174 EXPECT_FALSE(input_handler_->gesture_scroll_on_impl_thread_for_testing()); |
1206 } | 1175 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1252 | 1221 |
1253 touch.touchesLength = 3; | 1222 touch.touchesLength = 3; |
1254 touch.touches[0] = CreateWebTouchPoint(WebTouchPoint::StatePressed, 0, 0); | 1223 touch.touches[0] = CreateWebTouchPoint(WebTouchPoint::StatePressed, 0, 0); |
1255 touch.touches[1] = CreateWebTouchPoint(WebTouchPoint::StatePressed, 10, 10); | 1224 touch.touches[1] = CreateWebTouchPoint(WebTouchPoint::StatePressed, 10, 10); |
1256 touch.touches[2] = CreateWebTouchPoint(WebTouchPoint::StatePressed, -10, 10); | 1225 touch.touches[2] = CreateWebTouchPoint(WebTouchPoint::StatePressed, -10, 10); |
1257 EXPECT_EQ(expected_disposition_, input_handler_->HandleInputEvent(touch)); | 1226 EXPECT_EQ(expected_disposition_, input_handler_->HandleInputEvent(touch)); |
1258 } | 1227 } |
1259 | 1228 |
1260 } // namespace | 1229 } // namespace |
1261 } // namespace content | 1230 } // namespace content |
OLD | NEW |