Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ui/aura/root_window.h" | 5 #include "ui/aura/root_window.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 423 } | 423 } |
| 424 | 424 |
| 425 namespace { | 425 namespace { |
| 426 | 426 |
| 427 // FilterFilter that tracks the types of events it's seen. | 427 // FilterFilter that tracks the types of events it's seen. |
| 428 class EventFilterRecorder : public ui::EventHandler { | 428 class EventFilterRecorder : public ui::EventHandler { |
| 429 public: | 429 public: |
| 430 typedef std::vector<ui::EventType> Events; | 430 typedef std::vector<ui::EventType> Events; |
| 431 typedef std::vector<gfx::Point> EventLocations; | 431 typedef std::vector<gfx::Point> EventLocations; |
| 432 | 432 |
| 433 EventFilterRecorder() {} | 433 EventFilterRecorder() |
| 434 : wait_until_event_(ui::ET_UNKNOWN) { | |
| 435 } | |
| 434 | 436 |
| 435 const Events& events() const { return events_; } | 437 const Events& events() const { return events_; } |
| 436 | 438 |
| 437 const EventLocations& mouse_locations() const { return mouse_locations_; } | 439 const EventLocations& mouse_locations() const { return mouse_locations_; } |
| 438 gfx::Point mouse_location(int i) const { return mouse_locations_[i]; } | 440 gfx::Point mouse_location(int i) const { return mouse_locations_[i]; } |
| 439 const EventLocations& touch_locations() const { return touch_locations_; } | 441 const EventLocations& touch_locations() const { return touch_locations_; } |
| 440 | 442 |
| 443 void WaitUntilReceivedGesture(ui::EventType type) { | |
|
sadrul
2014/01/15 19:08:59
Call this WaitUntilReceivedEvent
tdresser
2014/01/15 19:30:41
Done.
| |
| 444 wait_until_event_ = type; | |
| 445 run_loop_.reset(new base::RunLoop( | |
| 446 Env::GetInstance()->GetDispatcher())); | |
| 447 run_loop_->Run(); | |
| 448 } | |
| 449 | |
| 441 Events GetAndResetEvents() { | 450 Events GetAndResetEvents() { |
| 442 Events events = events_; | 451 Events events = events_; |
| 443 Reset(); | 452 Reset(); |
| 444 return events; | 453 return events; |
| 445 } | 454 } |
| 446 | 455 |
| 447 void Reset() { | 456 void Reset() { |
| 448 events_.clear(); | 457 events_.clear(); |
| 449 mouse_locations_.clear(); | 458 mouse_locations_.clear(); |
| 450 touch_locations_.clear(); | 459 touch_locations_.clear(); |
| 451 } | 460 } |
| 452 | 461 |
| 453 // ui::EventHandler overrides: | 462 // ui::EventHandler overrides: |
| 454 virtual void OnEvent(ui::Event* event) OVERRIDE { | 463 virtual void OnEvent(ui::Event* event) OVERRIDE { |
| 455 ui::EventHandler::OnEvent(event); | 464 ui::EventHandler::OnEvent(event); |
| 456 events_.push_back(event->type()); | 465 events_.push_back(event->type()); |
| 457 } | 466 } |
| 458 | 467 |
| 459 virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { | 468 virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { |
| 460 mouse_locations_.push_back(event->location()); | 469 mouse_locations_.push_back(event->location()); |
| 461 } | 470 } |
| 462 | 471 |
| 463 virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE { | 472 virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE { |
| 464 touch_locations_.push_back(event->location()); | 473 touch_locations_.push_back(event->location()); |
| 465 } | 474 } |
| 466 | 475 |
| 476 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { | |
| 477 if (wait_until_event_ == event->type() && run_loop_) { | |
| 478 run_loop_->Quit(); | |
| 479 wait_until_event_ = ui::ET_UNKNOWN; | |
|
sadrul
2014/01/15 19:08:59
Do this in OnEvent
tdresser
2014/01/15 19:30:41
Done.
| |
| 480 } | |
| 481 } | |
| 482 | |
| 467 private: | 483 private: |
| 484 scoped_ptr<base::RunLoop> run_loop_; | |
| 485 ui::EventType wait_until_event_; | |
| 486 | |
| 468 Events events_; | 487 Events events_; |
| 469 EventLocations mouse_locations_; | 488 EventLocations mouse_locations_; |
| 470 EventLocations touch_locations_; | 489 EventLocations touch_locations_; |
| 471 | 490 |
| 472 DISALLOW_COPY_AND_ASSIGN(EventFilterRecorder); | 491 DISALLOW_COPY_AND_ASSIGN(EventFilterRecorder); |
| 473 }; | 492 }; |
| 474 | 493 |
| 475 // Converts an EventType to a string. | 494 // Converts an EventType to a string. |
| 476 std::string EventTypeToString(ui::EventType type) { | 495 std::string EventTypeToString(ui::EventType type) { |
| 477 switch (type) { | 496 switch (type) { |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 662 &mouse_dragged_event); | 681 &mouse_dragged_event); |
| 663 dispatcher()->ReleasePointerMoves(); | 682 dispatcher()->ReleasePointerMoves(); |
| 664 dispatcher()->AsWindowTreeHostDelegate()->OnHostMouseEvent( | 683 dispatcher()->AsWindowTreeHostDelegate()->OnHostMouseEvent( |
| 665 &mouse_dragged_event2); | 684 &mouse_dragged_event2); |
| 666 EXPECT_EQ("MOUSE_DRAGGED", EventTypesToString(filter->events())); | 685 EXPECT_EQ("MOUSE_DRAGGED", EventTypesToString(filter->events())); |
| 667 filter->Reset(); | 686 filter->Reset(); |
| 668 RunAllPendingInMessageLoop(); | 687 RunAllPendingInMessageLoop(); |
| 669 EXPECT_TRUE(filter->events().empty()); | 688 EXPECT_TRUE(filter->events().empty()); |
| 670 } | 689 } |
| 671 | 690 |
| 672 #if defined(OS_CHROMEOS) | 691 TEST_F(RootWindowTest, TouchMovesHeld) { |
| 673 // This test may be flaky on Chromium OS valgrind bots: http://crbug.com/333644 | |
| 674 #define MAYBE_TouchMovesHeld DISABLED_TouchMovesHeld | |
| 675 #else | |
| 676 #define MAYBE_TouchMovesHeld TouchMovesHeld | |
| 677 #endif | |
| 678 TEST_F(RootWindowTest, MAYBE_TouchMovesHeld) { | |
| 679 EventFilterRecorder* filter = new EventFilterRecorder; | 692 EventFilterRecorder* filter = new EventFilterRecorder; |
| 680 root_window()->SetEventFilter(filter); // passes ownership | 693 root_window()->SetEventFilter(filter); // passes ownership |
| 681 | 694 |
| 682 test::TestWindowDelegate delegate; | 695 test::TestWindowDelegate delegate; |
| 683 scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( | 696 scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( |
| 684 &delegate, 1, gfx::Rect(50, 50, 100, 100), root_window())); | 697 &delegate, 1, gfx::Rect(50, 50, 100, 100), root_window())); |
| 685 | 698 |
| 686 const gfx::Point touch_location(60, 60); | 699 const gfx::Point touch_location(60, 60); |
| 687 // Starting the touch and throwing out the first few events, since the system | 700 // Starting the touch and throwing out the first few events, since the system |
| 688 // is going to generate synthetic mouse events that are not relevant to the | 701 // is going to generate synthetic mouse events that are not relevant to the |
| 689 // test. | 702 // test. |
| 690 ui::TouchEvent touch_pressed_event(ui::ET_TOUCH_PRESSED, touch_location, | 703 ui::TouchEvent touch_pressed_event(ui::ET_TOUCH_PRESSED, touch_location, |
| 691 0, base::TimeDelta()); | 704 0, base::TimeDelta()); |
| 692 dispatcher()->AsWindowTreeHostDelegate()->OnHostTouchEvent( | 705 dispatcher()->AsWindowTreeHostDelegate()->OnHostTouchEvent( |
| 693 &touch_pressed_event); | 706 &touch_pressed_event); |
| 694 RunAllPendingInMessageLoop(); | 707 filter->WaitUntilReceivedGesture(ui::ET_GESTURE_SHOW_PRESS); |
| 695 filter->Reset(); | 708 filter->Reset(); |
| 696 | 709 |
| 697 dispatcher()->HoldPointerMoves(); | 710 dispatcher()->HoldPointerMoves(); |
| 698 | 711 |
| 699 // Check that we don't immediately dispatch the TOUCH_MOVED event. | 712 // Check that we don't immediately dispatch the TOUCH_MOVED event. |
| 700 ui::TouchEvent touch_moved_event(ui::ET_TOUCH_MOVED, touch_location, | 713 ui::TouchEvent touch_moved_event(ui::ET_TOUCH_MOVED, touch_location, |
| 701 0, base::TimeDelta()); | 714 0, base::TimeDelta()); |
| 702 dispatcher()->AsWindowTreeHostDelegate()->OnHostTouchEvent( | 715 dispatcher()->AsWindowTreeHostDelegate()->OnHostTouchEvent( |
| 703 &touch_moved_event); | 716 &touch_moved_event); |
| 704 EXPECT_TRUE(filter->events().empty()); | 717 EXPECT_TRUE(filter->events().empty()); |
| (...skipping 897 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1602 CHECK(!message_loop()->is_running()); | 1615 CHECK(!message_loop()->is_running()); |
| 1603 // Perform the test in a callback, so that it runs after the message-loop | 1616 // Perform the test in a callback, so that it runs after the message-loop |
| 1604 // starts. | 1617 // starts. |
| 1605 message_loop()->PostTask(FROM_HERE, | 1618 message_loop()->PostTask(FROM_HERE, |
| 1606 base::Bind(&RootWindowTestWithMessageLoop::RunTest, | 1619 base::Bind(&RootWindowTestWithMessageLoop::RunTest, |
| 1607 base::Unretained(this))); | 1620 base::Unretained(this))); |
| 1608 message_loop()->Run(); | 1621 message_loop()->Run(); |
| 1609 } | 1622 } |
| 1610 | 1623 |
| 1611 } // namespace aura | 1624 } // namespace aura |
| OLD | NEW |