diff options
author | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-23 06:56:10 +0000 |
---|---|---|
committer | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-23 06:56:10 +0000 |
commit | 14749ddb5187a551ea4cc03bff72ebf375c497b7 (patch) | |
tree | 1c22d49f542844035342b64f50de9c85e7eecc89 | |
parent | 48b581d45aa0947e81ddf73891435ff7d8147bd1 (diff) | |
download | chromium_src-14749ddb5187a551ea4cc03bff72ebf375c497b7.zip chromium_src-14749ddb5187a551ea4cc03bff72ebf375c497b7.tar.gz chromium_src-14749ddb5187a551ea4cc03bff72ebf375c497b7.tar.bz2 |
overscroll: Introduce a ratio-threshold for starting an overscroll gesture.
It is currently too easy to trigger a horizontal overscroll gesture when actually
doing a vertical scroll at an angle. Introduce a threshold for the direction of
the scrolls to cross before the overscroll mode is activated.
BUG=none
TBR=sky@chromium.org
Review URL: https://codereview.chromium.org/12316080
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@184307 0039d316-1c4b-4281-b951-d872f2087c98
3 files changed, 36 insertions, 35 deletions
diff --git a/content/browser/renderer_host/overscroll_configuration.cc b/content/browser/renderer_host/overscroll_configuration.cc index 16733a4..8d35269 100644 --- a/content/browser/renderer_host/overscroll_configuration.cc +++ b/content/browser/renderer_host/overscroll_configuration.cc @@ -11,7 +11,7 @@ namespace { float g_horiz_threshold_complete = 0.25f; float g_vert_threshold_complete = 0.20f; -float g_min_threshold_start = 30.f; +float g_min_threshold_start = 50.f; float g_horiz_resist_after = 30.f; float g_vert_resist_after = 30.f; diff --git a/content/browser/renderer_host/overscroll_controller.cc b/content/browser/renderer_host/overscroll_controller.cc index 65d0ccf..0b5925a 100644 --- a/content/browser/renderer_host/overscroll_controller.cc +++ b/content/browser/renderer_host/overscroll_controller.cc @@ -231,9 +231,10 @@ void OverscrollController::ProcessOverscroll(float delta_x, float delta_y) { // from the current direction, then always switch to no-overscroll mode first // to make sure that subsequent scroll events go through to the page first. OverscrollMode new_mode = OVERSCROLL_NONE; - if (fabs(overscroll_delta_x_) > fabs(overscroll_delta_y_)) + const float kMinRatio = 2.5; + if (fabs(overscroll_delta_x_) > fabs(overscroll_delta_y_) * kMinRatio) new_mode = overscroll_delta_x_ > 0.f ? OVERSCROLL_EAST : OVERSCROLL_WEST; - else + else if (fabs(overscroll_delta_y_) > fabs(overscroll_delta_x_) * kMinRatio) new_mode = overscroll_delta_y_ > 0.f ? OVERSCROLL_SOUTH : OVERSCROLL_NORTH; if (overscroll_mode_ == OVERSCROLL_NONE) { diff --git a/content/browser/renderer_host/render_widget_host_unittest.cc b/content/browser/renderer_host/render_widget_host_unittest.cc index 3900766..29e09e0 100644 --- a/content/browser/renderer_host/render_widget_host_unittest.cc +++ b/content/browser/renderer_host/render_widget_host_unittest.cc @@ -3217,11 +3217,11 @@ TEST_F(RenderWidgetHostTest, WheelScrollEventOverscrolls) { // Simulate wheel events. SimulateWheelEvent(0, -5, 0, true); // sent directly - SimulateWheelEvent(0, -10, 0, true); // enqueued + SimulateWheelEvent(0, -1, 0, true); // enqueued SimulateWheelEvent(-10, -3, 0, true); // coalesced into previous event SimulateWheelEvent(-15, -1, 0, true); // coalesced into previous event - SimulateWheelEvent(-10, -3, 0, true); // coalesced into previous event - SimulateWheelEvent(-20, 16, 1, true); // enqueued, different modifiers + SimulateWheelEvent(-30, -3, 0, true); // coalesced into previous event + SimulateWheelEvent(-20, 6, 1, true); // enqueued, different modifiers EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode()); EXPECT_EQ(1U, process_->sink().message_count()); process_->sink().ClearMessages(); @@ -3244,7 +3244,7 @@ TEST_F(RenderWidgetHostTest, WheelScrollEventOverscrolls) { INPUT_EVENT_ACK_STATE_NOT_CONSUMED); EXPECT_EQ(OVERSCROLL_WEST, host_->overscroll_mode()); EXPECT_EQ(OVERSCROLL_WEST, host_->overscroll_delegate()->current_mode()); - EXPECT_EQ(-55.f, host_->overscroll_delta_x()); + EXPECT_EQ(-75.f, host_->overscroll_delta_x()); EXPECT_EQ(-25.f, host_->overscroll_delegate()->delta_x()); EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y()); EXPECT_EQ(0U, process_->sink().message_count()); @@ -3280,13 +3280,13 @@ TEST_F(RenderWidgetHostTest, WheelScrollOverscrollToggle) { process_->sink().ClearMessages(); // Scroll some more to initiate an overscroll. - SimulateWheelEvent(20, -4, 0, true); + SimulateWheelEvent(40, -4, 0, true); EXPECT_EQ(1U, process_->sink().message_count()); SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode()); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode()); - EXPECT_EQ(40.f, host_->overscroll_delta_x()); + EXPECT_EQ(60.f, host_->overscroll_delta_x()); EXPECT_EQ(10.f, host_->overscroll_delegate()->delta_x()); EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y()); process_->sink().ClearMessages(); @@ -3308,13 +3308,13 @@ TEST_F(RenderWidgetHostTest, WheelScrollOverscrollToggle) { // Continue to scroll in the reverse direction enough to initiate overscroll // in that direction. - SimulateWheelEvent(-35, -2, 0, true); + SimulateWheelEvent(-55, -2, 0, true); EXPECT_EQ(1U, process_->sink().message_count()); SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); EXPECT_EQ(OVERSCROLL_WEST, host_->overscroll_mode()); EXPECT_EQ(OVERSCROLL_WEST, host_->overscroll_delegate()->current_mode()); - EXPECT_EQ(-55.f, host_->overscroll_delta_x()); + EXPECT_EQ(-75.f, host_->overscroll_delta_x()); EXPECT_EQ(-25.f, host_->overscroll_delegate()->delta_x()); EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y()); } @@ -3334,7 +3334,7 @@ TEST_F(RenderWidgetHostTest, ScrollEventsOverscrollWithFling) { process_->sink().ClearMessages(); // Scroll some more so as to not overscroll. - SimulateWheelEvent(10, -4, 0, true); + SimulateWheelEvent(20, -4, 0, true); EXPECT_EQ(1U, process_->sink().message_count()); SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); @@ -3343,13 +3343,13 @@ TEST_F(RenderWidgetHostTest, ScrollEventsOverscrollWithFling) { process_->sink().ClearMessages(); // Scroll some more to initiate an overscroll. - SimulateWheelEvent(20, -4, 0, true); + SimulateWheelEvent(30, -4, 0, true); EXPECT_EQ(1U, process_->sink().message_count()); SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode()); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode()); - EXPECT_EQ(40.f, host_->overscroll_delta_x()); + EXPECT_EQ(60.f, host_->overscroll_delta_x()); EXPECT_EQ(10.f, host_->overscroll_delegate()->delta_x()); EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y()); process_->sink().ClearMessages(); @@ -3381,7 +3381,7 @@ TEST_F(RenderWidgetHostTest, ScrollEventsOverscrollWithZeroFling) { process_->sink().ClearMessages(); // Scroll some more so as to not overscroll. - SimulateWheelEvent(10, -4, 0, true); + SimulateWheelEvent(20, -4, 0, true); EXPECT_EQ(1U, process_->sink().message_count()); SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); @@ -3390,13 +3390,13 @@ TEST_F(RenderWidgetHostTest, ScrollEventsOverscrollWithZeroFling) { process_->sink().ClearMessages(); // Scroll some more to initiate an overscroll. - SimulateWheelEvent(20, -4, 0, true); + SimulateWheelEvent(30, -4, 0, true); EXPECT_EQ(1U, process_->sink().message_count()); SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode()); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode()); - EXPECT_EQ(40.f, host_->overscroll_delta_x()); + EXPECT_EQ(60.f, host_->overscroll_delta_x()); EXPECT_EQ(10.f, host_->overscroll_delegate()->delta_x()); EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y()); process_->sink().ClearMessages(); @@ -3486,12 +3486,12 @@ TEST_F(RenderWidgetHostTest, GestureScrollOverscrolls) { // Send another gesture event and ACK as not being processed. This should // initiate the navigation gesture. - SimulateGestureScrollUpdateEvent(35, -5, 0); + SimulateGestureScrollUpdateEvent(55, -5, 0); SendInputEventACK(WebInputEvent::GestureScrollUpdate, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode()); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode()); - EXPECT_EQ(35.f, host_->overscroll_delta_x()); + EXPECT_EQ(55.f, host_->overscroll_delta_x()); EXPECT_EQ(-5.f, host_->overscroll_delta_y()); EXPECT_EQ(5.f, host_->overscroll_delegate()->delta_x()); EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y()); @@ -3504,7 +3504,7 @@ TEST_F(RenderWidgetHostTest, GestureScrollOverscrolls) { SimulateGestureScrollUpdateEvent(10, -5, 0); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode()); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode()); - EXPECT_EQ(45.f, host_->overscroll_delta_x()); + EXPECT_EQ(65.f, host_->overscroll_delta_x()); EXPECT_EQ(-10.f, host_->overscroll_delta_y()); EXPECT_EQ(15.f, host_->overscroll_delegate()->delta_x()); EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y()); @@ -3560,7 +3560,7 @@ TEST_F(RenderWidgetHostTest, GestureScrollDebounceOverscrolls) { EXPECT_EQ(2U, host_->GestureEventDebouncingQueueSize()); // Send another update event. This should get into the queue. - SimulateGestureScrollUpdateEvent(10, 5, 0); + SimulateGestureScrollUpdateEvent(30, 5, 0); EXPECT_EQ(0U, process_->sink().message_count()); EXPECT_EQ(2U, host_->GestureEventLastQueueEventSize()); EXPECT_EQ(0U, host_->GestureEventDebouncingQueueSize()); @@ -3594,7 +3594,7 @@ TEST_F(RenderWidgetHostTest, GestureScrollDebounceOverscrolls) { INPUT_EVENT_ACK_STATE_NOT_CONSUMED); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode()); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode()); - EXPECT_EQ(45.f, host_->overscroll_delta_x()); + EXPECT_EQ(65.f, host_->overscroll_delta_x()); EXPECT_EQ(15.f, host_->overscroll_delegate()->delta_x()); EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y()); EXPECT_EQ(0U, process_->sink().message_count()); @@ -3618,7 +3618,7 @@ TEST_F(RenderWidgetHostTest, GestureScrollDebounceTimerOverscroll) { INPUT_EVENT_ACK_STATE_CONSUMED); // Send update events. - SimulateGestureScrollUpdateEvent(35, -5, 0); + SimulateGestureScrollUpdateEvent(55, -5, 0); EXPECT_EQ(1U, host_->GestureEventLastQueueEventSize()); EXPECT_EQ(0U, host_->GestureEventDebouncingQueueSize()); EXPECT_TRUE(host_->ScrollingInProgress()); @@ -3637,7 +3637,7 @@ TEST_F(RenderWidgetHostTest, GestureScrollDebounceTimerOverscroll) { INPUT_EVENT_ACK_STATE_NOT_CONSUMED); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode()); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode()); - EXPECT_EQ(35.f, host_->overscroll_delta_x()); + EXPECT_EQ(55.f, host_->overscroll_delta_x()); EXPECT_EQ(5.f, host_->overscroll_delegate()->delta_x()); EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y()); EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize()); @@ -3702,19 +3702,19 @@ TEST_F(RenderWidgetHostTest, OverscrollWithTouchEvents) { // Another touch move event should reach the renderer since overscroll hasn't // started yet. - MoveTouchPoint(0, 45, 10); + MoveTouchPoint(0, 65, 10); SendTouchEvent(); EXPECT_EQ(1U, process_->sink().message_count()); process_->sink().ClearMessages(); SendInputEventACK(WebInputEvent::TouchMove, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); - SimulateGestureScrollUpdateEvent(25, 5, 0); + SimulateGestureScrollUpdateEvent(45, 5, 0); SendInputEventACK(WebInputEvent::GestureScrollUpdate, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode()); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode()); - EXPECT_EQ(45.f, host_->overscroll_delta_x()); + EXPECT_EQ(65.f, host_->overscroll_delta_x()); EXPECT_EQ(15.f, host_->overscroll_delegate()->delta_x()); EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y()); EXPECT_EQ(0U, host_->TouchEventQueueSize()); @@ -3723,13 +3723,13 @@ TEST_F(RenderWidgetHostTest, OverscrollWithTouchEvents) { // Try to send another touch event. Now that overscroll has started, the // controller should consume the touch event, and the touch-event queue should // remain empty. - MoveTouchPoint(0, 35, 5); + MoveTouchPoint(0, 55, 5); SendTouchEvent(); EXPECT_EQ(0U, process_->sink().message_count()); EXPECT_EQ(0U, host_->TouchEventQueueSize()); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode()); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode()); - EXPECT_EQ(45.f, host_->overscroll_delta_x()); + EXPECT_EQ(65.f, host_->overscroll_delta_x()); EXPECT_EQ(15.f, host_->overscroll_delegate()->delta_x()); EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y()); @@ -3738,18 +3738,18 @@ TEST_F(RenderWidgetHostTest, OverscrollWithTouchEvents) { EXPECT_EQ(0U, host_->TouchEventQueueSize()); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode()); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode()); - EXPECT_EQ(35.f, host_->overscroll_delta_x()); + EXPECT_EQ(55.f, host_->overscroll_delta_x()); EXPECT_EQ(5.f, host_->overscroll_delegate()->delta_x()); EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y()); - MoveTouchPoint(0, 235, 5); + MoveTouchPoint(0, 255, 5); SendTouchEvent(); SimulateGestureScrollUpdateEvent(200, 0, 0); EXPECT_EQ(0U, process_->sink().message_count()); EXPECT_EQ(0U, host_->TouchEventQueueSize()); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode()); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode()); - EXPECT_EQ(235.f, host_->overscroll_delta_x()); + EXPECT_EQ(255.f, host_->overscroll_delta_x()); EXPECT_EQ(205.f, host_->overscroll_delegate()->delta_x()); EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y()); @@ -3793,7 +3793,7 @@ TEST_F(RenderWidgetHostTest, TouchGestureEndDispatchedAfterOverscrollComplete) { EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode()); // Send update events. - SimulateGestureScrollUpdateEvent(35, -5, 0); + SimulateGestureScrollUpdateEvent(55, -5, 0); EXPECT_EQ(1U, host_->GestureEventLastQueueEventSize()); EXPECT_EQ(0U, host_->GestureEventDebouncingQueueSize()); EXPECT_TRUE(host_->ScrollingInProgress()); @@ -3808,7 +3808,7 @@ TEST_F(RenderWidgetHostTest, TouchGestureEndDispatchedAfterOverscrollComplete) { EXPECT_EQ(0U, process_->sink().message_count()); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode()); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode()); - EXPECT_EQ(35.f, host_->overscroll_delta_x()); + EXPECT_EQ(55.f, host_->overscroll_delta_x()); EXPECT_EQ(5.f, host_->overscroll_delegate()->delta_x()); EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y()); @@ -3865,7 +3865,7 @@ TEST_F(RenderWidgetHostTest, TouchGestureEndDispatchedAfterOverscrollComplete) { EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode()); EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode()); EXPECT_EQ(235.f, host_->overscroll_delta_x()); - EXPECT_EQ(205.f, host_->overscroll_delegate()->delta_x()); + EXPECT_EQ(185.f, host_->overscroll_delegate()->delta_x()); EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y()); // Send end event. |