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