| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/renderer_host/input/touch_action_filter.h" | 5 #include "content/browser/renderer_host/input/touch_action_filter.h" |
| 6 #include "content/common/input/synthetic_web_input_event_builders.h" | 6 #include "content/common/input/synthetic_web_input_event_builders.h" |
| 7 #include "content/port/browser/event_with_latency_info.h" | 7 #include "content/port/browser/event_with_latency_info.h" |
| 8 #include "content/port/common/input_event_ack_state.h" | 8 #include "content/port/common/input_event_ack_state.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "third_party/WebKit/public/web/WebInputEvent.h" | 10 #include "third_party/WebKit/public/web/WebInputEvent.h" |
| 11 | 11 |
| 12 using blink::WebGestureEvent; | 12 using blink::WebGestureEvent; |
| 13 using blink::WebInputEvent; | 13 using blink::WebInputEvent; |
| 14 | 14 |
| 15 namespace content { | 15 namespace content { |
| 16 | 16 |
| 17 TEST(TouchActionFilterTest, SimpleFilter) { | 17 TEST(TouchActionFilterTest, SimpleFilter) { |
| 18 TouchActionFilter filter; | 18 TouchActionFilter filter; |
| 19 | 19 |
| 20 const WebGestureEvent scroll_begin = SyntheticWebGestureEventBuilder::Build( | 20 WebGestureEvent scroll_begin = |
| 21 WebInputEvent::GestureScrollBegin, WebGestureEvent::Touchscreen); | 21 SyntheticWebGestureEventBuilder::BuildScrollBegin(2, 3); |
| 22 const WebGestureEvent scroll_update = | 22 const float kDeltaX = 5; |
| 23 SyntheticWebGestureEventBuilder::BuildScrollUpdate(0, 10, 0); | 23 const float kDeltaY = 10; |
| 24 const WebGestureEvent scroll_end = SyntheticWebGestureEventBuilder::Build( | 24 WebGestureEvent scroll_update = |
| 25 SyntheticWebGestureEventBuilder::BuildScrollUpdate(kDeltaX, kDeltaY, 0); |
| 26 WebGestureEvent scroll_end = SyntheticWebGestureEventBuilder::Build( |
| 25 WebInputEvent::GestureScrollEnd, WebGestureEvent::Touchscreen); | 27 WebInputEvent::GestureScrollEnd, WebGestureEvent::Touchscreen); |
| 26 const WebGestureEvent tap = SyntheticWebGestureEventBuilder::Build( | 28 WebGestureEvent tap = SyntheticWebGestureEventBuilder::Build( |
| 27 WebInputEvent::GestureTap, WebGestureEvent::Touchscreen); | 29 WebInputEvent::GestureTap, WebGestureEvent::Touchscreen); |
| 28 | 30 |
| 29 // No events filtered by default. | 31 // No events filtered by default. |
| 30 EXPECT_FALSE(filter.FilterGestureEvent(scroll_begin)); | 32 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_begin)); |
| 31 EXPECT_FALSE(filter.FilterGestureEvent(scroll_update)); | 33 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_update)); |
| 32 EXPECT_FALSE(filter.FilterGestureEvent(scroll_end)); | 34 EXPECT_EQ(kDeltaX, scroll_update.data.scrollUpdate.deltaX); |
| 33 EXPECT_FALSE(filter.FilterGestureEvent(tap)); | 35 EXPECT_EQ(kDeltaY, scroll_update.data.scrollUpdate.deltaY); |
| 36 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_end)); |
| 37 EXPECT_FALSE(filter.FilterGestureEvent(&tap)); |
| 34 | 38 |
| 35 // TOUCH_ACTION_AUTO doesn't cause any filtering. | 39 // TOUCH_ACTION_AUTO doesn't cause any filtering. |
| 36 filter.OnSetTouchAction(TOUCH_ACTION_AUTO); | 40 filter.OnSetTouchAction(TOUCH_ACTION_AUTO); |
| 37 EXPECT_FALSE(filter.FilterGestureEvent(scroll_begin)); | 41 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_begin)); |
| 38 EXPECT_FALSE(filter.FilterGestureEvent(scroll_update)); | 42 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_update)); |
| 39 EXPECT_FALSE(filter.FilterGestureEvent(scroll_end)); | 43 EXPECT_EQ(kDeltaX, scroll_update.data.scrollUpdate.deltaX); |
| 44 EXPECT_EQ(kDeltaY, scroll_update.data.scrollUpdate.deltaY); |
| 45 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_end)); |
| 40 | 46 |
| 41 // TOUCH_ACTION_NONE filters out all scroll events, but no other events. | 47 // TOUCH_ACTION_NONE filters out all scroll events, but no other events. |
| 42 filter.OnSetTouchAction(TOUCH_ACTION_NONE); | 48 filter.OnSetTouchAction(TOUCH_ACTION_NONE); |
| 43 EXPECT_FALSE(filter.FilterGestureEvent(tap)); | 49 EXPECT_FALSE(filter.FilterGestureEvent(&tap)); |
| 44 EXPECT_TRUE(filter.FilterGestureEvent(scroll_begin)); | 50 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_begin)); |
| 45 EXPECT_TRUE(filter.FilterGestureEvent(scroll_update)); | 51 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_update)); |
| 46 EXPECT_TRUE(filter.FilterGestureEvent(scroll_update)); | 52 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_update)); |
| 47 EXPECT_TRUE(filter.FilterGestureEvent(scroll_end)); | 53 EXPECT_EQ(kDeltaX, scroll_update.data.scrollUpdate.deltaX); |
| 54 EXPECT_EQ(kDeltaY, scroll_update.data.scrollUpdate.deltaY); |
| 55 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_end)); |
| 48 | 56 |
| 49 // After the end of a gesture the state is reset. | 57 // After the end of a gesture the state is reset. |
| 50 EXPECT_FALSE(filter.FilterGestureEvent(scroll_begin)); | 58 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_begin)); |
| 51 EXPECT_FALSE(filter.FilterGestureEvent(scroll_update)); | 59 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_update)); |
| 52 EXPECT_FALSE(filter.FilterGestureEvent(scroll_end)); | 60 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_end)); |
| 53 | 61 |
| 54 // Setting touch action doesn't impact any in-progress gestures. | 62 // Setting touch action doesn't impact any in-progress gestures. |
| 55 EXPECT_FALSE(filter.FilterGestureEvent(scroll_begin)); | 63 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_begin)); |
| 56 filter.OnSetTouchAction(TOUCH_ACTION_NONE); | 64 filter.OnSetTouchAction(TOUCH_ACTION_NONE); |
| 57 EXPECT_FALSE(filter.FilterGestureEvent(scroll_update)); | 65 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_update)); |
| 58 EXPECT_FALSE(filter.FilterGestureEvent(scroll_end)); | 66 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_end)); |
| 59 | 67 |
| 60 // And the state is still cleared for the next gesture. | 68 // And the state is still cleared for the next gesture. |
| 61 EXPECT_FALSE(filter.FilterGestureEvent(scroll_begin)); | 69 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_begin)); |
| 62 EXPECT_FALSE(filter.FilterGestureEvent(scroll_end)); | 70 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_end)); |
| 63 | 71 |
| 64 // Changing the touch action during a gesture has no effect. | 72 // Changing the touch action during a gesture has no effect. |
| 65 filter.OnSetTouchAction(TOUCH_ACTION_NONE); | 73 filter.OnSetTouchAction(TOUCH_ACTION_NONE); |
| 66 EXPECT_TRUE(filter.FilterGestureEvent(scroll_begin)); | 74 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_begin)); |
| 67 filter.OnSetTouchAction(TOUCH_ACTION_AUTO); | 75 filter.OnSetTouchAction(TOUCH_ACTION_AUTO); |
| 68 EXPECT_TRUE(filter.FilterGestureEvent(scroll_update)); | 76 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_update)); |
| 69 EXPECT_TRUE(filter.FilterGestureEvent(scroll_update)); | 77 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_update)); |
| 70 EXPECT_TRUE(filter.FilterGestureEvent(scroll_end)); | 78 EXPECT_EQ(kDeltaX, scroll_update.data.scrollUpdate.deltaX); |
| 79 EXPECT_EQ(kDeltaY, scroll_update.data.scrollUpdate.deltaY); |
| 80 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_end)); |
| 81 } |
| 82 |
| 83 TEST(TouchActionFilterTest, Fling) { |
| 84 TouchActionFilter filter; |
| 85 |
| 86 WebGestureEvent scroll_begin = |
| 87 SyntheticWebGestureEventBuilder::BuildScrollBegin(2, 3); |
| 88 WebGestureEvent scroll_update = |
| 89 SyntheticWebGestureEventBuilder::BuildScrollUpdate(5, 10, 0); |
| 90 const float kFlingX = 7; |
| 91 const float kFlingY = -4; |
| 92 WebGestureEvent fling_start = SyntheticWebGestureEventBuilder::BuildFling( |
| 93 kFlingX, kFlingY, WebGestureEvent::Touchscreen); |
| 94 WebGestureEvent pad_fling = SyntheticWebGestureEventBuilder::BuildFling( |
| 95 kFlingX, kFlingY, WebGestureEvent::Touchpad); |
| 96 |
| 97 // TOUCH_ACTION_NONE filters out fling events. |
| 98 filter.OnSetTouchAction(TOUCH_ACTION_NONE); |
| 99 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_begin)); |
| 100 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_update)); |
| 101 EXPECT_TRUE(filter.FilterGestureEvent(&fling_start)); |
| 102 EXPECT_EQ(kFlingX, fling_start.data.flingStart.velocityX); |
| 103 EXPECT_EQ(kFlingY, fling_start.data.flingStart.velocityY); |
| 104 |
| 105 // After a fling the state is reset. |
| 106 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_begin)); |
| 107 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_update)); |
| 108 EXPECT_FALSE(filter.FilterGestureEvent(&fling_start)); |
| 109 |
| 110 // touchpad flings aren't filtered and don't reset state. |
| 111 filter.OnSetTouchAction(TOUCH_ACTION_NONE); |
| 112 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_begin)); |
| 113 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_update)); |
| 114 EXPECT_FALSE(filter.FilterGestureEvent(&pad_fling)); |
| 115 EXPECT_TRUE(filter.FilterGestureEvent(&fling_start)); |
| 116 } |
| 117 |
| 118 TEST(TouchActionFilterTest, PanX) { |
| 119 TouchActionFilter filter; |
| 120 const float kDX = 5; |
| 121 const float kDY = 10; |
| 122 const float kFlingX = 7; |
| 123 const float kFlingY = -4; |
| 124 WebGestureEvent scrollEnd = SyntheticWebGestureEventBuilder::Build( |
| 125 WebInputEvent::GestureScrollEnd, WebGestureEvent::Touchscreen); |
| 126 |
| 127 { |
| 128 // Scrolls with no direction hint are permitted in the X axis. |
| 129 filter.OnSetTouchAction(TOUCH_ACTION_PAN_X); |
| 130 |
| 131 WebGestureEvent scroll_begin = |
| 132 SyntheticWebGestureEventBuilder::BuildScrollBegin(0, 0); |
| 133 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_begin)); |
| 134 |
| 135 WebGestureEvent scroll_update = |
| 136 SyntheticWebGestureEventBuilder::BuildScrollUpdate(kDX, kDY, 0); |
| 137 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_update)); |
| 138 EXPECT_EQ(kDX, scroll_update.data.scrollUpdate.deltaX); |
| 139 EXPECT_EQ(0, scroll_update.data.scrollUpdate.deltaY); |
| 140 |
| 141 EXPECT_FALSE(filter.FilterGestureEvent(&scrollEnd)); |
| 142 } |
| 143 |
| 144 { |
| 145 // Scrolls hinted mostly in the X axis are permitted in that axis. |
| 146 filter.OnSetTouchAction(TOUCH_ACTION_PAN_X); |
| 147 WebGestureEvent scroll_begin = |
| 148 SyntheticWebGestureEventBuilder::BuildScrollBegin(-7, 6); |
| 149 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_begin)); |
| 150 |
| 151 WebGestureEvent scroll_update = |
| 152 SyntheticWebGestureEventBuilder::BuildScrollUpdate(kDX, kDY, 0); |
| 153 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_update)); |
| 154 EXPECT_EQ(kDX, scroll_update.data.scrollUpdate.deltaX); |
| 155 EXPECT_EQ(0, scroll_update.data.scrollUpdate.deltaY); |
| 156 |
| 157 WebGestureEvent scroll_update2 = |
| 158 SyntheticWebGestureEventBuilder::BuildScrollUpdate(-4, -2, 0); |
| 159 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_update2)); |
| 160 EXPECT_EQ(-4, scroll_update2.data.scrollUpdate.deltaX); |
| 161 EXPECT_EQ(0, scroll_update2.data.scrollUpdate.deltaY); |
| 162 |
| 163 WebGestureEvent fling_start = SyntheticWebGestureEventBuilder::BuildFling( |
| 164 kFlingX, kFlingY, WebGestureEvent::Touchscreen); |
| 165 EXPECT_FALSE(filter.FilterGestureEvent(&fling_start)); |
| 166 EXPECT_EQ(kFlingX, fling_start.data.flingStart.velocityX); |
| 167 EXPECT_EQ(0, fling_start.data.flingStart.velocityY); |
| 168 } |
| 169 |
| 170 { |
| 171 // Scrolls hinted mostly in the Y direction are suppressed entirely. |
| 172 filter.OnSetTouchAction(TOUCH_ACTION_PAN_X); |
| 173 WebGestureEvent scroll_begin = |
| 174 SyntheticWebGestureEventBuilder::BuildScrollBegin(-7, 8); |
| 175 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_begin)); |
| 176 |
| 177 WebGestureEvent scroll_update = |
| 178 SyntheticWebGestureEventBuilder::BuildScrollUpdate(kDX, kDY, 0); |
| 179 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_update)); |
| 180 EXPECT_EQ(kDX, scroll_update.data.scrollUpdate.deltaX); |
| 181 EXPECT_EQ(kDY, scroll_update.data.scrollUpdate.deltaY); |
| 182 |
| 183 EXPECT_TRUE(filter.FilterGestureEvent(&scrollEnd)); |
| 184 } |
| 185 } |
| 186 |
| 187 TEST(TouchActionFilterTest, PanY) { |
| 188 TouchActionFilter filter; |
| 189 const float kDX = 5; |
| 190 const float kDY = 10; |
| 191 const float kFlingX = 7; |
| 192 const float kFlingY = -4; |
| 193 WebGestureEvent scrollEnd = SyntheticWebGestureEventBuilder::Build( |
| 194 WebInputEvent::GestureScrollEnd, WebGestureEvent::Touchscreen); |
| 195 |
| 196 { |
| 197 // Scrolls with no direction hint are permitted in the Y axis. |
| 198 filter.OnSetTouchAction(TOUCH_ACTION_PAN_Y); |
| 199 |
| 200 WebGestureEvent scroll_begin = |
| 201 SyntheticWebGestureEventBuilder::BuildScrollBegin(0, 0); |
| 202 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_begin)); |
| 203 |
| 204 WebGestureEvent scroll_update = |
| 205 SyntheticWebGestureEventBuilder::BuildScrollUpdate(kDX, kDY, 0); |
| 206 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_update)); |
| 207 EXPECT_EQ(0, scroll_update.data.scrollUpdate.deltaX); |
| 208 EXPECT_EQ(kDY, scroll_update.data.scrollUpdate.deltaY); |
| 209 |
| 210 EXPECT_FALSE(filter.FilterGestureEvent(&scrollEnd)); |
| 211 } |
| 212 |
| 213 { |
| 214 // Scrolls hinted mostly in the Y axis are permitted in that axis. |
| 215 filter.OnSetTouchAction(TOUCH_ACTION_PAN_Y); |
| 216 WebGestureEvent scroll_begin = |
| 217 SyntheticWebGestureEventBuilder::BuildScrollBegin(-6, 7); |
| 218 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_begin)); |
| 219 |
| 220 WebGestureEvent scroll_update = |
| 221 SyntheticWebGestureEventBuilder::BuildScrollUpdate(kDX, kDY, 0); |
| 222 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_update)); |
| 223 EXPECT_EQ(0, scroll_update.data.scrollUpdate.deltaX); |
| 224 EXPECT_EQ(kDY, scroll_update.data.scrollUpdate.deltaY); |
| 225 |
| 226 WebGestureEvent scroll_update2 = |
| 227 SyntheticWebGestureEventBuilder::BuildScrollUpdate(-4, -2, 0); |
| 228 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_update2)); |
| 229 EXPECT_EQ(0, scroll_update2.data.scrollUpdate.deltaX); |
| 230 EXPECT_EQ(-2, scroll_update2.data.scrollUpdate.deltaY); |
| 231 |
| 232 WebGestureEvent fling_start = SyntheticWebGestureEventBuilder::BuildFling( |
| 233 kFlingX, kFlingY, WebGestureEvent::Touchscreen); |
| 234 EXPECT_FALSE(filter.FilterGestureEvent(&fling_start)); |
| 235 EXPECT_EQ(0, fling_start.data.flingStart.velocityX); |
| 236 EXPECT_EQ(kFlingY, fling_start.data.flingStart.velocityY); |
| 237 } |
| 238 |
| 239 { |
| 240 // Scrolls hinted mostly in the X direction are suppressed entirely. |
| 241 filter.OnSetTouchAction(TOUCH_ACTION_PAN_Y); |
| 242 WebGestureEvent scroll_begin = |
| 243 SyntheticWebGestureEventBuilder::BuildScrollBegin(-8, 7); |
| 244 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_begin)); |
| 245 |
| 246 WebGestureEvent scroll_update = |
| 247 SyntheticWebGestureEventBuilder::BuildScrollUpdate(kDX, kDY, 0); |
| 248 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_update)); |
| 249 EXPECT_EQ(kDX, scroll_update.data.scrollUpdate.deltaX); |
| 250 EXPECT_EQ(kDY, scroll_update.data.scrollUpdate.deltaY); |
| 251 |
| 252 EXPECT_TRUE(filter.FilterGestureEvent(&scrollEnd)); |
| 253 } |
| 254 } |
| 255 |
| 256 TEST(TouchActionFilterTest, PanXY) { |
| 257 TouchActionFilter filter; |
| 258 const float kDX = 5; |
| 259 const float kDY = 10; |
| 260 const float kFlingX = 7; |
| 261 const float kFlingY = -4; |
| 262 |
| 263 { |
| 264 // Scrolls hinted in the X axis are permitted and unmodified. |
| 265 filter.OnSetTouchAction(TOUCH_ACTION_PAN_X_Y); |
| 266 WebGestureEvent scroll_begin = |
| 267 SyntheticWebGestureEventBuilder::BuildScrollBegin(-7, 6); |
| 268 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_begin)); |
| 269 |
| 270 WebGestureEvent scroll_update = |
| 271 SyntheticWebGestureEventBuilder::BuildScrollUpdate(kDX, kDY, 0); |
| 272 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_update)); |
| 273 EXPECT_EQ(kDX, scroll_update.data.scrollUpdate.deltaX); |
| 274 EXPECT_EQ(kDY, scroll_update.data.scrollUpdate.deltaY); |
| 275 |
| 276 WebGestureEvent fling_start = SyntheticWebGestureEventBuilder::BuildFling( |
| 277 kFlingX, kFlingY, WebGestureEvent::Touchscreen); |
| 278 EXPECT_FALSE(filter.FilterGestureEvent(&fling_start)); |
| 279 EXPECT_EQ(kFlingX, fling_start.data.flingStart.velocityX); |
| 280 EXPECT_EQ(kFlingY, fling_start.data.flingStart.velocityY); |
| 281 } |
| 282 |
| 283 { |
| 284 // Scrolls hinted in the Y axis are permitted and unmodified. |
| 285 filter.OnSetTouchAction(TOUCH_ACTION_PAN_X_Y); |
| 286 WebGestureEvent scroll_begin = |
| 287 SyntheticWebGestureEventBuilder::BuildScrollBegin(-6, 7); |
| 288 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_begin)); |
| 289 |
| 290 WebGestureEvent scroll_update = |
| 291 SyntheticWebGestureEventBuilder::BuildScrollUpdate(kDX, kDY, 0); |
| 292 EXPECT_FALSE(filter.FilterGestureEvent(&scroll_update)); |
| 293 EXPECT_EQ(kDX, scroll_update.data.scrollUpdate.deltaX); |
| 294 EXPECT_EQ(kDY, scroll_update.data.scrollUpdate.deltaY); |
| 295 |
| 296 WebGestureEvent fling_start = SyntheticWebGestureEventBuilder::BuildFling( |
| 297 kFlingX, kFlingY, WebGestureEvent::Touchscreen); |
| 298 EXPECT_FALSE(filter.FilterGestureEvent(&fling_start)); |
| 299 EXPECT_EQ(kFlingX, fling_start.data.flingStart.velocityX); |
| 300 EXPECT_EQ(kFlingY, fling_start.data.flingStart.velocityY); |
| 301 } |
| 302 } |
| 303 |
| 304 TEST(TouchActionFilterTest, Intersect) { |
| 305 EXPECT_EQ(TOUCH_ACTION_NONE, |
| 306 TouchActionFilter::Intersect(TOUCH_ACTION_NONE, TOUCH_ACTION_AUTO)); |
| 307 EXPECT_EQ(TOUCH_ACTION_NONE, |
| 308 TouchActionFilter::Intersect(TOUCH_ACTION_AUTO, TOUCH_ACTION_NONE)); |
| 309 EXPECT_EQ(TOUCH_ACTION_PAN_X, |
| 310 TouchActionFilter::Intersect(TOUCH_ACTION_AUTO, TOUCH_ACTION_PAN_X)); |
| 311 EXPECT_EQ(TOUCH_ACTION_PAN_Y, |
| 312 TouchActionFilter::Intersect(TOUCH_ACTION_PAN_Y, TOUCH_ACTION_AUTO)); |
| 313 EXPECT_EQ(TOUCH_ACTION_AUTO, |
| 314 TouchActionFilter::Intersect(TOUCH_ACTION_AUTO, TOUCH_ACTION_AUTO)); |
| 315 EXPECT_EQ(TOUCH_ACTION_PAN_X, |
| 316 TouchActionFilter::Intersect(TOUCH_ACTION_PAN_X_Y, TOUCH_ACTION_PAN_X)); |
| 317 EXPECT_EQ(TOUCH_ACTION_PAN_Y, |
| 318 TouchActionFilter::Intersect(TOUCH_ACTION_PAN_Y, TOUCH_ACTION_PAN_X_Y)); |
| 319 EXPECT_EQ(TOUCH_ACTION_PAN_X_Y, |
| 320 TouchActionFilter::Intersect(TOUCH_ACTION_PAN_X_Y, TOUCH_ACTION_AUTO)); |
| 321 EXPECT_EQ(TOUCH_ACTION_NONE, |
| 322 TouchActionFilter::Intersect(TOUCH_ACTION_PAN_X, TOUCH_ACTION_PAN_Y)); |
| 71 } | 323 } |
| 72 | 324 |
| 73 TEST(TouchActionFilterTest, MultiTouch) { | 325 TEST(TouchActionFilterTest, MultiTouch) { |
| 74 TouchActionFilter filter; | 326 TouchActionFilter filter; |
| 75 | 327 |
| 76 const WebGestureEvent scroll_begin = SyntheticWebGestureEventBuilder::Build( | 328 WebGestureEvent scroll_begin = |
| 77 WebInputEvent::GestureScrollBegin, WebGestureEvent::Touchscreen); | 329 SyntheticWebGestureEventBuilder::BuildScrollBegin(2, 3); |
| 78 const WebGestureEvent scroll_update = | 330 const float kDeltaX = 5; |
| 79 SyntheticWebGestureEventBuilder::BuildScrollUpdate(0, 10, 0); | 331 const float kDeltaY = 10; |
| 80 const WebGestureEvent scrollEnd = SyntheticWebGestureEventBuilder::Build( | 332 WebGestureEvent scroll_update = |
| 333 SyntheticWebGestureEventBuilder::BuildScrollUpdate(kDeltaX, kDeltaY, 0); |
| 334 WebGestureEvent scrollEnd = SyntheticWebGestureEventBuilder::Build( |
| 81 WebInputEvent::GestureScrollEnd, WebGestureEvent::Touchscreen); | 335 WebInputEvent::GestureScrollEnd, WebGestureEvent::Touchscreen); |
| 82 | 336 |
| 83 // For multiple points, the intersection is what matters. | 337 // For multiple points, the intersection is what matters. |
| 84 filter.OnSetTouchAction(TOUCH_ACTION_NONE); | 338 filter.OnSetTouchAction(TOUCH_ACTION_NONE); |
| 85 filter.OnSetTouchAction(TOUCH_ACTION_AUTO); | 339 filter.OnSetTouchAction(TOUCH_ACTION_AUTO); |
| 86 EXPECT_TRUE(filter.FilterGestureEvent(scroll_begin)); | 340 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_begin)); |
| 87 EXPECT_TRUE(filter.FilterGestureEvent(scroll_update)); | 341 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_update)); |
| 88 EXPECT_TRUE(filter.FilterGestureEvent(scroll_update)); | 342 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_update)); |
| 89 EXPECT_TRUE(filter.FilterGestureEvent(scrollEnd)); | 343 EXPECT_EQ(kDeltaX, scroll_update.data.scrollUpdate.deltaX); |
| 90 | 344 EXPECT_EQ(kDeltaY, scroll_update.data.scrollUpdate.deltaY); |
| 91 filter.OnSetTouchAction(TOUCH_ACTION_AUTO); | 345 EXPECT_TRUE(filter.FilterGestureEvent(&scrollEnd)); |
| 92 filter.OnSetTouchAction(TOUCH_ACTION_NONE); | 346 |
| 93 filter.OnSetTouchAction(TOUCH_ACTION_AUTO); | 347 // Intersection of PAN_X and PAN_Y is NONE. |
| 94 EXPECT_TRUE(filter.FilterGestureEvent(scroll_begin)); | 348 filter.OnSetTouchAction(TOUCH_ACTION_PAN_X); |
| 95 EXPECT_TRUE(filter.FilterGestureEvent(scroll_update)); | 349 filter.OnSetTouchAction(TOUCH_ACTION_PAN_Y); |
| 96 EXPECT_TRUE(filter.FilterGestureEvent(scroll_update)); | 350 filter.OnSetTouchAction(TOUCH_ACTION_PAN_X_Y); |
| 97 EXPECT_TRUE(filter.FilterGestureEvent(scrollEnd)); | 351 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_begin)); |
| 352 EXPECT_TRUE(filter.FilterGestureEvent(&scroll_update)); |
| 353 EXPECT_TRUE(filter.FilterGestureEvent(&scrollEnd)); |
| 98 } | 354 } |
| 99 | 355 |
| 100 } // namespace content | 356 } // namespace content |
| OLD | NEW |