// 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/touch_event_stream_validator.h" #include "content/common/input/synthetic_web_input_event_builders.h" #include "content/common/input/web_touch_event_traits.h" #include "testing/gtest/include/gtest/gtest.h" using blink::WebInputEvent; using blink::WebTouchEvent; using blink::WebTouchPoint; namespace content { TEST(TouchEventStreamValidator, ValidTouchStream) { TouchEventStreamValidator validator; SyntheticWebTouchEvent event; std::string error_msg; event.PressPoint(0, 1); EXPECT_TRUE(validator.Validate(event, &error_msg)); EXPECT_TRUE(error_msg.empty()); event.ResetPoints(); event.PressPoint(1, 0); EXPECT_TRUE(validator.Validate(event, &error_msg)); EXPECT_TRUE(error_msg.empty()); event.ResetPoints(); event.MovePoint(1, 1, 1); EXPECT_TRUE(validator.Validate(event, &error_msg)); EXPECT_TRUE(error_msg.empty()); event.ResetPoints(); event.ReleasePoint(1); EXPECT_TRUE(validator.Validate(event, &error_msg)); EXPECT_TRUE(error_msg.empty()); event.ResetPoints(); event.MovePoint(0, -1, 0); EXPECT_TRUE(validator.Validate(event, &error_msg)); EXPECT_TRUE(error_msg.empty()); event.ResetPoints(); event.CancelPoint(0); EXPECT_TRUE(validator.Validate(event, &error_msg)); EXPECT_TRUE(error_msg.empty()); event.ResetPoints(); event.PressPoint(-1, -1); EXPECT_TRUE(validator.Validate(event, &error_msg)); EXPECT_TRUE(error_msg.empty()); } TEST(TouchEventStreamValidator, ResetOnNewTouchStream) { TouchEventStreamValidator validator; SyntheticWebTouchEvent event; std::string error_msg; event.PressPoint(0, 1); EXPECT_TRUE(validator.Validate(event, &error_msg)); EXPECT_TRUE(error_msg.empty()); event.ResetPoints(); event.CancelPoint(0); event.ResetPoints(); event.PressPoint(1, 0); EXPECT_TRUE(validator.Validate(event, &error_msg)); EXPECT_TRUE(error_msg.empty()); } TEST(TouchEventStreamValidator, MissedTouchStart) { TouchEventStreamValidator validator; SyntheticWebTouchEvent event; std::string error_msg; event.PressPoint(0, 1); EXPECT_TRUE(validator.Validate(event, &error_msg)); EXPECT_TRUE(error_msg.empty()); event.PressPoint(1, 0); event.ResetPoints(); event.PressPoint(1, 1); EXPECT_FALSE(validator.Validate(event, &error_msg)); EXPECT_FALSE(error_msg.empty()); } TEST(TouchEventStreamValidator, MissedTouchEnd) { TouchEventStreamValidator validator; SyntheticWebTouchEvent event; std::string error_msg; event.PressPoint(0, 1); EXPECT_TRUE(validator.Validate(event, &error_msg)); EXPECT_TRUE(error_msg.empty()); event.ResetPoints(); event.PressPoint(0, 1); EXPECT_TRUE(validator.Validate(event, &error_msg)); EXPECT_TRUE(error_msg.empty()); event.ResetPoints(); event.ReleasePoint(1); event.ResetPoints(); event.PressPoint(1, 1); EXPECT_FALSE(validator.Validate(event, &error_msg)); EXPECT_FALSE(error_msg.empty()); } TEST(TouchEventStreamValidator, EmptyEvent) { TouchEventStreamValidator validator; WebTouchEvent event; std::string error_msg; EXPECT_FALSE(validator.Validate(event, &error_msg)); EXPECT_FALSE(error_msg.empty()); } TEST(TouchEventStreamValidator, InvalidEventType) { TouchEventStreamValidator validator; WebTouchEvent event; std::string error_msg; event.type = WebInputEvent::GestureScrollBegin; event.touchesLength = 1; event.touches[0].state = WebTouchPoint::StatePressed; EXPECT_FALSE(validator.Validate(event, &error_msg)); EXPECT_FALSE(error_msg.empty()); } TEST(TouchEventStreamValidator, InvalidPointStates) { TouchEventStreamValidator validator; std::string error_msg; WebInputEvent::Type kTouchTypes[4] = { WebInputEvent::TouchStart, WebInputEvent::TouchMove, WebInputEvent::TouchEnd, WebInputEvent::TouchCancel, }; WebTouchPoint::State kValidTouchPointStatesForType[4] = { WebTouchPoint::StatePressed, WebTouchPoint::StateMoved, WebTouchPoint::StateReleased, WebTouchPoint::StateCancelled, }; SyntheticWebTouchEvent start; start.PressPoint(0, 0); for (size_t i = 0; i < 4; ++i) { // Always start with a touchstart to reset the stream validation. EXPECT_TRUE(validator.Validate(start, &error_msg)); EXPECT_TRUE(error_msg.empty()); WebTouchEvent event; event.touchesLength = 1; event.type = kTouchTypes[i]; for (size_t j = WebTouchPoint::StateUndefined; j <= WebTouchPoint::StateCancelled; ++j) { event.touches[0].state = static_cast(j); if (event.touches[0].state == kValidTouchPointStatesForType[i]) { EXPECT_TRUE(validator.Validate(event, &error_msg)); EXPECT_TRUE(error_msg.empty()); } else { EXPECT_FALSE(validator.Validate(event, &error_msg)); EXPECT_FALSE(error_msg.empty()); } } } } } // namespace content