Chromium Code Reviews| 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 "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/memory/scoped_ptr.h" | 6 #include "base/memory/scoped_ptr.h" |
| 7 #include "base/time/time.h" | 7 #include "base/time/time.h" |
| 8 #include "content/browser/renderer_host/input/synthetic_gesture.h" | 8 #include "content/browser/renderer_host/input/synthetic_gesture.h" |
| 9 #include "content/browser/renderer_host/input/synthetic_gesture_controller.h" | 9 #include "content/browser/renderer_host/input/synthetic_gesture_controller.h" |
| 10 #include "content/browser/renderer_host/input/synthetic_gesture_target.h" | 10 #include "content/browser/renderer_host/input/synthetic_gesture_target.h" |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 30 using blink::WebMouseWheelEvent; | 30 using blink::WebMouseWheelEvent; |
| 31 using blink::WebTouchEvent; | 31 using blink::WebTouchEvent; |
| 32 | 32 |
| 33 namespace content { | 33 namespace content { |
| 34 | 34 |
| 35 namespace { | 35 namespace { |
| 36 | 36 |
| 37 const int kFlushInputRateInMs = 16; | 37 const int kFlushInputRateInMs = 16; |
| 38 const int kPointerAssumedStoppedTimeMs = 43; | 38 const int kPointerAssumedStoppedTimeMs = 43; |
| 39 const int kTouchSlopInDips = 7; | 39 const int kTouchSlopInDips = 7; |
| 40 const int kMinScalingSpanInDips = 27; | |
| 40 | 41 |
| 41 class MockSyntheticGesture : public SyntheticGesture { | 42 class MockSyntheticGesture : public SyntheticGesture { |
| 42 public: | 43 public: |
| 43 MockSyntheticGesture(bool* finished, int num_steps) | 44 MockSyntheticGesture(bool* finished, int num_steps) |
| 44 : finished_(finished), | 45 : finished_(finished), |
| 45 num_steps_(num_steps), | 46 num_steps_(num_steps), |
| 46 step_count_(0) { | 47 step_count_(0) { |
| 47 *finished_ = false; | 48 *finished_ = false; |
| 48 } | 49 } |
| 49 virtual ~MockSyntheticGesture() {} | 50 virtual ~MockSyntheticGesture() {} |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 94 } | 95 } |
| 95 | 96 |
| 96 void set_pointer_assumed_stopped_time_ms(int time_ms) { | 97 void set_pointer_assumed_stopped_time_ms(int time_ms) { |
| 97 pointer_assumed_stopped_time_ms_ = time_ms; | 98 pointer_assumed_stopped_time_ms_ = time_ms; |
| 98 } | 99 } |
| 99 | 100 |
| 100 virtual int GetTouchSlopInDips() const OVERRIDE { | 101 virtual int GetTouchSlopInDips() const OVERRIDE { |
| 101 return kTouchSlopInDips; | 102 return kTouchSlopInDips; |
| 102 } | 103 } |
| 103 | 104 |
| 105 virtual int GetMinScalingSpanInDips() const OVERRIDE { | |
| 106 return kMinScalingSpanInDips; | |
| 107 } | |
| 108 | |
| 104 bool flush_requested() const { return flush_requested_; } | 109 bool flush_requested() const { return flush_requested_; } |
| 105 void ClearFlushRequest() { flush_requested_ = false; } | 110 void ClearFlushRequest() { flush_requested_ = false; } |
| 106 | 111 |
| 107 private: | 112 private: |
| 108 bool flush_requested_; | 113 bool flush_requested_; |
| 109 | 114 |
| 110 int pointer_assumed_stopped_time_ms_; | 115 int pointer_assumed_stopped_time_ms_; |
| 111 }; | 116 }; |
| 112 | 117 |
| 113 class MockScrollGestureTarget : public MockSyntheticGestureTarget { | 118 class MockScrollGestureTarget : public MockSyntheticGestureTarget { |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 184 | 189 |
| 185 class MockSyntheticPinchTouchTarget : public MockSyntheticGestureTarget { | 190 class MockSyntheticPinchTouchTarget : public MockSyntheticGestureTarget { |
| 186 public: | 191 public: |
| 187 enum ZoomDirection { | 192 enum ZoomDirection { |
| 188 ZOOM_DIRECTION_UNKNOWN, | 193 ZOOM_DIRECTION_UNKNOWN, |
| 189 ZOOM_IN, | 194 ZOOM_IN, |
| 190 ZOOM_OUT | 195 ZOOM_OUT |
| 191 }; | 196 }; |
| 192 | 197 |
| 193 MockSyntheticPinchTouchTarget() | 198 MockSyntheticPinchTouchTarget() |
| 194 : total_num_pixels_covered_(0), | 199 : initial_pointer_distance_(0), |
| 200 total_num_pixels_covered_(0), | |
|
Sami
2014/05/19 14:49:04
Do we still need total_num_pixel_covered here?
Dominik Grewe
2014/05/19 17:31:43
I'm only using for the NoScaling unit test to make
| |
| 195 last_pointer_distance_(0), | 201 last_pointer_distance_(0), |
| 196 zoom_direction_(ZOOM_DIRECTION_UNKNOWN), | 202 zoom_direction_(ZOOM_DIRECTION_UNKNOWN), |
| 197 started_(false) {} | 203 started_(false) {} |
| 198 virtual ~MockSyntheticPinchTouchTarget() {} | 204 virtual ~MockSyntheticPinchTouchTarget() {} |
| 199 | 205 |
| 200 virtual void DispatchInputEventToPlatform( | 206 virtual void DispatchInputEventToPlatform( |
| 201 const WebInputEvent& event) OVERRIDE { | 207 const WebInputEvent& event) OVERRIDE { |
| 202 ASSERT_TRUE(WebInputEvent::isTouchEventType(event.type)); | 208 ASSERT_TRUE(WebInputEvent::isTouchEventType(event.type)); |
| 203 const WebTouchEvent& touch_event = static_cast<const WebTouchEvent&>(event); | 209 const WebTouchEvent& touch_event = static_cast<const WebTouchEvent&>(event); |
| 204 ASSERT_EQ(touch_event.touchesLength, 2U); | 210 ASSERT_EQ(touch_event.touchesLength, 2U); |
| 205 | 211 |
| 206 if (!started_) { | 212 if (!started_) { |
| 207 ASSERT_EQ(touch_event.type, WebInputEvent::TouchStart); | 213 ASSERT_EQ(touch_event.type, WebInputEvent::TouchStart); |
| 208 | 214 |
| 209 start_0_ = gfx::PointF(touch_event.touches[0].position); | 215 start_0_ = gfx::PointF(touch_event.touches[0].position); |
| 210 start_1_ = gfx::PointF(touch_event.touches[1].position); | 216 start_1_ = gfx::PointF(touch_event.touches[1].position); |
| 211 last_pointer_distance_ = (start_0_ - start_1_).Length(); | 217 last_pointer_distance_ = (start_0_ - start_1_).Length(); |
| 218 initial_pointer_distance_ = last_pointer_distance_; | |
| 219 EXPECT_GE(initial_pointer_distance_, GetMinScalingSpanInDips()); | |
| 212 | 220 |
| 213 started_ = true; | 221 started_ = true; |
| 214 } else { | 222 } else { |
| 215 ASSERT_NE(touch_event.type, WebInputEvent::TouchStart); | 223 ASSERT_NE(touch_event.type, WebInputEvent::TouchStart); |
| 216 ASSERT_NE(touch_event.type, WebInputEvent::TouchCancel); | 224 ASSERT_NE(touch_event.type, WebInputEvent::TouchCancel); |
| 217 | 225 |
| 218 gfx::PointF current_0 = gfx::PointF(touch_event.touches[0].position); | 226 gfx::PointF current_0 = gfx::PointF(touch_event.touches[0].position); |
| 219 gfx::PointF current_1 = gfx::PointF(touch_event.touches[1].position); | 227 gfx::PointF current_1 = gfx::PointF(touch_event.touches[1].position); |
| 220 | 228 |
| 221 total_num_pixels_covered_ = | 229 total_num_pixels_covered_ = |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 232 ComputeZoomDirection(last_pointer_distance_, pointer_distance)); | 240 ComputeZoomDirection(last_pointer_distance_, pointer_distance)); |
| 233 } | 241 } |
| 234 | 242 |
| 235 last_pointer_distance_ = pointer_distance; | 243 last_pointer_distance_ = pointer_distance; |
| 236 } | 244 } |
| 237 } | 245 } |
| 238 | 246 |
| 239 float total_num_pixels_covered() const { return total_num_pixels_covered_; } | 247 float total_num_pixels_covered() const { return total_num_pixels_covered_; } |
| 240 ZoomDirection zoom_direction() const { return zoom_direction_; } | 248 ZoomDirection zoom_direction() const { return zoom_direction_; } |
| 241 | 249 |
| 250 float ComputeScaleFactor() const { | |
| 251 switch (zoom_direction_) { | |
| 252 case ZOOM_IN: | |
| 253 return last_pointer_distance_ / | |
| 254 (initial_pointer_distance_ + 2 * GetTouchSlopInDips()); | |
| 255 case ZOOM_OUT: | |
| 256 return last_pointer_distance_ / | |
| 257 (initial_pointer_distance_ - 2 * GetTouchSlopInDips()); | |
| 258 case ZOOM_DIRECTION_UNKNOWN: | |
| 259 return 1.0f; | |
| 260 default: | |
| 261 EXPECT_TRUE(false); | |
|
Sami
2014/05/19 14:49:04
NOTREACHED();
Dominik Grewe
2014/05/19 17:31:43
Done.
| |
| 262 return 0.0f; | |
| 263 } | |
| 264 } | |
| 265 | |
| 242 private: | 266 private: |
| 243 ZoomDirection ComputeZoomDirection(float last_pointer_distance, | 267 ZoomDirection ComputeZoomDirection(float last_pointer_distance, |
| 244 float current_pointer_distance) { | 268 float current_pointer_distance) { |
| 245 DCHECK_NE(last_pointer_distance, current_pointer_distance); | 269 DCHECK_NE(last_pointer_distance, current_pointer_distance); |
| 246 return last_pointer_distance < current_pointer_distance ? ZOOM_IN | 270 return last_pointer_distance < current_pointer_distance ? ZOOM_IN |
| 247 : ZOOM_OUT; | 271 : ZOOM_OUT; |
| 248 } | 272 } |
| 249 | 273 |
| 274 float initial_pointer_distance_; | |
| 250 float total_num_pixels_covered_; | 275 float total_num_pixels_covered_; |
| 251 float last_pointer_distance_; | 276 float last_pointer_distance_; |
| 252 ZoomDirection zoom_direction_; | 277 ZoomDirection zoom_direction_; |
| 253 gfx::PointF start_0_; | 278 gfx::PointF start_0_; |
| 254 gfx::PointF start_1_; | 279 gfx::PointF start_1_; |
| 255 bool started_; | 280 bool started_; |
| 256 }; | 281 }; |
| 257 | 282 |
| 258 class MockSyntheticTapGestureTarget : public MockSyntheticGestureTarget { | 283 class MockSyntheticTapGestureTarget : public MockSyntheticGestureTarget { |
| 259 public: | 284 public: |
| (...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 876 EXPECT_EQ(AddTouchSlopToVector(params.distances[0] + params.distances[1], | 901 EXPECT_EQ(AddTouchSlopToVector(params.distances[0] + params.distances[1], |
| 877 target_), | 902 target_), |
| 878 scroll_target->start_to_end_distance() - gfx::Vector2dF(0, 0.001f)); | 903 scroll_target->start_to_end_distance() - gfx::Vector2dF(0, 0.001f)); |
| 879 } | 904 } |
| 880 | 905 |
| 881 TEST_F(SyntheticGestureControllerTest, PinchGestureTouchZoomIn) { | 906 TEST_F(SyntheticGestureControllerTest, PinchGestureTouchZoomIn) { |
| 882 CreateControllerAndTarget<MockSyntheticPinchTouchTarget>(); | 907 CreateControllerAndTarget<MockSyntheticPinchTouchTarget>(); |
| 883 | 908 |
| 884 SyntheticPinchGestureParams params; | 909 SyntheticPinchGestureParams params; |
| 885 params.gesture_source_type = SyntheticGestureParams::TOUCH_INPUT; | 910 params.gesture_source_type = SyntheticGestureParams::TOUCH_INPUT; |
| 886 params.zoom_in = true; | 911 params.scale_factor = 2.3f; |
| 887 params.total_num_pixels_covered = 345; | |
| 888 params.anchor.SetPoint(54, 89); | 912 params.anchor.SetPoint(54, 89); |
| 889 | 913 |
| 890 scoped_ptr<SyntheticPinchGesture> gesture(new SyntheticPinchGesture(params)); | 914 scoped_ptr<SyntheticPinchGesture> gesture(new SyntheticPinchGesture(params)); |
| 891 QueueSyntheticGesture(gesture.PassAs<SyntheticGesture>()); | 915 QueueSyntheticGesture(gesture.PassAs<SyntheticGesture>()); |
| 892 FlushInputUntilComplete(); | 916 FlushInputUntilComplete(); |
| 893 | 917 |
| 894 MockSyntheticPinchTouchTarget* pinch_target = | 918 MockSyntheticPinchTouchTarget* pinch_target = |
| 895 static_cast<MockSyntheticPinchTouchTarget*>(target_); | 919 static_cast<MockSyntheticPinchTouchTarget*>(target_); |
| 896 EXPECT_EQ(1, num_success_); | 920 EXPECT_EQ(1, num_success_); |
| 897 EXPECT_EQ(0, num_failure_); | 921 EXPECT_EQ(0, num_failure_); |
| 898 EXPECT_EQ(pinch_target->zoom_direction(), | 922 EXPECT_EQ(pinch_target->zoom_direction(), |
| 899 MockSyntheticPinchTouchTarget::ZOOM_IN); | 923 MockSyntheticPinchTouchTarget::ZOOM_IN); |
| 900 EXPECT_EQ(params.total_num_pixels_covered + 2 * target_->GetTouchSlopInDips(), | 924 EXPECT_FLOAT_EQ(params.scale_factor, pinch_target->ComputeScaleFactor()); |
| 901 pinch_target->total_num_pixels_covered()); | |
| 902 } | 925 } |
| 903 | 926 |
| 904 TEST_F(SyntheticGestureControllerTest, PinchGestureTouchZoomOut) { | 927 TEST_F(SyntheticGestureControllerTest, PinchGestureTouchZoomOut) { |
| 905 CreateControllerAndTarget<MockSyntheticPinchTouchTarget>(); | 928 CreateControllerAndTarget<MockSyntheticPinchTouchTarget>(); |
| 906 | 929 |
| 907 SyntheticPinchGestureParams params; | 930 SyntheticPinchGestureParams params; |
| 908 params.gesture_source_type = SyntheticGestureParams::TOUCH_INPUT; | 931 params.gesture_source_type = SyntheticGestureParams::TOUCH_INPUT; |
| 909 params.zoom_in = false; | 932 params.scale_factor = 0.4f; |
| 910 params.total_num_pixels_covered = 456; | |
| 911 params.anchor.SetPoint(-12, 93); | 933 params.anchor.SetPoint(-12, 93); |
| 912 | 934 |
| 913 scoped_ptr<SyntheticPinchGesture> gesture(new SyntheticPinchGesture(params)); | 935 scoped_ptr<SyntheticPinchGesture> gesture(new SyntheticPinchGesture(params)); |
| 914 QueueSyntheticGesture(gesture.PassAs<SyntheticGesture>()); | 936 QueueSyntheticGesture(gesture.PassAs<SyntheticGesture>()); |
| 915 FlushInputUntilComplete(); | 937 FlushInputUntilComplete(); |
| 916 | 938 |
| 917 MockSyntheticPinchTouchTarget* pinch_target = | 939 MockSyntheticPinchTouchTarget* pinch_target = |
| 918 static_cast<MockSyntheticPinchTouchTarget*>(target_); | 940 static_cast<MockSyntheticPinchTouchTarget*>(target_); |
| 919 EXPECT_EQ(1, num_success_); | 941 EXPECT_EQ(1, num_success_); |
| 920 EXPECT_EQ(0, num_failure_); | 942 EXPECT_EQ(0, num_failure_); |
| 921 EXPECT_EQ(pinch_target->zoom_direction(), | 943 EXPECT_EQ(pinch_target->zoom_direction(), |
| 922 MockSyntheticPinchTouchTarget::ZOOM_OUT); | 944 MockSyntheticPinchTouchTarget::ZOOM_OUT); |
| 923 EXPECT_EQ(params.total_num_pixels_covered + 2 * target_->GetTouchSlopInDips(), | 945 EXPECT_FLOAT_EQ(params.scale_factor, pinch_target->ComputeScaleFactor()); |
| 924 pinch_target->total_num_pixels_covered()); | |
| 925 } | 946 } |
| 926 | 947 |
| 927 TEST_F(SyntheticGestureControllerTest, PinchGestureTouchZeroPixelsCovered) { | 948 TEST_F(SyntheticGestureControllerTest, PinchGestureTouchNoScaling) { |
| 928 CreateControllerAndTarget<MockSyntheticPinchTouchTarget>(); | 949 CreateControllerAndTarget<MockSyntheticPinchTouchTarget>(); |
| 929 | 950 |
| 930 SyntheticPinchGestureParams params; | 951 SyntheticPinchGestureParams params; |
| 931 params.gesture_source_type = SyntheticGestureParams::TOUCH_INPUT; | 952 params.gesture_source_type = SyntheticGestureParams::TOUCH_INPUT; |
| 932 params.zoom_in = true; | 953 params.scale_factor = 1.0f; |
| 933 params.total_num_pixels_covered = 0; | |
| 934 | 954 |
| 935 scoped_ptr<SyntheticPinchGesture> gesture(new SyntheticPinchGesture(params)); | 955 scoped_ptr<SyntheticPinchGesture> gesture(new SyntheticPinchGesture(params)); |
| 936 QueueSyntheticGesture(gesture.PassAs<SyntheticGesture>()); | 956 QueueSyntheticGesture(gesture.PassAs<SyntheticGesture>()); |
| 937 FlushInputUntilComplete(); | 957 FlushInputUntilComplete(); |
| 938 | 958 |
| 939 MockSyntheticPinchTouchTarget* pinch_target = | 959 MockSyntheticPinchTouchTarget* pinch_target = |
| 940 static_cast<MockSyntheticPinchTouchTarget*>(target_); | 960 static_cast<MockSyntheticPinchTouchTarget*>(target_); |
| 941 EXPECT_EQ(1, num_success_); | 961 EXPECT_EQ(1, num_success_); |
| 942 EXPECT_EQ(0, num_failure_); | 962 EXPECT_EQ(0, num_failure_); |
| 943 EXPECT_EQ(pinch_target->zoom_direction(), | 963 EXPECT_EQ(pinch_target->zoom_direction(), |
| 944 MockSyntheticPinchTouchTarget::ZOOM_DIRECTION_UNKNOWN); | 964 MockSyntheticPinchTouchTarget::ZOOM_DIRECTION_UNKNOWN); |
| 945 EXPECT_EQ(0, pinch_target->total_num_pixels_covered()); | 965 EXPECT_EQ(0, pinch_target->total_num_pixels_covered()); |
| 966 EXPECT_EQ(params.scale_factor, pinch_target->ComputeScaleFactor()); | |
| 946 } | 967 } |
| 947 | 968 |
| 948 TEST_F(SyntheticGestureControllerTest, TapGestureTouch) { | 969 TEST_F(SyntheticGestureControllerTest, TapGestureTouch) { |
| 949 CreateControllerAndTarget<MockSyntheticTapTouchTarget>(); | 970 CreateControllerAndTarget<MockSyntheticTapTouchTarget>(); |
| 950 | 971 |
| 951 SyntheticTapGestureParams params; | 972 SyntheticTapGestureParams params; |
| 952 params.gesture_source_type = SyntheticGestureParams::TOUCH_INPUT; | 973 params.gesture_source_type = SyntheticGestureParams::TOUCH_INPUT; |
| 953 params.duration_ms = 123; | 974 params.duration_ms = 123; |
| 954 params.position.SetPoint(87, -124); | 975 params.position.SetPoint(87, -124); |
| 955 | 976 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 987 EXPECT_TRUE(tap_target->GestureFinished()); | 1008 EXPECT_TRUE(tap_target->GestureFinished()); |
| 988 EXPECT_EQ(tap_target->position(), params.position); | 1009 EXPECT_EQ(tap_target->position(), params.position); |
| 989 EXPECT_EQ(tap_target->GetDuration().InMilliseconds(), params.duration_ms); | 1010 EXPECT_EQ(tap_target->GetDuration().InMilliseconds(), params.duration_ms); |
| 990 EXPECT_GE(GetTotalTime(), | 1011 EXPECT_GE(GetTotalTime(), |
| 991 base::TimeDelta::FromMilliseconds(params.duration_ms)); | 1012 base::TimeDelta::FromMilliseconds(params.duration_ms)); |
| 992 } | 1013 } |
| 993 | 1014 |
| 994 } // namespace | 1015 } // namespace |
| 995 | 1016 |
| 996 } // namespace content | 1017 } // namespace content |
| OLD | NEW |