summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-14 19:56:31 +0000
committertdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-14 19:56:31 +0000
commit7d4d18b6273f37789dc4854ad54212ad64021168 (patch)
treea68cbf7e3efea0c2812f0e799736c74dd047a51f
parentbd36e178cbf69f4ba85d23c01f06c6c50106e4f4 (diff)
downloadchromium_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
-rw-r--r--content/browser/renderer_host/input/input_router_impl.cc28
-rw-r--r--content/browser/renderer_host/input/input_router_impl_unittest.cc4
-rw-r--r--content/browser/renderer_host/input/touch_event_queue.cc39
-rw-r--r--content/browser/renderer_host/input/touch_event_queue.h16
-rw-r--r--content/browser/renderer_host/input/touch_event_queue_unittest.cc7
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) {