Index: content/browser/renderer_host/input/touch_action_filter_unittest.cc |
diff --git a/content/browser/renderer_host/input/touch_action_filter_unittest.cc b/content/browser/renderer_host/input/touch_action_filter_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..28526ee0bdd37bd28bccb7ea1f7a38951ffaa93c |
--- /dev/null |
+++ b/content/browser/renderer_host/input/touch_action_filter_unittest.cc |
@@ -0,0 +1,100 @@ |
+// 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. |
+ |
+#include "content/browser/renderer_host/input/touch_action_filter.h" |
+#include "content/browser/renderer_host/input/synthetic_web_input_event_builders.h" |
+#include "content/port/browser/event_with_latency_info.h" |
+#include "content/port/common/input_event_ack_state.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "third_party/WebKit/public/web/WebInputEvent.h" |
+ |
+using blink::WebGestureEvent; |
+using blink::WebInputEvent; |
+ |
+namespace content { |
+ |
+TEST(TouchActionFilterTest, SimpleFilter) { |
+ TouchActionFilter filter; |
+ |
+ const WebGestureEvent scrollBegin = SyntheticWebGestureEventBuilder::Build( |
+ WebInputEvent::GestureScrollBegin, WebGestureEvent::Touchscreen); |
+ const WebGestureEvent scrollUpdate = |
+ SyntheticWebGestureEventBuilder::BuildScrollUpdate(0, 10, 0); |
+ const WebGestureEvent scrollEnd = SyntheticWebGestureEventBuilder::Build( |
+ WebInputEvent::GestureScrollEnd, WebGestureEvent::Touchscreen); |
+ const WebGestureEvent tap = SyntheticWebGestureEventBuilder::Build( |
+ WebInputEvent::GestureTap, WebGestureEvent::Touchscreen); |
+ |
+ // No events filtered by default. |
+ EXPECT_FALSE(filter.FilterGestureEvent(scrollBegin)); |
+ EXPECT_FALSE(filter.FilterGestureEvent(scrollUpdate)); |
+ EXPECT_FALSE(filter.FilterGestureEvent(scrollEnd)); |
+ EXPECT_FALSE(filter.FilterGestureEvent(tap)); |
+ |
+ // TOUCH_ACTION_AUTO doesn't cause any filtering. |
+ filter.OnSetTouchAction(0, TOUCH_ACTION_AUTO); |
+ EXPECT_FALSE(filter.FilterGestureEvent(scrollBegin)); |
+ EXPECT_FALSE(filter.FilterGestureEvent(scrollUpdate)); |
+ EXPECT_FALSE(filter.FilterGestureEvent(scrollEnd)); |
+ |
+ // TOUCH_ACTION_NONE filters out all scroll events, but no other events. |
+ filter.OnSetTouchAction(0, TOUCH_ACTION_NONE); |
+ EXPECT_FALSE(filter.FilterGestureEvent(tap)); |
+ EXPECT_TRUE(filter.FilterGestureEvent(scrollBegin)); |
+ EXPECT_TRUE(filter.FilterGestureEvent(scrollUpdate)); |
+ EXPECT_TRUE(filter.FilterGestureEvent(scrollUpdate)); |
+ EXPECT_TRUE(filter.FilterGestureEvent(scrollEnd)); |
+ |
+ // After the end of a gesture the state is reset. |
+ EXPECT_FALSE(filter.FilterGestureEvent(scrollBegin)); |
+ EXPECT_FALSE(filter.FilterGestureEvent(scrollUpdate)); |
+ EXPECT_FALSE(filter.FilterGestureEvent(scrollEnd)); |
+ |
+ // Setting touch action doesn't impact any in-progress gestures. |
+ EXPECT_FALSE(filter.FilterGestureEvent(scrollBegin)); |
+ filter.OnSetTouchAction(0, TOUCH_ACTION_NONE); |
+ EXPECT_FALSE(filter.FilterGestureEvent(scrollUpdate)); |
+ EXPECT_FALSE(filter.FilterGestureEvent(scrollEnd)); |
+ |
+ // And the state is still cleared for the next gesture. |
+ EXPECT_FALSE(filter.FilterGestureEvent(scrollBegin)); |
+ EXPECT_FALSE(filter.FilterGestureEvent(scrollEnd)); |
+ |
+ // Changing the touch action during a gesture has no effect. |
+ filter.OnSetTouchAction(0, TOUCH_ACTION_NONE); |
+ EXPECT_TRUE(filter.FilterGestureEvent(scrollBegin)); |
+ filter.OnSetTouchAction(0, TOUCH_ACTION_AUTO); |
+ EXPECT_TRUE(filter.FilterGestureEvent(scrollUpdate)); |
+ EXPECT_TRUE(filter.FilterGestureEvent(scrollUpdate)); |
+ EXPECT_TRUE(filter.FilterGestureEvent(scrollEnd)); |
+} |
+ |
+TEST(TouchActionFilterTest, MultiTouch) { |
+ TouchActionFilter filter; |
+ |
+ const WebGestureEvent scrollBegin = SyntheticWebGestureEventBuilder::Build( |
+ WebInputEvent::GestureScrollBegin, WebGestureEvent::Touchscreen); |
+ const WebGestureEvent scrollUpdate = |
+ SyntheticWebGestureEventBuilder::BuildScrollUpdate(0, 10, 0); |
+ const WebGestureEvent scrollEnd = SyntheticWebGestureEventBuilder::Build( |
+ WebInputEvent::GestureScrollEnd, WebGestureEvent::Touchscreen); |
+ |
+ // For multiple points, the intersection is what matters. |
+ filter.OnSetTouchAction(0, TOUCH_ACTION_NONE); |
+ filter.OnSetTouchAction(1, TOUCH_ACTION_AUTO); |
+ EXPECT_TRUE(filter.FilterGestureEvent(scrollBegin)); |
+ EXPECT_TRUE(filter.FilterGestureEvent(scrollUpdate)); |
+ EXPECT_TRUE(filter.FilterGestureEvent(scrollUpdate)); |
+ EXPECT_TRUE(filter.FilterGestureEvent(scrollEnd)); |
+ |
+ filter.OnSetTouchAction(0, TOUCH_ACTION_AUTO); |
+ filter.OnSetTouchAction(1, TOUCH_ACTION_NONE); |
+ filter.OnSetTouchAction(2, TOUCH_ACTION_AUTO); |
+ EXPECT_TRUE(filter.FilterGestureEvent(scrollBegin)); |
+ EXPECT_TRUE(filter.FilterGestureEvent(scrollUpdate)); |
+ EXPECT_TRUE(filter.FilterGestureEvent(scrollUpdate)); |
+ EXPECT_TRUE(filter.FilterGestureEvent(scrollEnd)); |
+} |
+ |
+} // namespace content |