1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "content/common/input/gesture_event_stream_validator.h" 6 7#include "content/common/input/synthetic_web_input_event_builders.h" 8#include "testing/gtest/include/gtest/gtest.h" 9 10using blink::WebInputEvent; 11using blink::WebGestureEvent; 12 13namespace content { 14namespace { 15 16const blink::WebGestureDevice kDefaultGestureDevice = 17 blink::WebGestureDeviceTouchscreen; 18 19blink::WebGestureEvent Build(WebInputEvent::Type type) { 20 return SyntheticWebGestureEventBuilder::Build(type, kDefaultGestureDevice); 21} 22 23} // namespace 24 25TEST(GestureEventStreamValidator, ValidScroll) { 26 GestureEventStreamValidator validator; 27 std::string error_msg; 28 WebGestureEvent event; 29 30 event = Build(WebInputEvent::GestureScrollBegin); 31 EXPECT_TRUE(validator.Validate(event, &error_msg)); 32 EXPECT_TRUE(error_msg.empty()); 33 34 event = Build(WebInputEvent::GestureScrollUpdate); 35 EXPECT_TRUE(validator.Validate(event, &error_msg)); 36 EXPECT_TRUE(error_msg.empty()); 37 38 event = Build(WebInputEvent::GestureScrollEnd); 39 EXPECT_TRUE(validator.Validate(event, &error_msg)); 40 EXPECT_TRUE(error_msg.empty()); 41} 42 43TEST(GestureEventStreamValidator, InvalidScroll) { 44 GestureEventStreamValidator validator; 45 std::string error_msg; 46 WebGestureEvent event; 47 48 // No preceding ScrollBegin. 49 event = Build(WebInputEvent::GestureScrollUpdate); 50 EXPECT_FALSE(validator.Validate(event, &error_msg)); 51 EXPECT_FALSE(error_msg.empty()); 52 53 // No preceding ScrollBegin. 54 event = Build(WebInputEvent::GestureScrollEnd); 55 EXPECT_FALSE(validator.Validate(event, &error_msg)); 56 EXPECT_FALSE(error_msg.empty()); 57 58 event = Build(WebInputEvent::GestureScrollBegin); 59 EXPECT_TRUE(validator.Validate(event, &error_msg)); 60 EXPECT_TRUE(error_msg.empty()); 61 62 // Already scrolling. 63 event = Build(WebInputEvent::GestureScrollBegin); 64 EXPECT_FALSE(validator.Validate(event, &error_msg)); 65 EXPECT_FALSE(error_msg.empty()); 66 67 event = Build(WebInputEvent::GestureScrollEnd); 68 EXPECT_TRUE(validator.Validate(event, &error_msg)); 69 EXPECT_TRUE(error_msg.empty()); 70 71 // Scroll already ended. 72 event = Build(WebInputEvent::GestureScrollEnd); 73 EXPECT_FALSE(validator.Validate(event, &error_msg)); 74 EXPECT_FALSE(error_msg.empty()); 75} 76 77TEST(GestureEventStreamValidator, ValidFling) { 78 GestureEventStreamValidator validator; 79 std::string error_msg; 80 WebGestureEvent event; 81 82 event = Build(WebInputEvent::GestureScrollBegin); 83 EXPECT_TRUE(validator.Validate(event, &error_msg)); 84 EXPECT_TRUE(error_msg.empty()); 85 86 event = Build(WebInputEvent::GestureFlingStart); 87 EXPECT_TRUE(validator.Validate(event, &error_msg)); 88 EXPECT_TRUE(error_msg.empty()); 89} 90 91TEST(GestureEventStreamValidator, InvalidFling) { 92 GestureEventStreamValidator validator; 93 std::string error_msg; 94 WebGestureEvent event; 95 96 // No preceding ScrollBegin. 97 event = Build(WebInputEvent::GestureFlingStart); 98 EXPECT_FALSE(validator.Validate(event, &error_msg)); 99 EXPECT_FALSE(error_msg.empty()); 100} 101 102TEST(GestureEventStreamValidator, ValidPinch) { 103 GestureEventStreamValidator validator; 104 std::string error_msg; 105 WebGestureEvent event; 106 107 event = Build(WebInputEvent::GesturePinchBegin); 108 EXPECT_TRUE(validator.Validate(event, &error_msg)); 109 EXPECT_TRUE(error_msg.empty()); 110 111 event = Build(WebInputEvent::GesturePinchUpdate); 112 EXPECT_TRUE(validator.Validate(event, &error_msg)); 113 EXPECT_TRUE(error_msg.empty()); 114 115 event = Build(WebInputEvent::GesturePinchEnd); 116 EXPECT_TRUE(validator.Validate(event, &error_msg)); 117 EXPECT_TRUE(error_msg.empty()); 118} 119 120TEST(GestureEventStreamValidator, InvalidPinch) { 121 GestureEventStreamValidator validator; 122 std::string error_msg; 123 WebGestureEvent event; 124 125 // No preceding PinchBegin. 126 event = Build(WebInputEvent::GesturePinchUpdate); 127 EXPECT_FALSE(validator.Validate(event, &error_msg)); 128 EXPECT_FALSE(error_msg.empty()); 129 130 event = Build(WebInputEvent::GesturePinchBegin); 131 EXPECT_TRUE(validator.Validate(event, &error_msg)); 132 EXPECT_TRUE(error_msg.empty()); 133 134 // ScrollBegin while pinching. 135 event = Build(WebInputEvent::GestureScrollBegin); 136 EXPECT_FALSE(validator.Validate(event, &error_msg)); 137 EXPECT_FALSE(error_msg.empty()); 138 139 // ScrollEnd while pinching. 140 event = Build(WebInputEvent::GestureScrollEnd); 141 EXPECT_FALSE(validator.Validate(event, &error_msg)); 142 EXPECT_FALSE(error_msg.empty()); 143 144 // Pinch already begun. 145 event = Build(WebInputEvent::GesturePinchBegin); 146 EXPECT_FALSE(validator.Validate(event, &error_msg)); 147 EXPECT_FALSE(error_msg.empty()); 148 149 event = Build(WebInputEvent::GesturePinchEnd); 150 EXPECT_TRUE(validator.Validate(event, &error_msg)); 151 EXPECT_TRUE(error_msg.empty()); 152 153 // Pinch already ended. 154 event = Build(WebInputEvent::GesturePinchEnd); 155 EXPECT_FALSE(validator.Validate(event, &error_msg)); 156 EXPECT_FALSE(error_msg.empty()); 157} 158 159TEST(GestureEventStreamValidator, ValidTap) { 160 GestureEventStreamValidator validator; 161 std::string error_msg; 162 WebGestureEvent event; 163 164 event = Build(WebInputEvent::GestureTapDown); 165 EXPECT_TRUE(validator.Validate(event, &error_msg)); 166 EXPECT_TRUE(error_msg.empty()); 167 168 event = Build(WebInputEvent::GestureTapCancel); 169 EXPECT_TRUE(validator.Validate(event, &error_msg)); 170 EXPECT_TRUE(error_msg.empty()); 171 172 event = Build(WebInputEvent::GestureTapDown); 173 EXPECT_TRUE(validator.Validate(event, &error_msg)); 174 EXPECT_TRUE(error_msg.empty()); 175 176 event = Build(WebInputEvent::GestureTapUnconfirmed); 177 EXPECT_TRUE(validator.Validate(event, &error_msg)); 178 EXPECT_TRUE(error_msg.empty()); 179 180 event = Build(WebInputEvent::GestureTapCancel); 181 EXPECT_TRUE(validator.Validate(event, &error_msg)); 182 EXPECT_TRUE(error_msg.empty()); 183 184 // Tap and DoubleTap do not require a TapDown (unlike TapUnconfirmed and 185 // TapCancel). 186 event = Build(WebInputEvent::GestureTap); 187 EXPECT_TRUE(validator.Validate(event, &error_msg)); 188 EXPECT_TRUE(error_msg.empty()); 189 190 event = Build(WebInputEvent::GestureDoubleTap); 191 EXPECT_TRUE(validator.Validate(event, &error_msg)); 192 EXPECT_TRUE(error_msg.empty()); 193} 194 195TEST(GestureEventStreamValidator, InvalidTap) { 196 GestureEventStreamValidator validator; 197 std::string error_msg; 198 WebGestureEvent event; 199 200 // No preceding TapDown. 201 event = Build(WebInputEvent::GestureTapUnconfirmed); 202 EXPECT_FALSE(validator.Validate(event, &error_msg)); 203 EXPECT_FALSE(error_msg.empty()); 204 205 event = Build(WebInputEvent::GestureTapCancel); 206 EXPECT_FALSE(validator.Validate(event, &error_msg)); 207 EXPECT_FALSE(error_msg.empty()); 208 209 // TapDown already terminated. 210 event = Build(WebInputEvent::GestureTapDown); 211 EXPECT_TRUE(validator.Validate(event, &error_msg)); 212 EXPECT_TRUE(error_msg.empty()); 213 214 event = Build(WebInputEvent::GestureDoubleTap); 215 EXPECT_TRUE(validator.Validate(event, &error_msg)); 216 EXPECT_TRUE(error_msg.empty()); 217 218 event = Build(WebInputEvent::GestureTapCancel); 219 EXPECT_FALSE(validator.Validate(event, &error_msg)); 220 EXPECT_FALSE(error_msg.empty()); 221 222 // TapDown already terminated. 223 event = Build(WebInputEvent::GestureTapDown); 224 EXPECT_TRUE(validator.Validate(event, &error_msg)); 225 EXPECT_TRUE(error_msg.empty()); 226 227 event = Build(WebInputEvent::GestureTap); 228 EXPECT_TRUE(validator.Validate(event, &error_msg)); 229 EXPECT_TRUE(error_msg.empty()); 230 231 event = Build(WebInputEvent::GestureTapCancel); 232 EXPECT_FALSE(validator.Validate(event, &error_msg)); 233 EXPECT_FALSE(error_msg.empty()); 234} 235 236} // namespace content 237