Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(751)

Unified Diff: content/browser/renderer_host/input/touch_action_filter.cc

Issue 1131093002: Implement direction-specific touch-action values (chromium side). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Clarify the axis clearing code Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | content/browser/renderer_host/input/touch_action_filter_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/renderer_host/input/touch_action_filter.cc
diff --git a/content/browser/renderer_host/input/touch_action_filter.cc b/content/browser/renderer_host/input/touch_action_filter.cc
index 1f1855df7ea59de6478281efe61abd61c423e350..b12f283c3e107fa018cbb7d06d0007c3a128b011 100644
--- a/content/browser/renderer_host/input/touch_action_filter.cc
+++ b/content/browser/renderer_host/input/touch_action_filter.cc
@@ -13,6 +13,19 @@ using blink::WebInputEvent;
using blink::WebGestureEvent;
namespace content {
+namespace {
+
+// Actions on an axis are disallowed if the perpendicular axis has a filter set
+// and no filter is set for the queried axis.
+bool IsYAxisActionDisallowed(TouchAction action) {
+ return ((action & TOUCH_ACTION_PAN_X) && !(action & TOUCH_ACTION_PAN_Y));
+}
+
+bool IsXAxisActionDisallowed(TouchAction action) {
+ return ((action & TOUCH_ACTION_PAN_Y) && !(action & TOUCH_ACTION_PAN_X));
+}
+
+} // namespace
TouchActionFilter::TouchActionFilter() :
drop_scroll_gesture_events_(false),
@@ -25,20 +38,22 @@ TouchActionFilter::TouchActionFilter() :
bool TouchActionFilter::FilterGestureEvent(WebGestureEvent* gesture_event) {
// Filter for allowable touch actions first (eg. before the TouchEventQueue
// can decide to send a touch cancel event).
- switch(gesture_event->type) {
+ switch (gesture_event->type) {
case WebInputEvent::GestureScrollBegin:
DCHECK(!drop_scroll_gesture_events_);
drop_scroll_gesture_events_ = ShouldSuppressScroll(*gesture_event);
return drop_scroll_gesture_events_;
case WebInputEvent::GestureScrollUpdate:
- if (drop_scroll_gesture_events_)
+ if (drop_scroll_gesture_events_) {
return true;
- else {
- if (allowed_touch_action_ == TOUCH_ACTION_PAN_X) {
+ } else {
+ // Scrolls restricted to a specific axis shouldn't permit movement
+ // in the perpendicular axis.
+ if (IsYAxisActionDisallowed(allowed_touch_action_)) {
gesture_event->data.scrollUpdate.deltaY = 0;
gesture_event->data.scrollUpdate.velocityY = 0;
- } else if (allowed_touch_action_ == TOUCH_ACTION_PAN_Y) {
+ } else if (IsXAxisActionDisallowed(allowed_touch_action_)) {
gesture_event->data.scrollUpdate.deltaX = 0;
gesture_event->data.scrollUpdate.velocityX = 0;
}
@@ -52,9 +67,11 @@ bool TouchActionFilter::FilterGestureEvent(WebGestureEvent* gesture_event) {
DCHECK(gesture_event->data.flingStart.velocityX ||
gesture_event->data.flingStart.velocityY);
if (!drop_scroll_gesture_events_) {
- if (allowed_touch_action_ == TOUCH_ACTION_PAN_X)
+ // Flings restricted to a specific axis shouldn't permit velocity
+ // in the perpendicular axis.
+ if (IsYAxisActionDisallowed(allowed_touch_action_))
gesture_event->data.flingStart.velocityY = 0;
- if (allowed_touch_action_ == TOUCH_ACTION_PAN_Y)
+ else if (IsXAxisActionDisallowed(allowed_touch_action_))
gesture_event->data.flingStart.velocityX = 0;
// As the renderer expects a scroll-ending event, but does not expect a
// zero-velocity fling, convert the now zero-velocity fling accordingly.
@@ -184,9 +201,27 @@ bool TouchActionFilter::ShouldSuppressScroll(
// Determine the primary initial axis of the scroll, and check whether
// panning along that axis is permitted.
if (fabs(gesture_event.data.scrollBegin.deltaXHint) >
- fabs(gesture_event.data.scrollBegin.deltaYHint))
- return !(allowed_touch_action_ & TOUCH_ACTION_PAN_X);
- return !(allowed_touch_action_ & TOUCH_ACTION_PAN_Y);
+ fabs(gesture_event.data.scrollBegin.deltaYHint)) {
+ if (gesture_event.data.scrollBegin.deltaXHint > 0 &&
+ allowed_touch_action_ & TOUCH_ACTION_PAN_LEFT) {
+ return false;
+ } else if (gesture_event.data.scrollBegin.deltaXHint < 0 &&
+ allowed_touch_action_ & TOUCH_ACTION_PAN_RIGHT) {
+ return false;
+ } else {
+ return true;
+ }
+ } else {
+ if (gesture_event.data.scrollBegin.deltaYHint > 0 &&
+ allowed_touch_action_ & TOUCH_ACTION_PAN_UP) {
+ return false;
+ } else if (gesture_event.data.scrollBegin.deltaYHint < 0 &&
+ allowed_touch_action_ & TOUCH_ACTION_PAN_DOWN) {
+ return false;
+ } else {
+ return true;
+ }
+ }
}
TouchAction TouchActionFilter::Intersect(TouchAction ta1, TouchAction ta2) {
@@ -203,4 +238,4 @@ TouchAction TouchActionFilter::Intersect(TouchAction ta1, TouchAction ta2) {
return static_cast<TouchAction>(ta1 & ta2);
}
-}
+} // namespace content
« no previous file with comments | « no previous file | content/browser/renderer_host/input/touch_action_filter_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698