| // Copyright 2014 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/common/input/gesture_event_stream_validator.h" | 
 |  | 
 | #include "content/common/input/synthetic_web_input_event_builders.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | using blink::WebInputEvent; | 
 | using blink::WebGestureEvent; | 
 |  | 
 | namespace content { | 
 | namespace { | 
 |  | 
 | const blink::WebGestureDevice kDefaultGestureDevice = | 
 |     blink::kWebGestureDeviceTouchscreen; | 
 |  | 
 | blink::WebGestureEvent Build(WebInputEvent::Type type) { | 
 |   blink::WebGestureEvent event = | 
 |       SyntheticWebGestureEventBuilder::Build(type, kDefaultGestureDevice); | 
 |   // Default to providing a (valid) non-zero fling velocity. | 
 |   if (type == WebInputEvent::kGestureFlingStart) | 
 |     event.data.fling_start.velocity_x = 5; | 
 |   return event; | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | TEST(GestureEventStreamValidator, ValidScroll) { | 
 |   GestureEventStreamValidator validator; | 
 |   std::string error_msg; | 
 |   WebGestureEvent event; | 
 |  | 
 |   event = Build(WebInputEvent::kGestureScrollBegin); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureScrollUpdate); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureScrollEnd); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 | } | 
 |  | 
 | TEST(GestureEventStreamValidator, InvalidScroll) { | 
 |   GestureEventStreamValidator validator; | 
 |   std::string error_msg; | 
 |   WebGestureEvent event; | 
 |  | 
 |   // No preceding ScrollBegin. | 
 |   event = Build(WebInputEvent::kGestureScrollUpdate); | 
 |   EXPECT_FALSE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_FALSE(error_msg.empty()); | 
 |  | 
 |   // No preceding ScrollBegin. | 
 |   event = Build(WebInputEvent::kGestureScrollEnd); | 
 |   EXPECT_FALSE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_FALSE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureScrollBegin); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   // Already scrolling. | 
 |   event = Build(WebInputEvent::kGestureScrollBegin); | 
 |   EXPECT_FALSE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_FALSE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureScrollEnd); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   // Scroll already ended. | 
 |   event = Build(WebInputEvent::kGestureScrollEnd); | 
 |   EXPECT_FALSE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_FALSE(error_msg.empty()); | 
 | } | 
 |  | 
 | TEST(GestureEventStreamValidator, ValidFling) { | 
 |   GestureEventStreamValidator validator; | 
 |   std::string error_msg; | 
 |   WebGestureEvent event; | 
 |  | 
 |   event = Build(WebInputEvent::kGestureScrollBegin); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureFlingStart); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 | } | 
 |  | 
 | TEST(GestureEventStreamValidator, InvalidFling) { | 
 |   GestureEventStreamValidator validator; | 
 |   std::string error_msg; | 
 |   WebGestureEvent event; | 
 |  | 
 |   // No preceding ScrollBegin. | 
 |   event = Build(WebInputEvent::kGestureFlingStart); | 
 |   EXPECT_FALSE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_FALSE(error_msg.empty()); | 
 |  | 
 |   // Zero velocity. | 
 |   event = Build(WebInputEvent::kGestureScrollBegin); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureFlingStart); | 
 |   event.data.fling_start.velocity_x = 0; | 
 |   event.data.fling_start.velocity_y = 0; | 
 |   EXPECT_FALSE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_FALSE(error_msg.empty()); | 
 | } | 
 |  | 
 | TEST(GestureEventStreamValidator, ValidPinch) { | 
 |   GestureEventStreamValidator validator; | 
 |   std::string error_msg; | 
 |   WebGestureEvent event; | 
 |  | 
 |   event = Build(WebInputEvent::kGesturePinchBegin); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGesturePinchUpdate); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGesturePinchEnd); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 | } | 
 |  | 
 | TEST(GestureEventStreamValidator, InvalidPinch) { | 
 |   GestureEventStreamValidator validator; | 
 |   std::string error_msg; | 
 |   WebGestureEvent event; | 
 |  | 
 |   // No preceding PinchBegin. | 
 |   event = Build(WebInputEvent::kGesturePinchUpdate); | 
 |   EXPECT_FALSE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_FALSE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGesturePinchBegin); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   // ScrollBegin while pinching. | 
 |   event = Build(WebInputEvent::kGestureScrollBegin); | 
 |   EXPECT_FALSE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_FALSE(error_msg.empty()); | 
 |  | 
 |   // ScrollEnd while pinching. | 
 |   event = Build(WebInputEvent::kGestureScrollEnd); | 
 |   EXPECT_FALSE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_FALSE(error_msg.empty()); | 
 |  | 
 |   // Pinch already begun. | 
 |   event = Build(WebInputEvent::kGesturePinchBegin); | 
 |   EXPECT_FALSE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_FALSE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGesturePinchEnd); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   // Pinch already ended. | 
 |   event = Build(WebInputEvent::kGesturePinchEnd); | 
 |   EXPECT_FALSE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_FALSE(error_msg.empty()); | 
 | } | 
 |  | 
 | TEST(GestureEventStreamValidator, ValidTap) { | 
 |   GestureEventStreamValidator validator; | 
 |   std::string error_msg; | 
 |   WebGestureEvent event; | 
 |  | 
 |   event = Build(WebInputEvent::kGestureTapDown); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureTapCancel); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureTapDown); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureTapUnconfirmed); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureTapCancel); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureTapDown); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureTap); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   // DoubleTap does not require a TapDown (unlike Tap, TapUnconfirmed and | 
 |   // TapCancel). | 
 |   event = Build(WebInputEvent::kGestureDoubleTap); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 | } | 
 |  | 
 | TEST(GestureEventStreamValidator, InvalidTap) { | 
 |   GestureEventStreamValidator validator; | 
 |   std::string error_msg; | 
 |   WebGestureEvent event; | 
 |  | 
 |   // No preceding TapDown. | 
 |   event = Build(WebInputEvent::kGestureTapUnconfirmed); | 
 |   EXPECT_FALSE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_FALSE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureTapCancel); | 
 |   EXPECT_FALSE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_FALSE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureTap); | 
 |   EXPECT_FALSE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_FALSE(error_msg.empty()); | 
 |  | 
 |   // TapDown already terminated. | 
 |   event = Build(WebInputEvent::kGestureTapDown); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureDoubleTap); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureTapCancel); | 
 |   EXPECT_FALSE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_FALSE(error_msg.empty()); | 
 |  | 
 |   // TapDown already terminated. | 
 |   event = Build(WebInputEvent::kGestureTapDown); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureTap); | 
 |   EXPECT_TRUE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_TRUE(error_msg.empty()); | 
 |  | 
 |   event = Build(WebInputEvent::kGestureTapCancel); | 
 |   EXPECT_FALSE(validator.Validate(event, &error_msg)); | 
 |   EXPECT_FALSE(error_msg.empty()); | 
 | } | 
 |  | 
 | }  // namespace content |