diff options
author | tdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-14 19:56:31 +0000 |
---|---|---|
committer | tdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-14 19:56:31 +0000 |
commit | 7d4d18b6273f37789dc4854ad54212ad64021168 (patch) | |
tree | a68cbf7e3efea0c2812f0e799736c74dd047a51f | |
parent | bd36e178cbf69f4ba85d23c01f06c6c50106e4f4 (diff) | |
download | chromium_src-7d4d18b6273f37789dc4854ad54212ad64021168.zip chromium_src-7d4d18b6273f37789dc4854ad54212ad64021168.tar.gz chromium_src-7d4d18b6273f37789dc4854ad54212ad64021168.tar.bz2 |
Don't send touch move events within the slop region in Aura.
This brings Aura into line with Android behaviour.
BUG=334040
TEST=TouchEventQueueTest.*Suppression*
Review URL: https://codereview.chromium.org/163983004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@251400 0039d316-1c4b-4281-b951-d872f2087c98
5 files changed, 37 insertions, 57 deletions
diff --git a/content/browser/renderer_host/input/input_router_impl.cc b/content/browser/renderer_host/input/input_router_impl.cc index e91c904..3b68845 100644 --- a/content/browser/renderer_host/input/input_router_impl.cc +++ b/content/browser/renderer_host/input/input_router_impl.cc @@ -32,6 +32,8 @@ #if defined(OS_ANDROID) #include "ui/gfx/android/view_configuration.h" #include "ui/gfx/screen.h" +#else +#include "ui/events/gestures/gesture_configuration.h" #endif using base::Time; @@ -48,7 +50,8 @@ namespace { // TODO(jdduke): Instead of relying on command line flags or conditional // conditional compilation here, we should instead use an InputRouter::Settings -// construct, supplied and customized by the RenderWidgetHostView. +// construct, supplied and customized by the RenderWidgetHostView. See +// crbug.com/343917. bool GetTouchAckTimeoutDelayMs(size_t* touch_ack_timeout_delay_ms) { CommandLine* parsed_command_line = CommandLine::ForCurrentProcess(); if (!parsed_command_line->HasSwitch(switches::kTouchAckTimeoutDelayMs)) @@ -65,17 +68,20 @@ bool GetTouchAckTimeoutDelayMs(size_t* touch_ack_timeout_delay_ms) { } #if defined(OS_ANDROID) -bool GetTouchMoveSlopSuppressionLengthDips(double* touch_slop_length_dips) { +double GetTouchMoveSlopSuppressionLengthDips() { const double touch_slop_length_pixels = static_cast<double>(gfx::ViewConfiguration::GetTouchSlopInPixels()); const double device_scale_factor = gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().device_scale_factor(); - *touch_slop_length_dips = touch_slop_length_pixels / device_scale_factor; - return true; + return touch_slop_length_pixels / device_scale_factor; +} +#elif defined(USE_AURA) +double GetTouchMoveSlopSuppressionLengthDips() { + return ui::GestureConfiguration::max_touch_move_in_pixels_for_click(); } #else -bool GetTouchMoveSlopSuppressionLengthDips(double* touch_slop_length_dips) { - return false; +double GetTouchMoveSlopSuppressionLengthDips() { + return 0; } #endif @@ -130,18 +136,12 @@ InputRouterImpl::InputRouterImpl(IPC::Sender* sender, DCHECK(sender); DCHECK(client); DCHECK(ack_handler); - touch_event_queue_.reset(new TouchEventQueue(this)); + touch_event_queue_.reset( + new TouchEventQueue(this, GetTouchMoveSlopSuppressionLengthDips())); touch_ack_timeout_enabled_ = GetTouchAckTimeoutDelayMs(&touch_ack_timeout_delay_ms_); touch_event_queue_->SetAckTimeoutEnabled(touch_ack_timeout_enabled_, touch_ack_timeout_delay_ms_); - - double touch_move_slop_suppression_length_dips = 0; - if (GetTouchMoveSlopSuppressionLengthDips( - &touch_move_slop_suppression_length_dips)) { - touch_event_queue_->SetTouchMoveSlopSuppressionEnabled( - true, touch_move_slop_suppression_length_dips); - } } InputRouterImpl::~InputRouterImpl() {} diff --git a/content/browser/renderer_host/input/input_router_impl_unittest.cc b/content/browser/renderer_host/input/input_router_impl_unittest.cc index 3b04300..ff3baaf 100644 --- a/content/browser/renderer_host/input/input_router_impl_unittest.cc +++ b/content/browser/renderer_host/input/input_router_impl_unittest.cc @@ -620,12 +620,12 @@ TEST_F(InputRouterImplTest, AckedTouchEventState) { // Move the finger. timestamp += base::TimeDelta::FromSeconds(10); - MoveTouchPoint(0, 5, 5); + MoveTouchPoint(0, 500, 500); SetTouchTimestamp(timestamp); SendTouchEvent(); EXPECT_FALSE(TouchEventQueueEmpty()); expected_events.push_back(new ui::TouchEvent(ui::ET_TOUCH_MOVED, - gfx::Point(5, 5), 0, timestamp)); + gfx::Point(500, 500), 0, timestamp)); // Now press a second finger. timestamp += base::TimeDelta::FromSeconds(10); diff --git a/content/browser/renderer_host/input/touch_event_queue.cc b/content/browser/renderer_host/input/touch_event_queue.cc index 6116681..b32537d 100644 --- a/content/browser/renderer_host/input/touch_event_queue.cc +++ b/content/browser/renderer_host/input/touch_event_queue.cc @@ -176,8 +176,9 @@ class TouchEventQueue::TouchTimeoutHandler { // a given slop region, unless the touchstart is preventDefault'ed. class TouchEventQueue::TouchMoveSlopSuppressor { public: - TouchMoveSlopSuppressor() - : slop_suppression_length_dips_squared_(0), + TouchMoveSlopSuppressor(double slop_suppression_length_dips) + : slop_suppression_length_dips_squared_(slop_suppression_length_dips * + slop_suppression_length_dips), suppressing_touch_moves_(false) {} bool FilterEvent(const WebTouchEvent& event) { @@ -210,12 +211,6 @@ class TouchEventQueue::TouchMoveSlopSuppressor { suppressing_touch_moves_ = false; } - // Note: If a touch sequence is in-progress, suppression may not take effect - // until the subsequent sequence. - void set_slop_length_dips(double length_dips) { - slop_suppression_length_dips_squared_ = length_dips * length_dips; - } - private: double slop_suppression_length_dips_squared_; gfx::PointF touch_sequence_start_position_; @@ -292,12 +287,15 @@ class CoalescedWebTouchEvent { DISALLOW_COPY_AND_ASSIGN(CoalescedWebTouchEvent); }; -TouchEventQueue::TouchEventQueue(TouchEventQueueClient* client) +TouchEventQueue::TouchEventQueue(TouchEventQueueClient* client, + double touchmove_suppression_length_dips) : client_(client), dispatching_touch_ack_(NULL), dispatching_touch_(false), touch_filtering_state_(TOUCH_FILTERING_STATE_DEFAULT), - ack_timeout_enabled_(false) { + ack_timeout_enabled_(false), + touchmove_slop_suppressor_( + new TouchMoveSlopSuppressor(touchmove_suppression_length_dips)) { DCHECK(client); } @@ -348,8 +346,7 @@ void TouchEventQueue::ProcessTouchAck(InputEventAckState ack_result, if (timeout_handler_ && timeout_handler_->ConfirmTouchEvent(ack_result)) return; - if (touchmove_slop_suppressor_) - touchmove_slop_suppressor_->ConfirmTouchEvent(ack_result); + touchmove_slop_suppressor_->ConfirmTouchEvent(ack_result); if (touch_queue_.empty()) return; @@ -491,20 +488,6 @@ void TouchEventQueue::SetAckTimeoutEnabled(bool enabled, timeout_handler_.reset(new TouchTimeoutHandler(this, ack_timeout_delay_ms)); } -void TouchEventQueue::SetTouchMoveSlopSuppressionEnabled( - bool enabled, - double slop_length_dips) { - if (!enabled) { - touchmove_slop_suppressor_.reset(); - return; - } - - if (!touchmove_slop_suppressor_) - touchmove_slop_suppressor_.reset(new TouchMoveSlopSuppressor()); - - touchmove_slop_suppressor_->set_slop_length_dips(slop_length_dips); -} - bool TouchEventQueue::IsTimeoutRunningForTesting() const { return timeout_handler_ && timeout_handler_->IsTimeoutTimerRunning(); } @@ -553,10 +536,8 @@ TouchEventQueue::FilterBeforeForwarding(const WebTouchEvent& event) { if (timeout_handler_ && timeout_handler_->FilterEvent(event)) return ACK_WITH_NO_CONSUMER_EXISTS; - if (touchmove_slop_suppressor_ && - touchmove_slop_suppressor_->FilterEvent(event)) { + if (touchmove_slop_suppressor_->FilterEvent(event)) return ACK_WITH_NOT_CONSUMED; - } if (touch_filtering_state_ == DROP_ALL_TOUCHES) return ACK_WITH_NO_CONSUMER_EXISTS; diff --git a/content/browser/renderer_host/input/touch_event_queue.h b/content/browser/renderer_host/input/touch_event_queue.h index 07dee38..a3d3c94 100644 --- a/content/browser/renderer_host/input/touch_event_queue.h +++ b/content/browser/renderer_host/input/touch_event_queue.h @@ -37,8 +37,11 @@ class CONTENT_EXPORT TouchEventQueueClient { class CONTENT_EXPORT TouchEventQueue { public: - // The |client| must outlive the TouchEventQueue. - explicit TouchEventQueue(TouchEventQueueClient* client); + // The |client| must outlive the TouchEventQueue. If + // |touchmove_suppression_length_dips| <= 0, touch move suppression is + // disabled. + TouchEventQueue(TouchEventQueueClient* client, + double touchmove_suppression_length_dips); ~TouchEventQueue(); // Adds an event to the queue. The event may be coalesced with previously @@ -70,11 +73,6 @@ class CONTENT_EXPORT TouchEventQueue { // touch sequence. void SetAckTimeoutEnabled(bool enabled, size_t ack_timeout_delay_ms); - // Sets whether touchmove's within a slop region will be suppressed if the - // preceding touchstart was not preventDefault'ed. - void SetTouchMoveSlopSuppressionEnabled(bool enabled, - double slop_length_dips); - bool empty() const WARN_UNUSED_RESULT { return touch_queue_.empty(); } @@ -161,8 +159,8 @@ class CONTENT_EXPORT TouchEventQueue { bool ack_timeout_enabled_; scoped_ptr<TouchTimeoutHandler> timeout_handler_; - // Optional suppression of TouchMove's within a slop region when a sequence - // has not yet been preventDefaulted, disabled by default. + // Suppression of TouchMove's within a slop region when a sequence has not yet + // been preventDefaulted. scoped_ptr<TouchMoveSlopSuppressor> touchmove_slop_suppressor_; DISALLOW_COPY_AND_ASSIGN(TouchEventQueue); diff --git a/content/browser/renderer_host/input/touch_event_queue_unittest.cc b/content/browser/renderer_host/input/touch_event_queue_unittest.cc index fcd11f0a..2ced9d9 100644 --- a/content/browser/renderer_host/input/touch_event_queue_unittest.cc +++ b/content/browser/renderer_host/input/touch_event_queue_unittest.cc @@ -34,7 +34,7 @@ class TouchEventQueueTest : public testing::Test, // testing::Test virtual void SetUp() OVERRIDE { - queue_.reset(new TouchEventQueue(this)); + queue_.reset(new TouchEventQueue(this, 0)); queue_->OnHasTouchEventHandlers(true); } @@ -77,8 +77,9 @@ class TouchEventQueueTest : public testing::Test, queue_->SetAckTimeoutEnabled(true, timeout_delay_ms); } - void SetUpForTouchMoveSlopTesting(double slop_length) { - queue_->SetTouchMoveSlopSuppressionEnabled(true, slop_length); + void SetUpForTouchMoveSlopTesting(double slop_length_dips) { + queue_.reset(new TouchEventQueue(this, slop_length_dips)); + queue_->OnHasTouchEventHandlers(true); } void SendTouchEvent(const WebTouchEvent& event) { |