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/window_event_dispatcher.h" | 5 #include "ui/aura/window_event_dispatcher.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 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 EXPECT_TRUE(delegate1->mouse_event_flags() & ui::EF_IS_NON_CLIENT); | 133 EXPECT_TRUE(delegate1->mouse_event_flags() & ui::EF_IS_NON_CLIENT); |
134 } | 134 } |
135 | 135 |
136 TEST_F(WindowEventDispatcherTest, RepostEvent) { | 136 TEST_F(WindowEventDispatcherTest, RepostEvent) { |
137 // Test RepostEvent in RootWindow. It only works for Mouse Press. | 137 // Test RepostEvent in RootWindow. It only works for Mouse Press. |
138 EXPECT_FALSE(Env::GetInstance()->IsMouseButtonDown()); | 138 EXPECT_FALSE(Env::GetInstance()->IsMouseButtonDown()); |
139 gfx::Point point(10, 10); | 139 gfx::Point point(10, 10); |
140 ui::MouseEvent event( | 140 ui::MouseEvent event( |
141 ui::ET_MOUSE_PRESSED, point, point, ui::EF_LEFT_MOUSE_BUTTON, | 141 ui::ET_MOUSE_PRESSED, point, point, ui::EF_LEFT_MOUSE_BUTTON, |
142 ui::EF_LEFT_MOUSE_BUTTON); | 142 ui::EF_LEFT_MOUSE_BUTTON); |
143 dispatcher()->RepostEvent(event); | 143 host()->dispatcher()->RepostEvent(event); |
144 RunAllPendingInMessageLoop(); | 144 RunAllPendingInMessageLoop(); |
145 EXPECT_TRUE(Env::GetInstance()->IsMouseButtonDown()); | 145 EXPECT_TRUE(Env::GetInstance()->IsMouseButtonDown()); |
146 } | 146 } |
147 | 147 |
148 // Check that we correctly track the state of the mouse buttons in response to | 148 // Check that we correctly track the state of the mouse buttons in response to |
149 // button press and release events. | 149 // button press and release events. |
150 TEST_F(WindowEventDispatcherTest, MouseButtonState) { | 150 TEST_F(WindowEventDispatcherTest, MouseButtonState) { |
151 EXPECT_FALSE(Env::GetInstance()->IsMouseButtonDown()); | 151 EXPECT_FALSE(Env::GetInstance()->IsMouseButtonDown()); |
152 | 152 |
153 gfx::Point location; | 153 gfx::Point location; |
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
585 // capture). | 585 // capture). |
586 EXPECT_FALSE(Env::GetInstance()->IsMouseButtonDown()); | 586 EXPECT_FALSE(Env::GetInstance()->IsMouseButtonDown()); |
587 scoped_ptr<Window> window(CreateNormalWindow(1, root_window(), NULL)); | 587 scoped_ptr<Window> window(CreateNormalWindow(1, root_window(), NULL)); |
588 window->SetBounds(gfx::Rect(20, 20, 40, 30)); | 588 window->SetBounds(gfx::Rect(20, 20, 40, 30)); |
589 EventFilterRecorder* recorder = new EventFilterRecorder; | 589 EventFilterRecorder* recorder = new EventFilterRecorder; |
590 window->SetEventFilter(recorder); // Takes ownership. | 590 window->SetEventFilter(recorder); // Takes ownership. |
591 window->SetCapture(); | 591 window->SetCapture(); |
592 const ui::MouseEvent press_event( | 592 const ui::MouseEvent press_event( |
593 ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), | 593 ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), |
594 ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); | 594 ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); |
595 dispatcher()->RepostEvent(press_event); | 595 host()->dispatcher()->RepostEvent(press_event); |
596 RunAllPendingInMessageLoop(); // Necessitated by RepostEvent(). | 596 RunAllPendingInMessageLoop(); // Necessitated by RepostEvent(). |
597 // Mouse moves/enters may be generated. We only care about a pressed. | 597 // Mouse moves/enters may be generated. We only care about a pressed. |
598 EXPECT_TRUE(EventTypesToString(recorder->events()).find("MOUSE_PRESSED") != | 598 EXPECT_TRUE(EventTypesToString(recorder->events()).find("MOUSE_PRESSED") != |
599 std::string::npos) << EventTypesToString(recorder->events()); | 599 std::string::npos) << EventTypesToString(recorder->events()); |
600 } | 600 } |
601 | 601 |
602 TEST_F(WindowEventDispatcherTest, MouseMovesHeld) { | 602 TEST_F(WindowEventDispatcherTest, MouseMovesHeld) { |
603 EventFilterRecorder* filter = new EventFilterRecorder; | 603 EventFilterRecorder* filter = new EventFilterRecorder; |
604 root_window()->SetEventFilter(filter); // passes ownership | 604 root_window()->SetEventFilter(filter); // passes ownership |
605 | 605 |
606 test::TestWindowDelegate delegate; | 606 test::TestWindowDelegate delegate; |
607 scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( | 607 scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( |
608 &delegate, 1, gfx::Rect(0, 0, 100, 100), root_window())); | 608 &delegate, 1, gfx::Rect(0, 0, 100, 100), root_window())); |
609 | 609 |
610 ui::MouseEvent mouse_move_event(ui::ET_MOUSE_MOVED, gfx::Point(0, 0), | 610 ui::MouseEvent mouse_move_event(ui::ET_MOUSE_MOVED, gfx::Point(0, 0), |
611 gfx::Point(0, 0), 0, 0); | 611 gfx::Point(0, 0), 0, 0); |
612 DispatchEventUsingWindowDispatcher(&mouse_move_event); | 612 DispatchEventUsingWindowDispatcher(&mouse_move_event); |
613 // Discard MOUSE_ENTER. | 613 // Discard MOUSE_ENTER. |
614 filter->Reset(); | 614 filter->Reset(); |
615 | 615 |
616 dispatcher()->HoldPointerMoves(); | 616 host()->dispatcher()->HoldPointerMoves(); |
617 | 617 |
618 // Check that we don't immediately dispatch the MOUSE_DRAGGED event. | 618 // Check that we don't immediately dispatch the MOUSE_DRAGGED event. |
619 ui::MouseEvent mouse_dragged_event(ui::ET_MOUSE_DRAGGED, gfx::Point(0, 0), | 619 ui::MouseEvent mouse_dragged_event(ui::ET_MOUSE_DRAGGED, gfx::Point(0, 0), |
620 gfx::Point(0, 0), 0, 0); | 620 gfx::Point(0, 0), 0, 0); |
621 DispatchEventUsingWindowDispatcher(&mouse_dragged_event); | 621 DispatchEventUsingWindowDispatcher(&mouse_dragged_event); |
622 EXPECT_TRUE(filter->events().empty()); | 622 EXPECT_TRUE(filter->events().empty()); |
623 | 623 |
624 // Check that we do dispatch the held MOUSE_DRAGGED event before another type | 624 // Check that we do dispatch the held MOUSE_DRAGGED event before another type |
625 // of event. | 625 // of event. |
626 ui::MouseEvent mouse_pressed_event(ui::ET_MOUSE_PRESSED, gfx::Point(0, 0), | 626 ui::MouseEvent mouse_pressed_event(ui::ET_MOUSE_PRESSED, gfx::Point(0, 0), |
(...skipping 10 matching lines...) Expand all Loading... |
637 DispatchEventUsingWindowDispatcher(&mouse_dragged_event2); | 637 DispatchEventUsingWindowDispatcher(&mouse_dragged_event2); |
638 EXPECT_TRUE(filter->events().empty()); | 638 EXPECT_TRUE(filter->events().empty()); |
639 DispatchEventUsingWindowDispatcher(&mouse_pressed_event); | 639 DispatchEventUsingWindowDispatcher(&mouse_pressed_event); |
640 EXPECT_EQ("MOUSE_DRAGGED MOUSE_PRESSED", | 640 EXPECT_EQ("MOUSE_DRAGGED MOUSE_PRESSED", |
641 EventTypesToString(filter->events())); | 641 EventTypesToString(filter->events())); |
642 filter->Reset(); | 642 filter->Reset(); |
643 | 643 |
644 // Check that on ReleasePointerMoves, held events are not dispatched | 644 // Check that on ReleasePointerMoves, held events are not dispatched |
645 // immediately, but posted instead. | 645 // immediately, but posted instead. |
646 DispatchEventUsingWindowDispatcher(&mouse_dragged_event); | 646 DispatchEventUsingWindowDispatcher(&mouse_dragged_event); |
647 dispatcher()->ReleasePointerMoves(); | 647 host()->dispatcher()->ReleasePointerMoves(); |
648 EXPECT_TRUE(filter->events().empty()); | 648 EXPECT_TRUE(filter->events().empty()); |
649 RunAllPendingInMessageLoop(); | 649 RunAllPendingInMessageLoop(); |
650 EXPECT_EQ("MOUSE_DRAGGED", EventTypesToString(filter->events())); | 650 EXPECT_EQ("MOUSE_DRAGGED", EventTypesToString(filter->events())); |
651 filter->Reset(); | 651 filter->Reset(); |
652 | 652 |
653 // However if another message comes in before the dispatch of the posted | 653 // However if another message comes in before the dispatch of the posted |
654 // event, check that the posted event is dispatched before this new event. | 654 // event, check that the posted event is dispatched before this new event. |
655 dispatcher()->HoldPointerMoves(); | 655 host()->dispatcher()->HoldPointerMoves(); |
656 DispatchEventUsingWindowDispatcher(&mouse_dragged_event); | 656 DispatchEventUsingWindowDispatcher(&mouse_dragged_event); |
657 dispatcher()->ReleasePointerMoves(); | 657 host()->dispatcher()->ReleasePointerMoves(); |
658 DispatchEventUsingWindowDispatcher(&mouse_pressed_event); | 658 DispatchEventUsingWindowDispatcher(&mouse_pressed_event); |
659 EXPECT_EQ("MOUSE_DRAGGED MOUSE_PRESSED", | 659 EXPECT_EQ("MOUSE_DRAGGED MOUSE_PRESSED", |
660 EventTypesToString(filter->events())); | 660 EventTypesToString(filter->events())); |
661 filter->Reset(); | 661 filter->Reset(); |
662 RunAllPendingInMessageLoop(); | 662 RunAllPendingInMessageLoop(); |
663 EXPECT_TRUE(filter->events().empty()); | 663 EXPECT_TRUE(filter->events().empty()); |
664 | 664 |
665 // Check that if the other message is another MOUSE_DRAGGED, we still coalesce | 665 // Check that if the other message is another MOUSE_DRAGGED, we still coalesce |
666 // them. | 666 // them. |
667 dispatcher()->HoldPointerMoves(); | 667 host()->dispatcher()->HoldPointerMoves(); |
668 DispatchEventUsingWindowDispatcher(&mouse_dragged_event); | 668 DispatchEventUsingWindowDispatcher(&mouse_dragged_event); |
669 dispatcher()->ReleasePointerMoves(); | 669 host()->dispatcher()->ReleasePointerMoves(); |
670 DispatchEventUsingWindowDispatcher(&mouse_dragged_event2); | 670 DispatchEventUsingWindowDispatcher(&mouse_dragged_event2); |
671 EXPECT_EQ("MOUSE_DRAGGED", EventTypesToString(filter->events())); | 671 EXPECT_EQ("MOUSE_DRAGGED", EventTypesToString(filter->events())); |
672 filter->Reset(); | 672 filter->Reset(); |
673 RunAllPendingInMessageLoop(); | 673 RunAllPendingInMessageLoop(); |
674 EXPECT_TRUE(filter->events().empty()); | 674 EXPECT_TRUE(filter->events().empty()); |
675 | 675 |
676 // Check that synthetic mouse move event has a right location when issued | 676 // Check that synthetic mouse move event has a right location when issued |
677 // while holding pointer moves. | 677 // while holding pointer moves. |
678 ui::MouseEvent mouse_dragged_event3(ui::ET_MOUSE_DRAGGED, gfx::Point(28, 28), | 678 ui::MouseEvent mouse_dragged_event3(ui::ET_MOUSE_DRAGGED, gfx::Point(28, 28), |
679 gfx::Point(28, 28), 0, 0); | 679 gfx::Point(28, 28), 0, 0); |
680 dispatcher()->HoldPointerMoves(); | 680 host()->dispatcher()->HoldPointerMoves(); |
681 DispatchEventUsingWindowDispatcher(&mouse_dragged_event); | 681 DispatchEventUsingWindowDispatcher(&mouse_dragged_event); |
682 DispatchEventUsingWindowDispatcher(&mouse_dragged_event2); | 682 DispatchEventUsingWindowDispatcher(&mouse_dragged_event2); |
683 window->SetBounds(gfx::Rect(15, 15, 80, 80)); | 683 window->SetBounds(gfx::Rect(15, 15, 80, 80)); |
684 DispatchEventUsingWindowDispatcher(&mouse_dragged_event3); | 684 DispatchEventUsingWindowDispatcher(&mouse_dragged_event3); |
685 RunAllPendingInMessageLoop(); | 685 RunAllPendingInMessageLoop(); |
686 EXPECT_TRUE(filter->events().empty()); | 686 EXPECT_TRUE(filter->events().empty()); |
687 dispatcher()->ReleasePointerMoves(); | 687 host()->dispatcher()->ReleasePointerMoves(); |
688 RunAllPendingInMessageLoop(); | 688 RunAllPendingInMessageLoop(); |
689 EXPECT_EQ("MOUSE_MOVED", EventTypesToString(filter->events())); | 689 EXPECT_EQ("MOUSE_MOVED", EventTypesToString(filter->events())); |
690 EXPECT_EQ(gfx::Point(13, 13), filter->mouse_location(0)); | 690 EXPECT_EQ(gfx::Point(13, 13), filter->mouse_location(0)); |
691 filter->Reset(); | 691 filter->Reset(); |
692 } | 692 } |
693 | 693 |
694 TEST_F(WindowEventDispatcherTest, TouchMovesHeld) { | 694 TEST_F(WindowEventDispatcherTest, TouchMovesHeld) { |
695 EventFilterRecorder* filter = new EventFilterRecorder; | 695 EventFilterRecorder* filter = new EventFilterRecorder; |
696 root_window()->SetEventFilter(filter); // passes ownership | 696 root_window()->SetEventFilter(filter); // passes ownership |
697 | 697 |
698 test::TestWindowDelegate delegate; | 698 test::TestWindowDelegate delegate; |
699 scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( | 699 scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( |
700 &delegate, 1, gfx::Rect(50, 50, 100, 100), root_window())); | 700 &delegate, 1, gfx::Rect(50, 50, 100, 100), root_window())); |
701 | 701 |
702 const gfx::Point touch_location(60, 60); | 702 const gfx::Point touch_location(60, 60); |
703 // Starting the touch and throwing out the first few events, since the system | 703 // Starting the touch and throwing out the first few events, since the system |
704 // is going to generate synthetic mouse events that are not relevant to the | 704 // is going to generate synthetic mouse events that are not relevant to the |
705 // test. | 705 // test. |
706 ui::TouchEvent touch_pressed_event(ui::ET_TOUCH_PRESSED, touch_location, | 706 ui::TouchEvent touch_pressed_event(ui::ET_TOUCH_PRESSED, touch_location, |
707 0, base::TimeDelta()); | 707 0, base::TimeDelta()); |
708 DispatchEventUsingWindowDispatcher(&touch_pressed_event); | 708 DispatchEventUsingWindowDispatcher(&touch_pressed_event); |
709 filter->WaitUntilReceivedEvent(ui::ET_GESTURE_SHOW_PRESS); | 709 filter->WaitUntilReceivedEvent(ui::ET_GESTURE_SHOW_PRESS); |
710 filter->Reset(); | 710 filter->Reset(); |
711 | 711 |
712 dispatcher()->HoldPointerMoves(); | 712 host()->dispatcher()->HoldPointerMoves(); |
713 | 713 |
714 // Check that we don't immediately dispatch the TOUCH_MOVED event. | 714 // Check that we don't immediately dispatch the TOUCH_MOVED event. |
715 ui::TouchEvent touch_moved_event(ui::ET_TOUCH_MOVED, touch_location, | 715 ui::TouchEvent touch_moved_event(ui::ET_TOUCH_MOVED, touch_location, |
716 0, base::TimeDelta()); | 716 0, base::TimeDelta()); |
717 DispatchEventUsingWindowDispatcher(&touch_moved_event); | 717 DispatchEventUsingWindowDispatcher(&touch_moved_event); |
718 EXPECT_TRUE(filter->events().empty()); | 718 EXPECT_TRUE(filter->events().empty()); |
719 | 719 |
720 // Check that on ReleasePointerMoves, held events are not dispatched | 720 // Check that on ReleasePointerMoves, held events are not dispatched |
721 // immediately, but posted instead. | 721 // immediately, but posted instead. |
722 DispatchEventUsingWindowDispatcher(&touch_moved_event); | 722 DispatchEventUsingWindowDispatcher(&touch_moved_event); |
723 dispatcher()->ReleasePointerMoves(); | 723 host()->dispatcher()->ReleasePointerMoves(); |
724 EXPECT_TRUE(filter->events().empty()); | 724 EXPECT_TRUE(filter->events().empty()); |
725 | 725 |
726 RunAllPendingInMessageLoop(); | 726 RunAllPendingInMessageLoop(); |
727 EXPECT_EQ("TOUCH_MOVED", EventTypesToString(filter->events())); | 727 EXPECT_EQ("TOUCH_MOVED", EventTypesToString(filter->events())); |
728 filter->Reset(); | 728 filter->Reset(); |
729 | 729 |
730 // If another touch event occurs then the held touch should be dispatched | 730 // If another touch event occurs then the held touch should be dispatched |
731 // immediately before it. | 731 // immediately before it. |
732 ui::TouchEvent touch_released_event(ui::ET_TOUCH_RELEASED, touch_location, | 732 ui::TouchEvent touch_released_event(ui::ET_TOUCH_RELEASED, touch_location, |
733 0, base::TimeDelta()); | 733 0, base::TimeDelta()); |
734 filter->Reset(); | 734 filter->Reset(); |
735 dispatcher()->HoldPointerMoves(); | 735 host()->dispatcher()->HoldPointerMoves(); |
736 DispatchEventUsingWindowDispatcher(&touch_moved_event); | 736 DispatchEventUsingWindowDispatcher(&touch_moved_event); |
737 DispatchEventUsingWindowDispatcher(&touch_released_event); | 737 DispatchEventUsingWindowDispatcher(&touch_released_event); |
738 EXPECT_EQ("TOUCH_MOVED TOUCH_RELEASED GESTURE_TAP_CANCEL GESTURE_END", | 738 EXPECT_EQ("TOUCH_MOVED TOUCH_RELEASED GESTURE_TAP_CANCEL GESTURE_END", |
739 EventTypesToString(filter->events())); | 739 EventTypesToString(filter->events())); |
740 filter->Reset(); | 740 filter->Reset(); |
741 dispatcher()->ReleasePointerMoves(); | 741 host()->dispatcher()->ReleasePointerMoves(); |
742 RunAllPendingInMessageLoop(); | 742 RunAllPendingInMessageLoop(); |
743 EXPECT_TRUE(filter->events().empty()); | 743 EXPECT_TRUE(filter->events().empty()); |
744 } | 744 } |
745 | 745 |
746 class HoldPointerOnScrollHandler : public test::TestEventHandler { | 746 class HoldPointerOnScrollHandler : public test::TestEventHandler { |
747 public: | 747 public: |
748 HoldPointerOnScrollHandler(WindowEventDispatcher* dispatcher, | 748 HoldPointerOnScrollHandler(WindowEventDispatcher* dispatcher, |
749 EventFilterRecorder* filter) | 749 EventFilterRecorder* filter) |
750 : dispatcher_(dispatcher), | 750 : dispatcher_(dispatcher), |
751 filter_(filter), | 751 filter_(filter), |
(...skipping 20 matching lines...) Expand all Loading... |
772 | 772 |
773 DISALLOW_COPY_AND_ASSIGN(HoldPointerOnScrollHandler); | 773 DISALLOW_COPY_AND_ASSIGN(HoldPointerOnScrollHandler); |
774 }; | 774 }; |
775 | 775 |
776 // Tests that touch-move events don't contribute to an in-progress scroll | 776 // Tests that touch-move events don't contribute to an in-progress scroll |
777 // gesture if touch-move events are being held by the dispatcher. | 777 // gesture if touch-move events are being held by the dispatcher. |
778 TEST_F(WindowEventDispatcherTest, TouchMovesHeldOnScroll) { | 778 TEST_F(WindowEventDispatcherTest, TouchMovesHeldOnScroll) { |
779 EventFilterRecorder* filter = new EventFilterRecorder; | 779 EventFilterRecorder* filter = new EventFilterRecorder; |
780 root_window()->SetEventFilter(filter); | 780 root_window()->SetEventFilter(filter); |
781 test::TestWindowDelegate delegate; | 781 test::TestWindowDelegate delegate; |
782 HoldPointerOnScrollHandler handler(dispatcher(), filter); | 782 HoldPointerOnScrollHandler handler(host()->dispatcher(), filter); |
783 scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( | 783 scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( |
784 &delegate, 1, gfx::Rect(50, 50, 100, 100), root_window())); | 784 &delegate, 1, gfx::Rect(50, 50, 100, 100), root_window())); |
785 window->AddPreTargetHandler(&handler); | 785 window->AddPreTargetHandler(&handler); |
786 | 786 |
787 test::EventGenerator generator(root_window()); | 787 test::EventGenerator generator(root_window()); |
788 generator.GestureScrollSequence( | 788 generator.GestureScrollSequence( |
789 gfx::Point(60, 60), gfx::Point(10, 60), | 789 gfx::Point(60, 60), gfx::Point(10, 60), |
790 base::TimeDelta::FromMilliseconds(100), 25); | 790 base::TimeDelta::FromMilliseconds(100), 25); |
791 | 791 |
792 // |handler| will have reset |filter| and started holding the touch-move | 792 // |handler| will have reset |filter| and started holding the touch-move |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
854 // Dispatch a mouse move event into the window. | 854 // Dispatch a mouse move event into the window. |
855 gfx::Point mouse_location(gfx::Point(15, 25)); | 855 gfx::Point mouse_location(gfx::Point(15, 25)); |
856 ui::MouseEvent mouse1(ui::ET_MOUSE_MOVED, mouse_location, | 856 ui::MouseEvent mouse1(ui::ET_MOUSE_MOVED, mouse_location, |
857 mouse_location, 0, 0); | 857 mouse_location, 0, 0); |
858 EXPECT_TRUE(filter->events().empty()); | 858 EXPECT_TRUE(filter->events().empty()); |
859 DispatchEventUsingWindowDispatcher(&mouse1); | 859 DispatchEventUsingWindowDispatcher(&mouse1); |
860 EXPECT_FALSE(filter->events().empty()); | 860 EXPECT_FALSE(filter->events().empty()); |
861 filter->Reset(); | 861 filter->Reset(); |
862 | 862 |
863 // Hide the cursor and verify a mouse exit was dispatched. | 863 // Hide the cursor and verify a mouse exit was dispatched. |
864 dispatcher()->host()->OnCursorVisibilityChanged(false); | 864 host()->OnCursorVisibilityChanged(false); |
865 EXPECT_FALSE(filter->events().empty()); | 865 EXPECT_FALSE(filter->events().empty()); |
866 EXPECT_EQ("MOUSE_EXITED", EventTypesToString(filter->events())); | 866 EXPECT_EQ("MOUSE_EXITED", EventTypesToString(filter->events())); |
867 | 867 |
868 // Verify the mouse exit was dispatched at the correct location | 868 // Verify the mouse exit was dispatched at the correct location |
869 // (in the correct coordinate space). | 869 // (in the correct coordinate space). |
870 int translated_x = mouse_location.x() - window_origin.x(); | 870 int translated_x = mouse_location.x() - window_origin.x(); |
871 int translated_y = mouse_location.y() - window_origin.y(); | 871 int translated_y = mouse_location.y() - window_origin.y(); |
872 gfx::Point translated_point(translated_x, translated_y); | 872 gfx::Point translated_point(translated_x, translated_y); |
873 EXPECT_EQ(filter->mouse_location(0).ToString(), translated_point.ToString()); | 873 EXPECT_EQ(filter->mouse_location(0).ToString(), translated_point.ToString()); |
874 } | 874 } |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1089 ui::GestureEventDetails details(ui::ET_GESTURE_TAP_DOWN, 0.0f, 0.0f); | 1089 ui::GestureEventDetails details(ui::ET_GESTURE_TAP_DOWN, 0.0f, 0.0f); |
1090 gfx::Point point(10, 10); | 1090 gfx::Point point(10, 10); |
1091 ui::GestureEvent event( | 1091 ui::GestureEvent event( |
1092 ui::ET_GESTURE_TAP_DOWN, | 1092 ui::ET_GESTURE_TAP_DOWN, |
1093 point.x(), | 1093 point.x(), |
1094 point.y(), | 1094 point.y(), |
1095 0, | 1095 0, |
1096 ui::EventTimeForNow(), | 1096 ui::EventTimeForNow(), |
1097 details, | 1097 details, |
1098 0); | 1098 0); |
1099 dispatcher()->RepostEvent(event); | 1099 host()->dispatcher()->RepostEvent(event); |
1100 RunAllPendingInMessageLoop(); | 1100 RunAllPendingInMessageLoop(); |
1101 // TODO(rbyers): Currently disabled - crbug.com/170987 | 1101 // TODO(rbyers): Currently disabled - crbug.com/170987 |
1102 EXPECT_FALSE(EventTypesToString(filter->events()).find("GESTURE_TAP_DOWN") != | 1102 EXPECT_FALSE(EventTypesToString(filter->events()).find("GESTURE_TAP_DOWN") != |
1103 std::string::npos); | 1103 std::string::npos); |
1104 filter->Reset(); | 1104 filter->Reset(); |
1105 } | 1105 } |
1106 | 1106 |
1107 // This class inherits from the EventFilterRecorder class which provides a | 1107 // This class inherits from the EventFilterRecorder class which provides a |
1108 // facility to record events. This class additionally provides a facility to | 1108 // facility to record events. This class additionally provides a facility to |
1109 // repost the ET_GESTURE_TAP_DOWN gesture to the target window and records | 1109 // repost the ET_GESTURE_TAP_DOWN gesture to the target window and records |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1243 // a child, but the child is destroyed because of the synthesized mouse-exit | 1243 // a child, but the child is destroyed because of the synthesized mouse-exit |
1244 // event generated on the previous mouse_moved_handler_. | 1244 // event generated on the previous mouse_moved_handler_. |
1245 TEST_F(WindowEventDispatcherTest, DeleteWindowDuringMouseMovedDispatch) { | 1245 TEST_F(WindowEventDispatcherTest, DeleteWindowDuringMouseMovedDispatch) { |
1246 // Create window 1 and set its event filter. Window 1 will take ownership of | 1246 // Create window 1 and set its event filter. Window 1 will take ownership of |
1247 // the event filter. | 1247 // the event filter. |
1248 scoped_ptr<Window> w1(CreateNormalWindow(1, root_window(), NULL)); | 1248 scoped_ptr<Window> w1(CreateNormalWindow(1, root_window(), NULL)); |
1249 OnMouseExitDeletingEventFilter* w1_filter = | 1249 OnMouseExitDeletingEventFilter* w1_filter = |
1250 new OnMouseExitDeletingEventFilter(); | 1250 new OnMouseExitDeletingEventFilter(); |
1251 w1->SetEventFilter(w1_filter); | 1251 w1->SetEventFilter(w1_filter); |
1252 w1->SetBounds(gfx::Rect(20, 20, 60, 60)); | 1252 w1->SetBounds(gfx::Rect(20, 20, 60, 60)); |
1253 EXPECT_EQ(NULL, dispatcher()->mouse_moved_handler()); | 1253 EXPECT_EQ(NULL, host()->dispatcher()->mouse_moved_handler()); |
1254 | 1254 |
1255 test::EventGenerator generator(root_window(), w1.get()); | 1255 test::EventGenerator generator(root_window(), w1.get()); |
1256 | 1256 |
1257 // Move mouse over window 1 to set it as the |mouse_moved_handler_| for the | 1257 // Move mouse over window 1 to set it as the |mouse_moved_handler_| for the |
1258 // root window. | 1258 // root window. |
1259 generator.MoveMouseTo(51, 51); | 1259 generator.MoveMouseTo(51, 51); |
1260 EXPECT_EQ(w1.get(), dispatcher()->mouse_moved_handler()); | 1260 EXPECT_EQ(w1.get(), host()->dispatcher()->mouse_moved_handler()); |
1261 | 1261 |
1262 // Create window 2 under the mouse cursor and stack it above window 1. | 1262 // Create window 2 under the mouse cursor and stack it above window 1. |
1263 Window* w2 = CreateNormalWindow(2, root_window(), NULL); | 1263 Window* w2 = CreateNormalWindow(2, root_window(), NULL); |
1264 w2->SetBounds(gfx::Rect(30, 30, 40, 40)); | 1264 w2->SetBounds(gfx::Rect(30, 30, 40, 40)); |
1265 root_window()->StackChildAbove(w2, w1.get()); | 1265 root_window()->StackChildAbove(w2, w1.get()); |
1266 | 1266 |
1267 // Set window 2 as the window that is to be deleted when a mouse-exited event | 1267 // Set window 2 as the window that is to be deleted when a mouse-exited event |
1268 // happens on window 1. | 1268 // happens on window 1. |
1269 w1_filter->set_window_to_delete(w2); | 1269 w1_filter->set_window_to_delete(w2); |
1270 | 1270 |
1271 // Move mosue over window 2. This should generate a mouse-exited event for | 1271 // Move mosue over window 2. This should generate a mouse-exited event for |
1272 // window 1 resulting in deletion of window 2. The original mouse-moved event | 1272 // window 1 resulting in deletion of window 2. The original mouse-moved event |
1273 // that was targeted to window 2 should be dropped since window 2 is | 1273 // that was targeted to window 2 should be dropped since window 2 is |
1274 // destroyed. This test passes if no crash happens. | 1274 // destroyed. This test passes if no crash happens. |
1275 generator.MoveMouseTo(52, 52); | 1275 generator.MoveMouseTo(52, 52); |
1276 EXPECT_EQ(NULL, dispatcher()->mouse_moved_handler()); | 1276 EXPECT_EQ(NULL, host()->dispatcher()->mouse_moved_handler()); |
1277 | 1277 |
1278 // Check events received by window 1. | 1278 // Check events received by window 1. |
1279 EXPECT_EQ("MOUSE_ENTERED MOUSE_MOVED MOUSE_EXITED", | 1279 EXPECT_EQ("MOUSE_ENTERED MOUSE_MOVED MOUSE_EXITED", |
1280 EventTypesToString(w1_filter->events())); | 1280 EventTypesToString(w1_filter->events())); |
1281 } | 1281 } |
1282 | 1282 |
1283 namespace { | 1283 namespace { |
1284 | 1284 |
1285 // Used to track if OnWindowDestroying() is invoked and if there is a valid | 1285 // Used to track if OnWindowDestroying() is invoked and if there is a valid |
1286 // RootWindow at such time. | 1286 // RootWindow at such time. |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1619 // (e.g. mouse-move events if the mouse cursor is over the window). | 1619 // (e.g. mouse-move events if the mouse cursor is over the window). |
1620 handler_.Reset(); | 1620 handler_.Reset(); |
1621 | 1621 |
1622 // Start a nested message-loop, post an event to be dispatched, and then | 1622 // Start a nested message-loop, post an event to be dispatched, and then |
1623 // terminate the message-loop. When the message-loop unwinds and gets back, | 1623 // terminate the message-loop. When the message-loop unwinds and gets back, |
1624 // the reposted event should not have fired. | 1624 // the reposted event should not have fired. |
1625 ui::MouseEvent mouse(ui::ET_MOUSE_PRESSED, gfx::Point(10, 10), | 1625 ui::MouseEvent mouse(ui::ET_MOUSE_PRESSED, gfx::Point(10, 10), |
1626 gfx::Point(10, 10), ui::EF_NONE, ui::EF_NONE); | 1626 gfx::Point(10, 10), ui::EF_NONE, ui::EF_NONE); |
1627 message_loop()->PostTask(FROM_HERE, | 1627 message_loop()->PostTask(FROM_HERE, |
1628 base::Bind(&WindowEventDispatcher::RepostEvent, | 1628 base::Bind(&WindowEventDispatcher::RepostEvent, |
1629 base::Unretained(dispatcher()), | 1629 base::Unretained(host()->dispatcher()), |
1630 mouse)); | 1630 mouse)); |
1631 message_loop()->PostTask(FROM_HERE, | 1631 message_loop()->PostTask(FROM_HERE, |
1632 message_loop()->QuitClosure()); | 1632 message_loop()->QuitClosure()); |
1633 | 1633 |
1634 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop()); | 1634 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop()); |
1635 base::RunLoop loop; | 1635 base::RunLoop loop; |
1636 loop.Run(); | 1636 loop.Run(); |
1637 EXPECT_EQ(0, handler_.num_mouse_events()); | 1637 EXPECT_EQ(0, handler_.num_mouse_events()); |
1638 | 1638 |
1639 // Let the current message-loop run. The event-handler will terminate the | 1639 // Let the current message-loop run. The event-handler will terminate the |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1719 } | 1719 } |
1720 | 1720 |
1721 child->RemovePreTargetHandler(&handler_child); | 1721 child->RemovePreTargetHandler(&handler_child); |
1722 root_window()->RemovePreTargetHandler(&handler_root); | 1722 root_window()->RemovePreTargetHandler(&handler_root); |
1723 } | 1723 } |
1724 | 1724 |
1725 TEST_F(WindowEventDispatcherTestInHighDPI, TouchMovesHeldOnScroll) { | 1725 TEST_F(WindowEventDispatcherTestInHighDPI, TouchMovesHeldOnScroll) { |
1726 EventFilterRecorder* filter = new EventFilterRecorder; | 1726 EventFilterRecorder* filter = new EventFilterRecorder; |
1727 root_window()->SetEventFilter(filter); | 1727 root_window()->SetEventFilter(filter); |
1728 test::TestWindowDelegate delegate; | 1728 test::TestWindowDelegate delegate; |
1729 HoldPointerOnScrollHandler handler(dispatcher(), filter); | 1729 HoldPointerOnScrollHandler handler(host()->dispatcher(), filter); |
1730 scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( | 1730 scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( |
1731 &delegate, 1, gfx::Rect(50, 50, 100, 100), root_window())); | 1731 &delegate, 1, gfx::Rect(50, 50, 100, 100), root_window())); |
1732 window->AddPreTargetHandler(&handler); | 1732 window->AddPreTargetHandler(&handler); |
1733 | 1733 |
1734 test::EventGenerator generator(root_window()); | 1734 test::EventGenerator generator(root_window()); |
1735 generator.GestureScrollSequence( | 1735 generator.GestureScrollSequence( |
1736 gfx::Point(120, 120), gfx::Point(20, 120), | 1736 gfx::Point(120, 120), gfx::Point(20, 120), |
1737 base::TimeDelta::FromMilliseconds(100), 25); | 1737 base::TimeDelta::FromMilliseconds(100), 25); |
1738 | 1738 |
1739 // |handler| will have reset |filter| and started holding the touch-move | 1739 // |handler| will have reset |filter| and started holding the touch-move |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1824 // when the focused window does not live in the dispatcher's tree. | 1824 // when the focused window does not live in the dispatcher's tree. |
1825 TEST_F(WindowEventDispatcherTest, HostCancelModeWithFocusedWindowOutside) { | 1825 TEST_F(WindowEventDispatcherTest, HostCancelModeWithFocusedWindowOutside) { |
1826 test::TestWindowDelegate delegate; | 1826 test::TestWindowDelegate delegate; |
1827 scoped_ptr<Window> focused(CreateTestWindowWithDelegate(&delegate, 123, | 1827 scoped_ptr<Window> focused(CreateTestWindowWithDelegate(&delegate, 123, |
1828 gfx::Rect(20, 30, 100, 50), NULL)); | 1828 gfx::Rect(20, 30, 100, 50), NULL)); |
1829 StaticFocusClient focus_client(focused.get()); | 1829 StaticFocusClient focus_client(focused.get()); |
1830 client::SetFocusClient(root_window(), &focus_client); | 1830 client::SetFocusClient(root_window(), &focus_client); |
1831 EXPECT_FALSE(root_window()->Contains(focused.get())); | 1831 EXPECT_FALSE(root_window()->Contains(focused.get())); |
1832 EXPECT_EQ(focused.get(), | 1832 EXPECT_EQ(focused.get(), |
1833 client::GetFocusClient(root_window())->GetFocusedWindow()); | 1833 client::GetFocusClient(root_window())->GetFocusedWindow()); |
1834 dispatcher()->DispatchCancelModeEvent(); | 1834 host()->dispatcher()->DispatchCancelModeEvent(); |
1835 EXPECT_EQ(focused.get(), | 1835 EXPECT_EQ(focused.get(), |
1836 client::GetFocusClient(root_window())->GetFocusedWindow()); | 1836 client::GetFocusClient(root_window())->GetFocusedWindow()); |
1837 } | 1837 } |
1838 | 1838 |
1839 // Dispatches a mouse-move event to |target| when it receives a mouse-move | 1839 // Dispatches a mouse-move event to |target| when it receives a mouse-move |
1840 // event. | 1840 // event. |
1841 class DispatchEventHandler : public ui::EventHandler { | 1841 class DispatchEventHandler : public ui::EventHandler { |
1842 public: | 1842 public: |
1843 explicit DispatchEventHandler(Window* target) | 1843 explicit DispatchEventHandler(Window* target) |
1844 : target_(target), | 1844 : target_(target), |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1924 second->AddPreTargetHandler(&move_window); | 1924 second->AddPreTargetHandler(&move_window); |
1925 | 1925 |
1926 // Some sanity checks: |first| is inside |root_window()|'s tree. | 1926 // Some sanity checks: |first| is inside |root_window()|'s tree. |
1927 EXPECT_EQ(root_window(), first->GetRootWindow()); | 1927 EXPECT_EQ(root_window(), first->GetRootWindow()); |
1928 // The two root windows are different. | 1928 // The two root windows are different. |
1929 EXPECT_NE(root_window(), second_root); | 1929 EXPECT_NE(root_window(), second_root); |
1930 | 1930 |
1931 // Dispatch an event to |first|. | 1931 // Dispatch an event to |first|. |
1932 ui::MouseEvent move(ui::ET_MOUSE_MOVED, first->bounds().CenterPoint(), | 1932 ui::MouseEvent move(ui::ET_MOUSE_MOVED, first->bounds().CenterPoint(), |
1933 first->bounds().CenterPoint(), ui::EF_NONE, ui::EF_NONE); | 1933 first->bounds().CenterPoint(), ui::EF_NONE, ui::EF_NONE); |
1934 ui::EventDispatchDetails details = dispatcher()->OnEventFromSource(&move); | 1934 ui::EventDispatchDetails details = |
| 1935 host()->dispatcher()->OnEventFromSource(&move); |
1935 ASSERT_FALSE(details.dispatcher_destroyed); | 1936 ASSERT_FALSE(details.dispatcher_destroyed); |
1936 EXPECT_TRUE(details.target_destroyed); | 1937 EXPECT_TRUE(details.target_destroyed); |
1937 EXPECT_EQ(first.get(), move.target()); | 1938 EXPECT_EQ(first.get(), move.target()); |
1938 EXPECT_TRUE(dispatch_event.dispatched()); | 1939 EXPECT_TRUE(dispatch_event.dispatched()); |
1939 EXPECT_EQ(second_root, first->GetRootWindow()); | 1940 EXPECT_EQ(second_root, first->GetRootWindow()); |
1940 | 1941 |
1941 first->RemovePreTargetHandler(&dispatch_event); | 1942 first->RemovePreTargetHandler(&dispatch_event); |
1942 second->RemovePreTargetHandler(&move_window); | 1943 second->RemovePreTargetHandler(&move_window); |
1943 } | 1944 } |
1944 | 1945 |
1945 } // namespace aura | 1946 } // namespace aura |
OLD | NEW |