| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_ACTION_FILTER_H_ |
| #define CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_ACTION_FILTER_H_ |
| |
| #include "base/basictypes.h" |
| #include "content/common/content_export.h" |
| #include "content/common/input/touch_action.h" |
| |
| namespace blink { |
| class WebGestureEvent; |
| } |
| |
| namespace content { |
| |
| // The TouchActionFilter is responsible for filtering scroll and pinch gesture |
| // events according to the CSS touch-action values the renderer has sent for |
| // each touch point. |
| // For details see the touch-action design doc at http://goo.gl/KcKbxQ. |
| class CONTENT_EXPORT TouchActionFilter { |
| public: |
| TouchActionFilter(); |
| |
| // Returns true if the supplied gesture event should be dropped based on |
| // the current touch-action state. |
| bool FilterGestureEvent(blink::WebGestureEvent* gesture_event); |
| |
| // Called when a set-touch-action message is received from the renderer |
| // for a touch start event that is currently in flight. |
| void OnSetTouchAction(content::TouchAction touch_action); |
| |
| // Must be called at least once between when the last gesture events for the |
| // previous touch sequence have passed through the touch action filter and the |
| // time the touch start for the next touch sequence has reached the |
| // renderer. It may be called multiple times during this interval. |
| void ResetTouchAction(); |
| |
| TouchAction allowed_touch_action() const { return allowed_touch_action_; } |
| |
| // Return the intersection of two TouchAction values. |
| static TouchAction Intersect(TouchAction ta1, TouchAction ta2); |
| |
| private: |
| bool ShouldSuppressScroll(const blink::WebGestureEvent& gesture_event); |
| bool FilterScrollEndingGesture(); |
| |
| // Whether GestureScroll events should be discarded due to touch-action. |
| bool drop_scroll_gesture_events_; |
| |
| // Whether GesturePinch events should be discarded due to touch-action. |
| bool drop_pinch_gesture_events_; |
| |
| // Whether a tap ending event in this sequence should be discarded because a |
| // previous GestureTapUnconfirmed event was turned into a GestureTap. |
| bool drop_current_tap_ending_event_; |
| |
| // True iff the touch action of the last TapUnconfirmed or Tap event was |
| // TOUCH_ACTION_AUTO. The double tap event depends on the touch action of the |
| // previous tap or tap unconfirmed. Only valid between a TapUnconfirmed or Tap |
| // and the next DoubleTap. |
| bool allow_current_double_tap_event_; |
| |
| // What touch actions are currently permitted. |
| TouchAction allowed_touch_action_; |
| |
| DISALLOW_COPY_AND_ASSIGN(TouchActionFilter); |
| }; |
| |
| } |
| #endif // CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_ACTION_FILTER_H_ |