OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/chromeos/touch_exploration_controller.h" | 5 #include "ui/chromeos/touch_exploration_controller.h" |
6 | 6 |
7 #include "base/test/simple_test_tick_clock.h" | 7 #include "base/test/simple_test_tick_clock.h" |
8 #include "base/time/time.h" | 8 #include "base/time/time.h" |
9 #include "ui/aura/client/cursor_client.h" | 9 #include "ui/aura/client/cursor_client.h" |
10 #include "ui/aura/test/aura_test_base.h" | 10 #include "ui/aura/test/aura_test_base.h" |
(...skipping 667 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
678 // This should result in a single touch long press and release | 678 // This should result in a single touch long press and release |
679 // at the location of the tap, not at the location of the double-tap. | 679 // at the location of the tap, not at the location of the double-tap. |
680 // There should be a time delay between the touch press and release. | 680 // There should be a time delay between the touch press and release. |
681 gfx::Point first_tap_location(33, 34); | 681 gfx::Point first_tap_location(33, 34); |
682 generator_->set_current_location(first_tap_location); | 682 generator_->set_current_location(first_tap_location); |
683 generator_->PressTouch(); | 683 generator_->PressTouch(); |
684 generator_->ReleaseTouch(); | 684 generator_->ReleaseTouch(); |
685 gfx::Point second_tap_location(23, 24); | 685 gfx::Point second_tap_location(23, 24); |
686 generator_->set_current_location(second_tap_location); | 686 generator_->set_current_location(second_tap_location); |
687 generator_->PressTouch(); | 687 generator_->PressTouch(); |
688 simulated_clock_->Advance(base::TimeDelta::FromMilliseconds(8000)); | 688 simulated_clock_->Advance(gesture_detector_config_.longpress_timeout); |
689 generator_->ReleaseTouch(); | 689 generator_->ReleaseTouch(); |
690 | 690 |
691 const ScopedVector<ui::LocatedEvent>& captured_events = GetCapturedEvents(); | 691 const ScopedVector<ui::LocatedEvent>& captured_events = GetCapturedEvents(); |
692 ASSERT_EQ(2U, captured_events.size()); | 692 ASSERT_EQ(2U, captured_events.size()); |
693 EXPECT_EQ(ui::ET_TOUCH_PRESSED, captured_events[0]->type()); | 693 EXPECT_EQ(ui::ET_TOUCH_PRESSED, captured_events[0]->type()); |
694 EXPECT_EQ(tap_location, captured_events[0]->location()); | 694 EXPECT_EQ(tap_location, captured_events[0]->location()); |
695 base::TimeDelta pressed_time = captured_events[0]->time_stamp(); | 695 base::TimeDelta pressed_time = captured_events[0]->time_stamp(); |
696 EXPECT_EQ(ui::ET_TOUCH_RELEASED, captured_events[1]->type()); | 696 EXPECT_EQ(ui::ET_TOUCH_RELEASED, captured_events[1]->type()); |
697 EXPECT_EQ(tap_location, captured_events[1]->location()); | 697 EXPECT_EQ(tap_location, captured_events[1]->location()); |
698 base::TimeDelta released_time = captured_events[1]->time_stamp(); | 698 base::TimeDelta released_time = captured_events[1]->time_stamp(); |
699 EXPECT_EQ( | 699 EXPECT_EQ(gesture_detector_config_.longpress_timeout, |
aboxhall
2014/06/13 17:06:48
Nice :)
| |
700 base::TimeDelta::FromMilliseconds(8000), | 700 released_time - pressed_time); |
701 released_time - pressed_time); | 701 } |
702 } | 702 |
703 // Tapping and releasing with a second finger when in touch exploration mode | |
704 // should send a touch press and released to the location of the last | |
705 // successful touch exploration and return to touch explore. | |
706 TEST_F(TouchExplorationTest, SplitTap) { | |
707 SwitchTouchExplorationMode(true); | |
708 gfx::Point tap_location(11, 12); | |
709 | |
710 // Confirm events from other fingers go through as is. | |
711 ui::TouchEvent touch0_press(ui::ET_TOUCH_PRESSED, tap_location, 0, Now()); | |
712 ui::TouchEvent touch1_press( | |
713 ui::ET_TOUCH_PRESSED, gfx::Point(33, 34), 1, Now()); | |
714 ui::TouchEvent touch1_release( | |
715 ui::ET_TOUCH_RELEASED, gfx::Point(33, 34), 1, Now()); | |
716 | |
717 // Tap and hold at one location, and get a mouse move event in touch explore. | |
718 generator_->Dispatch(&touch0_press); | |
719 AdvanceSimulatedTimePastTapDelay(); | |
720 EXPECT_TRUE(IsInTouchToMouseMode()); | |
721 | |
722 std::vector<ui::LocatedEvent*> events = | |
723 GetCapturedEventsOfType(ui::ET_MOUSE_MOVED); | |
724 ASSERT_EQ(1U, events.size()); | |
725 | |
726 EXPECT_EQ(tap_location, events[0]->location()); | |
727 EXPECT_TRUE(events[0]->flags() & ui::EF_IS_SYNTHESIZED); | |
728 EXPECT_TRUE(events[0]->flags() & ui::EF_TOUCH_ACCESSIBILITY); | |
729 ClearCapturedEvents(); | |
730 | |
731 // Now tap and release at a different location. This should result in a | |
732 // single touch and release at the location of the first (held) tap, | |
733 // not at the location of the second tap and release. | |
734 // After the release, there is still a finger in touch explore mode. | |
735 generator_->Dispatch(&touch1_press); | |
736 generator_->Dispatch(&touch1_release); | |
737 EXPECT_FALSE(IsInNoFingersDownState()); | |
738 | |
739 const ScopedVector<ui::LocatedEvent>& captured_events = GetCapturedEvents(); | |
740 ASSERT_EQ(2U, captured_events.size()); | |
741 EXPECT_EQ(ui::ET_TOUCH_PRESSED, captured_events[0]->type()); | |
742 EXPECT_EQ(tap_location, captured_events[0]->location()); | |
743 EXPECT_EQ(ui::ET_TOUCH_RELEASED, captured_events[1]->type()); | |
744 EXPECT_EQ(tap_location, captured_events[1]->location()); | |
745 } | |
746 | |
747 // If split tap is started but the touch explore finger is released first, | |
748 // there should still be a touch press and release sent to the location of | |
749 // the last successful touch exploration. | |
750 // All fingers should be released after the click goes through. | |
751 TEST_F(TouchExplorationTest, SplitTapRelease) { | |
752 SwitchTouchExplorationMode(true); | |
753 | |
754 gfx::Point tap_location(11, 12); | |
755 | |
756 // Confirm events from other fingers go through as is. | |
757 ui::TouchEvent touch0_press(ui::ET_TOUCH_PRESSED, tap_location, 0, Now()); | |
758 ui::TouchEvent touch1_press( | |
759 ui::ET_TOUCH_PRESSED, gfx::Point(33, 34), 1, Now()); | |
760 ui::TouchEvent touch0_release(ui::ET_TOUCH_RELEASED, tap_location, 0, Now()); | |
761 ui::TouchEvent touch1_release( | |
762 ui::ET_TOUCH_RELEASED, gfx::Point(33, 34), 1, Now()); | |
763 | |
764 // Tap and hold at one location, and get a mouse move event in touch explore. | |
765 generator_->Dispatch(&touch0_press); | |
766 AdvanceSimulatedTimePastTapDelay(); | |
767 EXPECT_TRUE(IsInTouchToMouseMode()); | |
768 | |
769 std::vector<ui::LocatedEvent*> events = | |
770 GetCapturedEventsOfType(ui::ET_MOUSE_MOVED); | |
771 ASSERT_EQ(1U, events.size()); | |
772 | |
773 EXPECT_EQ(tap_location, events[0]->location()); | |
774 EXPECT_TRUE(events[0]->flags() & ui::EF_IS_SYNTHESIZED); | |
775 EXPECT_TRUE(events[0]->flags() & ui::EF_TOUCH_ACCESSIBILITY); | |
776 ClearCapturedEvents(); | |
777 | |
778 // Now tap at a different location. Release at the first location, | |
779 // then release at the second. This should result in a | |
780 // single touch and release at the location of the first (held) tap, | |
781 // not at the location of the second tap and release. | |
782 generator_->Dispatch(&touch1_press); | |
783 generator_->Dispatch(&touch0_release); | |
784 generator_->Dispatch(&touch1_release); | |
785 EXPECT_TRUE(IsInNoFingersDownState()); | |
786 | |
787 const ScopedVector<ui::LocatedEvent>& captured_events = GetCapturedEvents(); | |
788 ASSERT_EQ(2U, captured_events.size()); | |
789 EXPECT_EQ(ui::ET_TOUCH_PRESSED, captured_events[0]->type()); | |
790 EXPECT_EQ(tap_location, captured_events[0]->location()); | |
791 EXPECT_EQ(ui::ET_TOUCH_RELEASED, captured_events[1]->type()); | |
792 EXPECT_EQ(tap_location, captured_events[1]->location()); | |
793 } | |
794 | |
795 // When in touch exploration mode, making a long press with a second finger | |
796 // should send a touch press and released to the location of the last | |
797 // successful touch exploration. There should be a delay between the | |
798 // touch and release events (right click). | |
799 TEST_F(TouchExplorationTest, SplitTapLongPress) { | |
800 SwitchTouchExplorationMode(true); | |
801 gfx::Point tap_location(11, 12); | |
802 | |
803 // Confirm events from other fingers go through as is. | |
804 ui::TouchEvent touch0_press(ui::ET_TOUCH_PRESSED, tap_location, 0, Now()); | |
805 ui::TouchEvent touch1_press( | |
806 ui::ET_TOUCH_PRESSED, gfx::Point(33, 34), 1, Now()); | |
807 simulated_clock_->Advance(gesture_detector_config_.longpress_timeout); | |
808 ui::TouchEvent touch1_release( | |
809 ui::ET_TOUCH_RELEASED, gfx::Point(33, 34), 1, Now()); | |
810 | |
811 // Tap and hold at one location, and get a mouse move event in touch explore. | |
812 generator_->Dispatch(&touch0_press); | |
813 AdvanceSimulatedTimePastTapDelay(); | |
814 EXPECT_TRUE(IsInTouchToMouseMode()); | |
815 | |
816 std::vector<ui::LocatedEvent*> events = | |
817 GetCapturedEventsOfType(ui::ET_MOUSE_MOVED); | |
818 ASSERT_EQ(1U, events.size()); | |
819 | |
820 EXPECT_EQ(tap_location, events[0]->location()); | |
821 EXPECT_TRUE(events[0]->flags() & ui::EF_IS_SYNTHESIZED); | |
822 EXPECT_TRUE(events[0]->flags() & ui::EF_TOUCH_ACCESSIBILITY); | |
823 ClearCapturedEvents(); | |
824 | |
825 // Now tap and release at a different location. This should result in a | |
826 // single touch and release at the location of the first (held) tap, | |
827 // not at the location of the second tap and release. | |
828 // After the release, there is still a finger in touch explore mode. | |
829 generator_->Dispatch(&touch1_press); | |
830 generator_->Dispatch(&touch1_release); | |
831 EXPECT_FALSE(IsInNoFingersDownState()); | |
832 | |
833 const ScopedVector<ui::LocatedEvent>& captured_events = GetCapturedEvents(); | |
834 ASSERT_EQ(2U, captured_events.size()); | |
835 EXPECT_EQ(ui::ET_TOUCH_PRESSED, captured_events[0]->type()); | |
836 EXPECT_EQ(tap_location, captured_events[0]->location()); | |
837 base::TimeDelta pressed_time = captured_events[0]->time_stamp(); | |
838 EXPECT_EQ(ui::ET_TOUCH_RELEASED, captured_events[1]->type()); | |
839 EXPECT_EQ(tap_location, captured_events[1]->location()); | |
840 base::TimeDelta released_time = captured_events[1]->time_stamp(); | |
841 EXPECT_EQ(gesture_detector_config_.longpress_timeout, | |
842 released_time - pressed_time); | |
843 } | |
844 | |
845 // If split tap is started but the touch explore finger is released first, | |
846 // there should still be a touch press and release sent to the location of | |
847 // the last successful touch exploration. If the remaining finger is held | |
848 // as a longpress, there should be a delay between the sent touch and release | |
849 // events (right click). | |
850 // All fingers should be released after the click goes through. | |
851 TEST_F(TouchExplorationTest, SplitTapReleaseLongPress) { | |
852 SwitchTouchExplorationMode(true); | |
853 gfx::Point tap_location(11, 12); | |
854 | |
855 // Confirm events from other fingers go through as is. | |
856 ui::TouchEvent touch0_press(ui::ET_TOUCH_PRESSED, tap_location, 0, Now()); | |
857 ui::TouchEvent touch1_press( | |
858 ui::ET_TOUCH_PRESSED, gfx::Point(33, 34), 1, Now()); | |
859 ui::TouchEvent touch0_release(ui::ET_TOUCH_RELEASED, tap_location, 0, Now()); | |
860 simulated_clock_->Advance(gesture_detector_config_.longpress_timeout); | |
861 ui::TouchEvent touch1_release( | |
862 ui::ET_TOUCH_RELEASED, gfx::Point(33, 34), 1, Now()); | |
863 | |
864 // Tap and hold at one location, and get a mouse move event in touch explore. | |
865 generator_->Dispatch(&touch0_press); | |
866 AdvanceSimulatedTimePastTapDelay(); | |
867 EXPECT_TRUE(IsInTouchToMouseMode()); | |
868 | |
869 std::vector<ui::LocatedEvent*> events = | |
870 GetCapturedEventsOfType(ui::ET_MOUSE_MOVED); | |
871 ASSERT_EQ(1U, events.size()); | |
872 | |
873 EXPECT_EQ(tap_location, events[0]->location()); | |
874 EXPECT_TRUE(events[0]->flags() & ui::EF_IS_SYNTHESIZED); | |
875 EXPECT_TRUE(events[0]->flags() & ui::EF_TOUCH_ACCESSIBILITY); | |
876 ClearCapturedEvents(); | |
877 | |
878 // Now tap at a different location. Release at the first location, | |
879 // then release at the second. This should result in a | |
880 // single touch and release at the location of the first (held) tap, | |
881 // not at the location of the second tap and release. | |
882 // After the release, TouchToMouseMode should still be on. | |
883 generator_->Dispatch(&touch1_press); | |
884 generator_->Dispatch(&touch0_release); | |
885 generator_->Dispatch(&touch1_release); | |
886 EXPECT_TRUE(IsInTouchToMouseMode()); | |
887 | |
888 const ScopedVector<ui::LocatedEvent>& captured_events = GetCapturedEvents(); | |
889 ASSERT_EQ(2U, captured_events.size()); | |
890 EXPECT_EQ(ui::ET_TOUCH_PRESSED, captured_events[0]->type()); | |
891 EXPECT_EQ(tap_location, captured_events[0]->location()); | |
892 base::TimeDelta pressed_time = captured_events[0]->time_stamp(); | |
893 EXPECT_EQ(ui::ET_TOUCH_RELEASED, captured_events[1]->type()); | |
894 EXPECT_EQ(tap_location, captured_events[1]->location()); | |
895 base::TimeDelta released_time = captured_events[1]->time_stamp(); | |
896 EXPECT_EQ(gesture_detector_config_.longpress_timeout, | |
897 released_time - pressed_time); | |
898 } | |
899 | |
703 | 900 |
704 } // namespace ui | 901 } // namespace ui |
OLD | NEW |