| 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 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 581 return "GESTURE_SHOW_PRESS"; | 581 return "GESTURE_SHOW_PRESS"; |
| 582 | 582 |
| 583 case ui::ET_GESTURE_BEGIN: | 583 case ui::ET_GESTURE_BEGIN: |
| 584 return "GESTURE_BEGIN"; | 584 return "GESTURE_BEGIN"; |
| 585 | 585 |
| 586 case ui::ET_GESTURE_END: | 586 case ui::ET_GESTURE_END: |
| 587 return "GESTURE_END"; | 587 return "GESTURE_END"; |
| 588 | 588 |
| 589 default: | 589 default: |
| 590 // We should explicitly require each event type. | 590 // We should explicitly require each event type. |
| 591 NOTREACHED(); | 591 NOTREACHED() << "Received unexpected event: " << type; |
| 592 break; | 592 break; |
| 593 } | 593 } |
| 594 return ""; | 594 return ""; |
| 595 } | 595 } |
| 596 | 596 |
| 597 std::string EventTypesToString(const EventFilterRecorder::Events& events) { | 597 std::string EventTypesToString(const EventFilterRecorder::Events& events) { |
| 598 std::string result; | 598 std::string result; |
| 599 for (size_t i = 0; i < events.size(); ++i) { | 599 for (size_t i = 0; i < events.size(); ++i) { |
| 600 if (i != 0) | 600 if (i != 0) |
| 601 result += " "; | 601 result += " "; |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 737 ui::ET_TOUCH_PRESSED, touch_location, 0, ui::EventTimeForNow()); | 737 ui::ET_TOUCH_PRESSED, touch_location, 0, ui::EventTimeForNow()); |
| 738 DispatchEventUsingWindowDispatcher(&touch_pressed_event); | 738 DispatchEventUsingWindowDispatcher(&touch_pressed_event); |
| 739 recorder.WaitUntilReceivedEvent(ui::ET_GESTURE_SHOW_PRESS); | 739 recorder.WaitUntilReceivedEvent(ui::ET_GESTURE_SHOW_PRESS); |
| 740 recorder.Reset(); | 740 recorder.Reset(); |
| 741 | 741 |
| 742 host()->dispatcher()->HoldPointerMoves(); | 742 host()->dispatcher()->HoldPointerMoves(); |
| 743 | 743 |
| 744 // Check that we don't immediately dispatch the TOUCH_MOVED event. | 744 // Check that we don't immediately dispatch the TOUCH_MOVED event. |
| 745 ui::TouchEvent touch_moved_event( | 745 ui::TouchEvent touch_moved_event( |
| 746 ui::ET_TOUCH_MOVED, touch_location, 0, ui::EventTimeForNow()); | 746 ui::ET_TOUCH_MOVED, touch_location, 0, ui::EventTimeForNow()); |
| 747 ui::TouchEvent touch_moved_event2 = touch_moved_event; |
| 748 ui::TouchEvent touch_moved_event3 = touch_moved_event; |
| 749 |
| 747 DispatchEventUsingWindowDispatcher(&touch_moved_event); | 750 DispatchEventUsingWindowDispatcher(&touch_moved_event); |
| 748 EXPECT_TRUE(recorder.events().empty()); | 751 EXPECT_TRUE(recorder.events().empty()); |
| 749 | 752 |
| 750 // Check that on ReleasePointerMoves, held events are not dispatched | 753 // Check that on ReleasePointerMoves, held events are not dispatched |
| 751 // immediately, but posted instead. | 754 // immediately, but posted instead. |
| 752 DispatchEventUsingWindowDispatcher(&touch_moved_event); | 755 DispatchEventUsingWindowDispatcher(&touch_moved_event2); |
| 753 host()->dispatcher()->ReleasePointerMoves(); | 756 host()->dispatcher()->ReleasePointerMoves(); |
| 754 EXPECT_TRUE(recorder.events().empty()); | 757 EXPECT_TRUE(recorder.events().empty()); |
| 755 | 758 |
| 756 RunAllPendingInMessageLoop(); | 759 RunAllPendingInMessageLoop(); |
| 757 EXPECT_EQ("TOUCH_MOVED", EventTypesToString(recorder.events())); | 760 EXPECT_EQ("TOUCH_MOVED", EventTypesToString(recorder.events())); |
| 758 recorder.Reset(); | 761 recorder.Reset(); |
| 759 | 762 |
| 760 // If another touch event occurs then the held touch should be dispatched | 763 // If another touch event occurs then the held touch should be dispatched |
| 761 // immediately before it. | 764 // immediately before it. |
| 762 ui::TouchEvent touch_released_event( | 765 ui::TouchEvent touch_released_event( |
| 763 ui::ET_TOUCH_RELEASED, touch_location, 0, ui::EventTimeForNow()); | 766 ui::ET_TOUCH_RELEASED, touch_location, 0, ui::EventTimeForNow()); |
| 764 recorder.Reset(); | 767 recorder.Reset(); |
| 765 host()->dispatcher()->HoldPointerMoves(); | 768 host()->dispatcher()->HoldPointerMoves(); |
| 766 DispatchEventUsingWindowDispatcher(&touch_moved_event); | 769 DispatchEventUsingWindowDispatcher(&touch_moved_event3); |
| 767 DispatchEventUsingWindowDispatcher(&touch_released_event); | 770 DispatchEventUsingWindowDispatcher(&touch_released_event); |
| 768 EXPECT_EQ("TOUCH_MOVED TOUCH_RELEASED GESTURE_TAP GESTURE_END", | 771 EXPECT_EQ("TOUCH_MOVED TOUCH_RELEASED GESTURE_TAP GESTURE_END", |
| 769 EventTypesToString(recorder.events())); | 772 EventTypesToString(recorder.events())); |
| 770 recorder.Reset(); | 773 recorder.Reset(); |
| 771 host()->dispatcher()->ReleasePointerMoves(); | 774 host()->dispatcher()->ReleasePointerMoves(); |
| 772 RunAllPendingInMessageLoop(); | 775 RunAllPendingInMessageLoop(); |
| 773 EXPECT_TRUE(recorder.events().empty()); | 776 EXPECT_TRUE(recorder.events().empty()); |
| 774 } | 777 } |
| 775 | 778 |
| 779 // This event handler requests the dispatcher to start holding pointer-move |
| 780 // events when it receives the first scroll-update gesture. |
| 776 class HoldPointerOnScrollHandler : public ui::test::TestEventHandler { | 781 class HoldPointerOnScrollHandler : public ui::test::TestEventHandler { |
| 777 public: | 782 public: |
| 778 HoldPointerOnScrollHandler(WindowEventDispatcher* dispatcher, | 783 HoldPointerOnScrollHandler(WindowEventDispatcher* dispatcher, |
| 779 EventFilterRecorder* filter) | 784 EventFilterRecorder* filter) |
| 780 : dispatcher_(dispatcher), | 785 : dispatcher_(dispatcher), |
| 781 filter_(filter), | 786 filter_(filter), |
| 782 holding_moves_(false) { | 787 holding_moves_(false) {} |
| 783 } | |
| 784 virtual ~HoldPointerOnScrollHandler() {} | 788 virtual ~HoldPointerOnScrollHandler() {} |
| 785 | 789 |
| 786 private: | 790 private: |
| 791 // ui::test::TestEventHandler: |
| 787 virtual void OnGestureEvent(ui::GestureEvent* gesture) OVERRIDE { | 792 virtual void OnGestureEvent(ui::GestureEvent* gesture) OVERRIDE { |
| 788 if (gesture->type() == ui::ET_GESTURE_SCROLL_UPDATE) { | 793 if (!holding_moves_ && gesture->type() == ui::ET_GESTURE_SCROLL_UPDATE) { |
| 789 CHECK(!holding_moves_); | |
| 790 holding_moves_ = true; | 794 holding_moves_ = true; |
| 791 dispatcher_->HoldPointerMoves(); | 795 dispatcher_->HoldPointerMoves(); |
| 792 filter_->Reset(); | 796 filter_->Reset(); |
| 793 } else if (gesture->type() == ui::ET_GESTURE_SCROLL_END) { | 797 } else if (gesture->type() == ui::ET_GESTURE_SCROLL_END) { |
| 794 dispatcher_->ReleasePointerMoves(); | 798 dispatcher_->ReleasePointerMoves(); |
| 795 holding_moves_ = false; | 799 holding_moves_ = false; |
| 796 } | 800 } |
| 797 } | 801 } |
| 798 | 802 |
| 799 WindowEventDispatcher* dispatcher_; | 803 WindowEventDispatcher* dispatcher_; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 818 generator.GestureScrollSequence( | 822 generator.GestureScrollSequence( |
| 819 gfx::Point(60, 60), gfx::Point(10, 60), | 823 gfx::Point(60, 60), gfx::Point(10, 60), |
| 820 base::TimeDelta::FromMilliseconds(100), 25); | 824 base::TimeDelta::FromMilliseconds(100), 25); |
| 821 | 825 |
| 822 // |handler| will have reset |filter| and started holding the touch-move | 826 // |handler| will have reset |filter| and started holding the touch-move |
| 823 // events when scrolling started. At the end of the scroll (i.e. upon | 827 // events when scrolling started. At the end of the scroll (i.e. upon |
| 824 // touch-release), the held touch-move event will have been dispatched first, | 828 // touch-release), the held touch-move event will have been dispatched first, |
| 825 // along with the subsequent events (i.e. touch-release, scroll-end, and | 829 // along with the subsequent events (i.e. touch-release, scroll-end, and |
| 826 // gesture-end). | 830 // gesture-end). |
| 827 const EventFilterRecorder::Events& events = recorder.events(); | 831 const EventFilterRecorder::Events& events = recorder.events(); |
| 828 EXPECT_EQ("TOUCH_MOVED TOUCH_RELEASED GESTURE_SCROLL_END GESTURE_END", | 832 EXPECT_EQ( |
| 829 EventTypesToString(events)); | 833 "TOUCH_MOVED GESTURE_SCROLL_UPDATE TOUCH_RELEASED " |
| 834 "GESTURE_SCROLL_END GESTURE_END", |
| 835 EventTypesToString(events)); |
| 830 ASSERT_EQ(2u, recorder.touch_locations().size()); | 836 ASSERT_EQ(2u, recorder.touch_locations().size()); |
| 831 EXPECT_EQ(gfx::Point(-40, 10).ToString(), | 837 EXPECT_EQ(gfx::Point(-40, 10).ToString(), |
| 832 recorder.touch_locations()[0].ToString()); | 838 recorder.touch_locations()[0].ToString()); |
| 833 EXPECT_EQ(gfx::Point(-40, 10).ToString(), | 839 EXPECT_EQ(gfx::Point(-40, 10).ToString(), |
| 834 recorder.touch_locations()[1].ToString()); | 840 recorder.touch_locations()[1].ToString()); |
| 835 } | 841 } |
| 836 | 842 |
| 843 // Tests that a 'held' touch-event does contribute to gesture event when it is |
| 844 // dispatched. |
| 845 TEST_F(WindowEventDispatcherTest, HeldTouchMoveContributesToGesture) { |
| 846 EventFilterRecorder recorder; |
| 847 root_window()->AddPreTargetHandler(&recorder); |
| 848 |
| 849 const gfx::Point location(20, 20); |
| 850 ui::TouchEvent press( |
| 851 ui::ET_TOUCH_PRESSED, location, 0, ui::EventTimeForNow()); |
| 852 DispatchEventUsingWindowDispatcher(&press); |
| 853 EXPECT_TRUE(recorder.HasReceivedEvent(ui::ET_TOUCH_PRESSED)); |
| 854 recorder.Reset(); |
| 855 |
| 856 host()->dispatcher()->HoldPointerMoves(); |
| 857 |
| 858 ui::TouchEvent move(ui::ET_TOUCH_MOVED, |
| 859 location + gfx::Vector2d(100, 100), |
| 860 0, |
| 861 ui::EventTimeForNow()); |
| 862 DispatchEventUsingWindowDispatcher(&move); |
| 863 EXPECT_FALSE(recorder.HasReceivedEvent(ui::ET_TOUCH_MOVED)); |
| 864 EXPECT_FALSE(recorder.HasReceivedEvent(ui::ET_GESTURE_SCROLL_BEGIN)); |
| 865 recorder.Reset(); |
| 866 |
| 867 host()->dispatcher()->ReleasePointerMoves(); |
| 868 EXPECT_FALSE(recorder.HasReceivedEvent(ui::ET_TOUCH_MOVED)); |
| 869 RunAllPendingInMessageLoop(); |
| 870 EXPECT_TRUE(recorder.HasReceivedEvent(ui::ET_TOUCH_MOVED)); |
| 871 EXPECT_TRUE(recorder.HasReceivedEvent(ui::ET_GESTURE_SCROLL_BEGIN)); |
| 872 EXPECT_TRUE(recorder.HasReceivedEvent(ui::ET_GESTURE_SCROLL_UPDATE)); |
| 873 |
| 874 root_window()->RemovePreTargetHandler(&recorder); |
| 875 } |
| 876 |
| 837 // Tests that synthetic mouse events are ignored when mouse | 877 // Tests that synthetic mouse events are ignored when mouse |
| 838 // events are disabled. | 878 // events are disabled. |
| 839 TEST_F(WindowEventDispatcherTest, DispatchSyntheticMouseEvents) { | 879 TEST_F(WindowEventDispatcherTest, DispatchSyntheticMouseEvents) { |
| 840 EventFilterRecorder recorder; | 880 EventFilterRecorder recorder; |
| 841 root_window()->AddPreTargetHandler(&recorder); | 881 root_window()->AddPreTargetHandler(&recorder); |
| 842 | 882 |
| 843 test::TestWindowDelegate delegate; | 883 test::TestWindowDelegate delegate; |
| 844 scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( | 884 scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( |
| 845 &delegate, 1234, gfx::Rect(5, 5, 100, 100), root_window())); | 885 &delegate, 1234, gfx::Rect(5, 5, 100, 100), root_window())); |
| 846 window->Show(); | 886 window->Show(); |
| (...skipping 1041 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1888 generator.GestureScrollSequence( | 1928 generator.GestureScrollSequence( |
| 1889 gfx::Point(120, 120), gfx::Point(20, 120), | 1929 gfx::Point(120, 120), gfx::Point(20, 120), |
| 1890 base::TimeDelta::FromMilliseconds(100), 25); | 1930 base::TimeDelta::FromMilliseconds(100), 25); |
| 1891 | 1931 |
| 1892 // |handler| will have reset |filter| and started holding the touch-move | 1932 // |handler| will have reset |filter| and started holding the touch-move |
| 1893 // events when scrolling started. At the end of the scroll (i.e. upon | 1933 // events when scrolling started. At the end of the scroll (i.e. upon |
| 1894 // touch-release), the held touch-move event will have been dispatched first, | 1934 // touch-release), the held touch-move event will have been dispatched first, |
| 1895 // along with the subsequent events (i.e. touch-release, scroll-end, and | 1935 // along with the subsequent events (i.e. touch-release, scroll-end, and |
| 1896 // gesture-end). | 1936 // gesture-end). |
| 1897 const EventFilterRecorder::Events& events = recorder.events(); | 1937 const EventFilterRecorder::Events& events = recorder.events(); |
| 1898 EXPECT_EQ("TOUCH_MOVED TOUCH_RELEASED GESTURE_SCROLL_END GESTURE_END", | 1938 EXPECT_EQ( |
| 1899 EventTypesToString(events)); | 1939 "TOUCH_MOVED GESTURE_SCROLL_UPDATE TOUCH_RELEASED " |
| 1940 "GESTURE_SCROLL_END GESTURE_END", |
| 1941 EventTypesToString(events)); |
| 1900 ASSERT_EQ(2u, recorder.touch_locations().size()); | 1942 ASSERT_EQ(2u, recorder.touch_locations().size()); |
| 1901 EXPECT_EQ(gfx::Point(-40, 10).ToString(), | 1943 EXPECT_EQ(gfx::Point(-40, 10).ToString(), |
| 1902 recorder.touch_locations()[0].ToString()); | 1944 recorder.touch_locations()[0].ToString()); |
| 1903 EXPECT_EQ(gfx::Point(-40, 10).ToString(), | 1945 EXPECT_EQ(gfx::Point(-40, 10).ToString(), |
| 1904 recorder.touch_locations()[1].ToString()); | 1946 recorder.touch_locations()[1].ToString()); |
| 1905 } | 1947 } |
| 1906 | 1948 |
| 1907 class SelfDestructDelegate : public test::TestWindowDelegate { | 1949 class SelfDestructDelegate : public test::TestWindowDelegate { |
| 1908 public: | 1950 public: |
| 1909 SelfDestructDelegate() {} | 1951 SelfDestructDelegate() {} |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2140 delegate.GetMouseMotionCountsAndReset(); | 2182 delegate.GetMouseMotionCountsAndReset(); |
| 2141 | 2183 |
| 2142 // Notify both hosts that the cursor is now hidden. This should send a single | 2184 // Notify both hosts that the cursor is now hidden. This should send a single |
| 2143 // mouse-exit event to |window|. | 2185 // mouse-exit event to |window|. |
| 2144 host()->OnCursorVisibilityChanged(false); | 2186 host()->OnCursorVisibilityChanged(false); |
| 2145 second_host->OnCursorVisibilityChanged(false); | 2187 second_host->OnCursorVisibilityChanged(false); |
| 2146 EXPECT_EQ("0 0 1", delegate.GetMouseMotionCountsAndReset()); | 2188 EXPECT_EQ("0 0 1", delegate.GetMouseMotionCountsAndReset()); |
| 2147 } | 2189 } |
| 2148 | 2190 |
| 2149 } // namespace aura | 2191 } // namespace aura |
| OLD | NEW |