11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/common/input/touch_event_stream_validator.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/common/input/synthetic_web_input_event_builders.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/common/input/web_touch_event_traits.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing blink::WebInputEvent; 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing blink::WebTouchEvent; 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing blink::WebTouchPoint; 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace content { 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(TouchEventStreamValidator, ValidTouchStream) { 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TouchEventStreamValidator validator; 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyntheticWebTouchEvent event; 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string error_msg; 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.PressPoint(0, 1); 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(validator.Validate(event, &error_msg)); 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(error_msg.empty()); 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.ResetPoints(); 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.PressPoint(1, 0); 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(validator.Validate(event, &error_msg)); 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(error_msg.empty()); 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.ResetPoints(); 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.MovePoint(1, 1, 1); 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(validator.Validate(event, &error_msg)); 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(error_msg.empty()); 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.ResetPoints(); 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.ReleasePoint(1); 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(validator.Validate(event, &error_msg)); 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(error_msg.empty()); 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.ResetPoints(); 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.MovePoint(0, -1, 0); 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(validator.Validate(event, &error_msg)); 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(error_msg.empty()); 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.ResetPoints(); 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.CancelPoint(0); 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(validator.Validate(event, &error_msg)); 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(error_msg.empty()); 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.ResetPoints(); 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.PressPoint(-1, -1); 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(validator.Validate(event, &error_msg)); 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(error_msg.empty()); 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(TouchEventStreamValidator, ResetOnNewTouchStream) { 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TouchEventStreamValidator validator; 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyntheticWebTouchEvent event; 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string error_msg; 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.PressPoint(0, 1); 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(validator.Validate(event, &error_msg)); 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(error_msg.empty()); 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.ResetPoints(); 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.CancelPoint(0); 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.ResetPoints(); 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.PressPoint(1, 0); 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(validator.Validate(event, &error_msg)); 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(error_msg.empty()); 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(TouchEventStreamValidator, MissedTouchStart) { 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TouchEventStreamValidator validator; 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyntheticWebTouchEvent event; 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string error_msg; 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.PressPoint(0, 1); 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(validator.Validate(event, &error_msg)); 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(error_msg.empty()); 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.PressPoint(1, 0); 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.ResetPoints(); 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.PressPoint(1, 1); 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(validator.Validate(event, &error_msg)); 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(error_msg.empty()); 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(TouchEventStreamValidator, MissedTouchEnd) { 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TouchEventStreamValidator validator; 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyntheticWebTouchEvent event; 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string error_msg; 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.PressPoint(0, 1); 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(validator.Validate(event, &error_msg)); 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(error_msg.empty()); 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.ResetPoints(); 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.PressPoint(0, 1); 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(validator.Validate(event, &error_msg)); 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(error_msg.empty()); 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.ResetPoints(); 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.ReleasePoint(1); 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.ResetPoints(); 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.PressPoint(1, 1); 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(validator.Validate(event, &error_msg)); 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(error_msg.empty()); 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(TouchEventStreamValidator, EmptyEvent) { 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TouchEventStreamValidator validator; 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebTouchEvent event; 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string error_msg; 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(validator.Validate(event, &error_msg)); 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(error_msg.empty()); 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(TouchEventStreamValidator, InvalidEventType) { 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TouchEventStreamValidator validator; 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebTouchEvent event; 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string error_msg; 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.type = WebInputEvent::GestureScrollBegin; 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.touchesLength = 1; 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.touches[0].state = WebTouchPoint::StatePressed; 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(validator.Validate(event, &error_msg)); 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(error_msg.empty()); 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(TouchEventStreamValidator, InvalidPointStates) { 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TouchEventStreamValidator validator; 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string error_msg; 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebInputEvent::Type kTouchTypes[4] = { 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebInputEvent::TouchStart, WebInputEvent::TouchMove, 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebInputEvent::TouchEnd, WebInputEvent::TouchCancel, 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebTouchPoint::State kValidTouchPointStatesForType[4] = { 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebTouchPoint::StatePressed, WebTouchPoint::StateMoved, 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebTouchPoint::StateReleased, WebTouchPoint::StateCancelled, 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyntheticWebTouchEvent start; 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci start.PressPoint(0, 0); 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t i = 0; i < 4; ++i) { 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Always start with a touchstart to reset the stream validation. 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(validator.Validate(start, &error_msg)); 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(error_msg.empty()); 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebTouchEvent event; 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.touchesLength = 1; 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.type = kTouchTypes[i]; 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t j = WebTouchPoint::StateUndefined; 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci j <= WebTouchPoint::StateCancelled; 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++j) { 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event.touches[0].state = static_cast<WebTouchPoint::State>(j); 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (event.touches[0].state == kValidTouchPointStatesForType[i]) { 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(validator.Validate(event, &error_msg)); 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(error_msg.empty()); 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(validator.Validate(event, &error_msg)); 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(error_msg.empty()); 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace content 174