OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 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 "ui/chromeos/touch_exploration_controller.h" |
| 6 |
| 7 #include "base/time/time.h" |
| 8 #include "ui/aura/client/cursor_client.h" |
| 9 #include "ui/aura/test/aura_test_base.h" |
| 10 #include "ui/aura/test/event_generator.h" |
| 11 #include "ui/aura/test/test_cursor_client.h" |
| 12 #include "ui/aura/window.h" |
| 13 #include "ui/events/event.h" |
| 14 #include "ui/events/event_utils.h" |
| 15 #include "ui/gfx/geometry/point.h" |
| 16 #include "ui/gl/gl_implementation.h" |
| 17 #include "ui/gl/gl_surface.h" |
| 18 |
| 19 namespace ui { |
| 20 |
| 21 // Records all mouse and touch events. |
| 22 class EventCapturer : public ui::EventHandler { |
| 23 public: |
| 24 EventCapturer() {} |
| 25 virtual ~EventCapturer() {} |
| 26 |
| 27 void Reset() { |
| 28 events_.clear(); |
| 29 } |
| 30 |
| 31 virtual void OnEvent(ui::Event* event) OVERRIDE { |
| 32 ui::LocatedEvent* event_copy; |
| 33 if (event->IsMouseEvent()) |
| 34 event_copy = new ui::MouseEvent(static_cast<ui::MouseEvent&>(*event)); |
| 35 else if (event->IsTouchEvent()) |
| 36 event_copy = new ui::TouchEvent(static_cast<ui::TouchEvent&>(*event)); |
| 37 else |
| 38 return; |
| 39 events_.push_back(event_copy); |
| 40 // Stop event propagation so we don't click on random stuff that |
| 41 // might break test assumptions. |
| 42 event->StopPropagation(); |
| 43 // If there is a possibility that we're in an infinite loop, we should |
| 44 // exit early with a sensible error rather than letting the test time out. |
| 45 ASSERT_LT(events_.size(), 100u); |
| 46 } |
| 47 const ScopedVector<ui::LocatedEvent>& captured_events() const { |
| 48 return events_; |
| 49 } |
| 50 |
| 51 private: |
| 52 ScopedVector<ui::LocatedEvent> events_; |
| 53 |
| 54 DISALLOW_COPY_AND_ASSIGN(EventCapturer); |
| 55 }; |
| 56 |
| 57 class TouchExplorationTest : public aura::test::AuraTestBase { |
| 58 public: |
| 59 TouchExplorationTest() {} |
| 60 virtual ~TouchExplorationTest() {} |
| 61 |
| 62 virtual void SetUp() OVERRIDE { |
| 63 if (gfx::GetGLImplementation() == gfx::kGLImplementationNone) |
| 64 gfx::GLSurface::InitializeOneOffForTests(); |
| 65 aura::test::AuraTestBase::SetUp(); |
| 66 cursor_client_.reset(new aura::test::TestCursorClient(root_window())); |
| 67 root_window()->AddPreTargetHandler(&event_capturer_); |
| 68 } |
| 69 |
| 70 virtual void TearDown() OVERRIDE { |
| 71 root_window()->RemovePreTargetHandler(&event_capturer_); |
| 72 SwitchTouchExplorationMode(false); |
| 73 cursor_client_.reset(); |
| 74 aura::test::AuraTestBase::TearDown(); |
| 75 } |
| 76 |
| 77 const ScopedVector<ui::LocatedEvent>& GetCapturedEvents() { |
| 78 return event_capturer_.captured_events(); |
| 79 } |
| 80 |
| 81 void ClearCapturedEvents() { |
| 82 event_capturer_.Reset(); |
| 83 } |
| 84 |
| 85 protected: |
| 86 aura::client::CursorClient* cursor_client() {return cursor_client_.get();} |
| 87 |
| 88 void SwitchTouchExplorationMode(bool on) { |
| 89 if (!on && touch_exploration_controller_.get()) |
| 90 touch_exploration_controller_.reset(); |
| 91 else if (on && !touch_exploration_controller_.get()) |
| 92 touch_exploration_controller_.reset( |
| 93 new ui::TouchExplorationController(root_window())); |
| 94 } |
| 95 |
| 96 bool IsInTouchToMouseMode() { |
| 97 aura::client::CursorClient* cursor_client = |
| 98 aura::client::GetCursorClient(root_window()); |
| 99 return cursor_client && |
| 100 cursor_client->IsMouseEventsEnabled() && |
| 101 !cursor_client->IsCursorVisible(); |
| 102 } |
| 103 |
| 104 private: |
| 105 EventCapturer event_capturer_; |
| 106 scoped_ptr<ui::TouchExplorationController> touch_exploration_controller_; |
| 107 scoped_ptr<aura::test::TestCursorClient> cursor_client_; |
| 108 |
| 109 DISALLOW_COPY_AND_ASSIGN(TouchExplorationTest); |
| 110 }; |
| 111 |
| 112 // Executes a number of assertions to confirm that |e1| and |e2| are touch |
| 113 // events and are equal to each other. |
| 114 void ConfirmEventsAreTouchAndEqual(ui::Event* e1, ui::Event* e2) { |
| 115 ASSERT_TRUE(e1->IsTouchEvent()); |
| 116 ASSERT_TRUE(e2->IsTouchEvent()); |
| 117 ui::TouchEvent* touch_event1 = static_cast<ui::TouchEvent*>(e1); |
| 118 ui::TouchEvent* touch_event2 = static_cast<ui::TouchEvent*>(e2); |
| 119 EXPECT_EQ(touch_event1->type(), touch_event2->type()); |
| 120 EXPECT_EQ(touch_event1->location(), touch_event2->location()); |
| 121 EXPECT_EQ(touch_event1->touch_id(), touch_event2->touch_id()); |
| 122 EXPECT_EQ(touch_event1->flags(), touch_event2->flags()); |
| 123 EXPECT_EQ(touch_event1->time_stamp(), touch_event2->time_stamp()); |
| 124 } |
| 125 |
| 126 // Executes a number of assertions to confirm that |e1| and |e2| are mouse |
| 127 // events and are equal to each other. |
| 128 void ConfirmEventsAreMouseAndEqual(ui::Event* e1, ui::Event* e2) { |
| 129 ASSERT_TRUE(e1->IsMouseEvent()); |
| 130 ASSERT_TRUE(e2->IsMouseEvent()); |
| 131 ui::MouseEvent* mouse_event1 = static_cast<ui::MouseEvent*>(e1); |
| 132 ui::MouseEvent* mouse_event2 = static_cast<ui::MouseEvent*>(e2); |
| 133 EXPECT_EQ(mouse_event1->type(), mouse_event2->type()); |
| 134 EXPECT_EQ(mouse_event1->location(), mouse_event2->location()); |
| 135 EXPECT_EQ(mouse_event1->root_location(), mouse_event2->root_location()); |
| 136 EXPECT_EQ(mouse_event1->flags(), mouse_event2->flags()); |
| 137 } |
| 138 |
| 139 #define CONFIRM_EVENTS_ARE_TOUCH_AND_EQUAL(e1, e2) \ |
| 140 ASSERT_NO_FATAL_FAILURE(ConfirmEventsAreTouchAndEqual(e1, e2)) |
| 141 |
| 142 #define CONFIRM_EVENTS_ARE_MOUSE_AND_EQUAL(e1, e2) \ |
| 143 ASSERT_NO_FATAL_FAILURE(ConfirmEventsAreMouseAndEqual(e1, e2)) |
| 144 |
| 145 // TODO(mfomitchev): Need to investigate why we don't get mouse enter/exit |
| 146 // events when running these tests as part of ui_unittests. We do get them when |
| 147 // the tests are run as part of ash unit tests. |
| 148 |
| 149 // Simple test to confirm one-finger touches are transformed into mouse moves. |
| 150 TEST_F(TouchExplorationTest, OneFingerTouch) { |
| 151 SwitchTouchExplorationMode(true); |
| 152 cursor_client()->ShowCursor(); |
| 153 cursor_client()->DisableMouseEvents(); |
| 154 aura::test::EventGenerator generator(root_window()); |
| 155 gfx::Point location_start = generator.current_location(); |
| 156 gfx::Point location_end(11, 12); |
| 157 generator.PressTouch(); |
| 158 EXPECT_TRUE(IsInTouchToMouseMode()); |
| 159 generator.MoveTouch(location_end); |
| 160 // Confirm the actual mouse moves are unaffected. |
| 161 ui::MouseEvent mouse_move(ui::ET_MOUSE_MOVED, |
| 162 gfx::Point(13, 14), |
| 163 gfx::Point(13, 14), |
| 164 0, |
| 165 0); |
| 166 generator.Dispatch(&mouse_move); |
| 167 generator.ReleaseTouch(); |
| 168 |
| 169 const ScopedVector<ui::LocatedEvent>& captured_events = GetCapturedEvents(); |
| 170 ScopedVector<ui::LocatedEvent>::const_iterator it; |
| 171 // TODO(mfomitchev): mouse enter/exit events |
| 172 int num_mouse_moves = 0; |
| 173 for (it = captured_events.begin(); it != captured_events.end(); ++it) { |
| 174 int type = (*it)->type(); |
| 175 // Ignore enter and exit mouse events synthesized when the mouse cursor is |
| 176 // shown or hidden. |
| 177 if (type == ui::ET_MOUSE_ENTERED || type == ui::ET_MOUSE_EXITED) |
| 178 continue; |
| 179 EXPECT_EQ(ui::ET_MOUSE_MOVED, (*it)->type()); |
| 180 if (num_mouse_moves == 0) |
| 181 EXPECT_EQ(location_start, (*it)->location()); |
| 182 if (num_mouse_moves == 1 || num_mouse_moves == 3) |
| 183 EXPECT_EQ(location_end, (*it)->location()); |
| 184 if (num_mouse_moves == 2) |
| 185 CONFIRM_EVENTS_ARE_MOUSE_AND_EQUAL(*it, &mouse_move); |
| 186 if (num_mouse_moves != 2) { |
| 187 EXPECT_TRUE((*it)->flags() & ui::EF_IS_SYNTHESIZED); |
| 188 EXPECT_TRUE((*it)->flags() & ui::EF_FROM_TOUCH); |
| 189 } |
| 190 num_mouse_moves++; |
| 191 } |
| 192 EXPECT_EQ(4, num_mouse_moves); |
| 193 } |
| 194 |
| 195 // Turn the touch exploration mode on in the middle of the touch gesture. |
| 196 // Confirm that events from the finger which was touching when the mode was |
| 197 // turned on don't get rewritten. |
| 198 TEST_F(TouchExplorationTest, TurnOnMidTouch) { |
| 199 SwitchTouchExplorationMode(false); |
| 200 cursor_client()->ShowCursor(); |
| 201 cursor_client()->DisableMouseEvents(); |
| 202 aura::test::EventGenerator generator(root_window()); |
| 203 generator.PressTouchId(1); |
| 204 EXPECT_TRUE(cursor_client()->IsCursorVisible()); |
| 205 EXPECT_FALSE(cursor_client()->IsMouseEventsEnabled()); |
| 206 ClearCapturedEvents(); |
| 207 |
| 208 // Enable touch exploration mode while the first finger is touching the |
| 209 // screen. Ensure that subsequent events from that first finger are not |
| 210 // affected by the touch exploration mode, while the touch events from another |
| 211 // finger get rewritten. |
| 212 SwitchTouchExplorationMode(true); |
| 213 ui::TouchEvent touch_move(ui::ET_TOUCH_MOVED, |
| 214 gfx::Point(11, 12), |
| 215 1, |
| 216 ui::EventTimeForNow()); |
| 217 generator.Dispatch(&touch_move); |
| 218 EXPECT_TRUE(cursor_client()->IsCursorVisible()); |
| 219 EXPECT_FALSE(cursor_client()->IsMouseEventsEnabled()); |
| 220 const ScopedVector<ui::LocatedEvent>& captured_events = GetCapturedEvents(); |
| 221 ASSERT_EQ(1u, captured_events.size()); |
| 222 CONFIRM_EVENTS_ARE_TOUCH_AND_EQUAL(captured_events[0], &touch_move); |
| 223 ClearCapturedEvents(); |
| 224 |
| 225 // The press from the second finger should get rewritten. |
| 226 generator.PressTouchId(2); |
| 227 EXPECT_TRUE(IsInTouchToMouseMode()); |
| 228 // TODO(mfomitchev): mouse enter/exit events |
| 229 ScopedVector<ui::LocatedEvent>::const_iterator it; |
| 230 for (it = captured_events.begin(); it != captured_events.end(); ++it) { |
| 231 if ((*it)->type() == ui::ET_MOUSE_MOVED) |
| 232 break; |
| 233 } |
| 234 EXPECT_NE(captured_events.end(), it); |
| 235 ClearCapturedEvents(); |
| 236 |
| 237 // The release of the first finger shouldn't be affected. |
| 238 ui::TouchEvent touch_release(ui::ET_TOUCH_RELEASED, |
| 239 gfx::Point(11, 12), |
| 240 1, |
| 241 ui::EventTimeForNow()); |
| 242 generator.Dispatch(&touch_release); |
| 243 ASSERT_EQ(1u, captured_events.size()); |
| 244 CONFIRM_EVENTS_ARE_TOUCH_AND_EQUAL(captured_events[0], &touch_release); |
| 245 ClearCapturedEvents(); |
| 246 |
| 247 // The move and release from the second finger should get rewritten. |
| 248 generator.MoveTouchId(gfx::Point(13, 14), 2); |
| 249 generator.ReleaseTouchId(2); |
| 250 ASSERT_EQ(2u, captured_events.size()); |
| 251 EXPECT_EQ(ui::ET_MOUSE_MOVED, captured_events[0]->type()); |
| 252 EXPECT_EQ(ui::ET_MOUSE_MOVED, captured_events[1]->type()); |
| 253 } |
| 254 |
| 255 TEST_F(TouchExplorationTest, TwoFingerTouch) { |
| 256 SwitchTouchExplorationMode(true); |
| 257 aura::test::EventGenerator generator(root_window()); |
| 258 generator.PressTouchId(1); |
| 259 ClearCapturedEvents(); |
| 260 |
| 261 // Confirm events from the second finger go through as is. |
| 262 cursor_client()->ShowCursor(); |
| 263 cursor_client()->DisableMouseEvents(); |
| 264 ui::TouchEvent touch_press(ui::ET_TOUCH_PRESSED, |
| 265 gfx::Point(10, 11), |
| 266 2, |
| 267 ui::EventTimeForNow()); |
| 268 generator.Dispatch(&touch_press); |
| 269 EXPECT_TRUE(cursor_client()->IsCursorVisible()); |
| 270 EXPECT_FALSE(cursor_client()->IsMouseEventsEnabled()); |
| 271 const ScopedVector<ui::LocatedEvent>& captured_events = GetCapturedEvents(); |
| 272 // TODO(mfomitchev): mouse enter/exit events |
| 273 // There will be a ET_MOUSE_EXITED event synthesized when the mouse cursor is |
| 274 // hidden - ignore it. |
| 275 ScopedVector<ui::LocatedEvent>::const_iterator it; |
| 276 for (it = captured_events.begin(); it != captured_events.end(); ++it) { |
| 277 if ((*it)->type() == ui::ET_TOUCH_PRESSED) { |
| 278 CONFIRM_EVENTS_ARE_TOUCH_AND_EQUAL(*it, &touch_press); |
| 279 break; |
| 280 } |
| 281 } |
| 282 EXPECT_NE(captured_events.end(), it); |
| 283 ClearCapturedEvents(); |
| 284 ui::TouchEvent touch_move(ui::ET_TOUCH_MOVED, |
| 285 gfx::Point(20, 21), |
| 286 2, |
| 287 ui::EventTimeForNow()); |
| 288 generator.Dispatch(&touch_move); |
| 289 ASSERT_EQ(1u, captured_events.size()); |
| 290 CONFIRM_EVENTS_ARE_TOUCH_AND_EQUAL(captured_events[0], &touch_move); |
| 291 ClearCapturedEvents(); |
| 292 |
| 293 // Confirm mouse moves go through unaffected. |
| 294 ui::MouseEvent mouse_move(ui::ET_MOUSE_MOVED, |
| 295 gfx::Point(13, 14), |
| 296 gfx::Point(13, 14), |
| 297 0, |
| 298 0); |
| 299 generator.Dispatch(&mouse_move); |
| 300 // TODO(mfomitchev): mouse enter/exit events |
| 301 // Ignore synthesized ET_MOUSE_ENTERED/ET_MOUSE_EXITED |
| 302 for (it = captured_events.begin(); it != captured_events.end(); ++it) { |
| 303 if ((*it)->type() == ui::ET_MOUSE_MOVED) { |
| 304 CONFIRM_EVENTS_ARE_MOUSE_AND_EQUAL(*it, &mouse_move); |
| 305 break; |
| 306 } |
| 307 } |
| 308 EXPECT_NE(captured_events.end(), it); |
| 309 ClearCapturedEvents(); |
| 310 |
| 311 // Have some other fingers touch/move/release |
| 312 generator.PressTouchId(3); |
| 313 generator.PressTouchId(4); |
| 314 generator.MoveTouchId(gfx::Point(30, 31), 3); |
| 315 generator.ReleaseTouchId(3); |
| 316 generator.ReleaseTouchId(4); |
| 317 ClearCapturedEvents(); |
| 318 |
| 319 // Events from the first finger should not go through while the second finger |
| 320 // is touching. |
| 321 gfx::Point touch1_location = gfx::Point(15, 16); |
| 322 generator.MoveTouchId(touch1_location, 1); |
| 323 EXPECT_EQ(0u, GetCapturedEvents().size()); |
| 324 |
| 325 EXPECT_TRUE(cursor_client()->IsCursorVisible()); |
| 326 EXPECT_FALSE(cursor_client()->IsMouseEventsEnabled()); |
| 327 |
| 328 // A release of the second finger should go through, plus there should be a |
| 329 // mouse move at |touch1_location| generated. |
| 330 ui::TouchEvent touch_release(ui::ET_TOUCH_RELEASED, |
| 331 gfx::Point(25, 26), |
| 332 2, |
| 333 ui::EventTimeForNow()); |
| 334 generator.Dispatch(&touch_release); |
| 335 EXPECT_TRUE(IsInTouchToMouseMode()); |
| 336 ASSERT_GE(captured_events.size(), 2u); |
| 337 CONFIRM_EVENTS_ARE_TOUCH_AND_EQUAL(captured_events[0], &touch_release); |
| 338 // TODO(mfomitchev): mouse enter/exit events |
| 339 // Ignore synthesized ET_MOUSE_ENTERED/ET_MOUSE_EXITED |
| 340 for (it = captured_events.begin(); it != captured_events.end(); ++it) { |
| 341 if ((*it)->type() == ui::ET_MOUSE_MOVED) { |
| 342 EXPECT_EQ(touch1_location, (*it)->location()); |
| 343 break; |
| 344 } |
| 345 } |
| 346 EXPECT_NE(captured_events.end(), it); |
| 347 } |
| 348 |
| 349 TEST_F(TouchExplorationTest, MultiFingerTouch) { |
| 350 SwitchTouchExplorationMode(true); |
| 351 aura::test::EventGenerator generator(root_window()); |
| 352 generator.PressTouchId(1); |
| 353 generator.PressTouchId(2); |
| 354 ClearCapturedEvents(); |
| 355 |
| 356 // Confirm events from other fingers go through as is. |
| 357 ui::TouchEvent touch3_press(ui::ET_TOUCH_PRESSED, |
| 358 gfx::Point(10, 11), |
| 359 3, |
| 360 ui::EventTimeForNow()); |
| 361 ui::TouchEvent touch3_move1(ui::ET_TOUCH_MOVED, |
| 362 gfx::Point(12, 13), |
| 363 3, |
| 364 ui::EventTimeForNow()); |
| 365 ui::TouchEvent touch4_press(ui::ET_TOUCH_PRESSED, |
| 366 gfx::Point(20, 21), |
| 367 4, |
| 368 ui::EventTimeForNow()); |
| 369 ui::TouchEvent touch3_move2(ui::ET_TOUCH_MOVED, |
| 370 gfx::Point(14, 15), |
| 371 3, |
| 372 ui::EventTimeForNow()); |
| 373 ui::TouchEvent touch4_move(ui::ET_TOUCH_MOVED, |
| 374 gfx::Point(22, 23), |
| 375 4, |
| 376 ui::EventTimeForNow()); |
| 377 ui::TouchEvent touch3_release(ui::ET_TOUCH_RELEASED, |
| 378 gfx::Point(14, 15), |
| 379 3, |
| 380 ui::EventTimeForNow()); |
| 381 ui::TouchEvent touch4_release(ui::ET_TOUCH_RELEASED, |
| 382 gfx::Point(22, 23), |
| 383 4, |
| 384 ui::EventTimeForNow()); |
| 385 generator.Dispatch(&touch3_press); |
| 386 generator.Dispatch(&touch3_move1); |
| 387 generator.Dispatch(&touch4_press); |
| 388 generator.Dispatch(&touch3_move2); |
| 389 generator.Dispatch(&touch4_move); |
| 390 generator.Dispatch(&touch3_release); |
| 391 generator.Dispatch(&touch4_release); |
| 392 |
| 393 const ScopedVector<ui::LocatedEvent>& captured_events = GetCapturedEvents(); |
| 394 ASSERT_EQ(7u, captured_events.size()); |
| 395 CONFIRM_EVENTS_ARE_TOUCH_AND_EQUAL(captured_events[0], &touch3_press); |
| 396 CONFIRM_EVENTS_ARE_TOUCH_AND_EQUAL(captured_events[1], &touch3_move1); |
| 397 CONFIRM_EVENTS_ARE_TOUCH_AND_EQUAL(captured_events[2], &touch4_press); |
| 398 CONFIRM_EVENTS_ARE_TOUCH_AND_EQUAL(captured_events[3], &touch3_move2); |
| 399 CONFIRM_EVENTS_ARE_TOUCH_AND_EQUAL(captured_events[4], &touch4_move); |
| 400 CONFIRM_EVENTS_ARE_TOUCH_AND_EQUAL(captured_events[5], &touch3_release); |
| 401 CONFIRM_EVENTS_ARE_TOUCH_AND_EQUAL(captured_events[6], &touch4_release); |
| 402 } |
| 403 |
| 404 // Test the case when there are multiple fingers on the screen and the first |
| 405 // finger is released. This should be rewritten as a release of the second |
| 406 // finger. Additionally, if the second finger is the only finger left touching, |
| 407 // we should enter a mouse move mode, and a mouse move event should be |
| 408 // dispatched. |
| 409 TEST_F(TouchExplorationTest, FirstFingerLifted) { |
| 410 SwitchTouchExplorationMode(true); |
| 411 aura::test::EventGenerator generator(root_window()); |
| 412 generator.PressTouchId(1); |
| 413 generator.PressTouchId(2); |
| 414 gfx::Point touch2_location(10, 11); |
| 415 generator.MoveTouchId(touch2_location, 2); |
| 416 generator.PressTouchId(3); |
| 417 gfx::Point touch3_location(20, 21); |
| 418 generator.MoveTouchId(touch3_location, 3); |
| 419 ClearCapturedEvents(); |
| 420 |
| 421 // Release of finger 1 should be rewritten as a release of finger 2. |
| 422 generator.ReleaseTouchId(1); |
| 423 const ScopedVector<ui::LocatedEvent>& captured_events = GetCapturedEvents(); |
| 424 ASSERT_EQ(1u, captured_events.size()); |
| 425 EXPECT_EQ(ui::ET_TOUCH_RELEASED, captured_events[0]->type()); |
| 426 ui::TouchEvent* touch_event = |
| 427 static_cast<ui::TouchEvent*>(captured_events[0]); |
| 428 EXPECT_EQ(2, touch_event->touch_id()); |
| 429 EXPECT_EQ(touch2_location, touch_event->location()); |
| 430 ClearCapturedEvents(); |
| 431 |
| 432 // Release of finger 2 should be rewritten as a release of finger 3, plus |
| 433 // we should enter the mouse move mode and a mouse move event should be |
| 434 // dispatched. |
| 435 cursor_client()->ShowCursor(); |
| 436 cursor_client()->DisableMouseEvents(); |
| 437 generator.ReleaseTouchId(2); |
| 438 EXPECT_TRUE(IsInTouchToMouseMode()); |
| 439 ASSERT_GE(2u, captured_events.size()); |
| 440 EXPECT_EQ(ui::ET_TOUCH_RELEASED, captured_events[0]->type()); |
| 441 touch_event = static_cast<ui::TouchEvent*>(captured_events[0]); |
| 442 EXPECT_EQ(3, touch_event->touch_id()); |
| 443 EXPECT_EQ(touch3_location, touch_event->location()); |
| 444 // TODO(mfomitchev): mouse enter/exit events |
| 445 ScopedVector<ui::LocatedEvent>::const_iterator it; |
| 446 for (it = captured_events.begin(); it != captured_events.end(); ++it) { |
| 447 if ((*it)->type() == ui::ET_MOUSE_MOVED) { |
| 448 EXPECT_EQ(touch3_location, (*it)->location()); |
| 449 break; |
| 450 } |
| 451 } |
| 452 EXPECT_NE(captured_events.end(), it); |
| 453 } |
| 454 |
| 455 } // namespace ui |
OLD | NEW |