Index: ui/chromeos/touch_exploration_controller_unittest.cc |
diff --git a/ui/chromeos/touch_exploration_controller_unittest.cc b/ui/chromeos/touch_exploration_controller_unittest.cc |
index ffe4d090b8b3ce8779e8785a3c7ba77a58577ead..149b50531c932797b521815dcf988c6177f0fe18 100644 |
--- a/ui/chromeos/touch_exploration_controller_unittest.cc |
+++ b/ui/chromeos/touch_exploration_controller_unittest.cc |
@@ -81,6 +81,8 @@ class MockTouchExplorationControllerDelegate |
virtual void SetOutputLevel(int volume) OVERRIDE { |
volume_changes_.push_back(volume); |
} |
+ virtual void SilenceSpokenFeedback() OVERRIDE { |
+ } |
const std::vector<float> VolumeChanges() { return volume_changes_; } |
const size_t NumAdjustSounds() { return num_times_adjust_sound_played_; } |
@@ -127,6 +129,11 @@ class TouchExplorationControllerTestApi { |
touch_exploration_controller_->SLIDE_GESTURE; |
} |
+ bool IsInTwoFingerTapStateForTesting() const { |
+ return touch_exploration_controller_->state_ == |
+ touch_exploration_controller_->TWO_FINGER_TAP; |
+ } |
+ |
gfx::Rect BoundsOfRootWindowInDIPForTesting() const { |
return touch_exploration_controller_->root_window_->GetBoundsInScreen(); |
} |
@@ -287,6 +294,10 @@ class TouchExplorationTest : public aura::test::AuraTestBase { |
return touch_exploration_controller_->IsInSlideGestureStateForTesting(); |
} |
+ bool IsInTwoFingerTapState() { |
+ return touch_exploration_controller_->IsInTwoFingerTapStateForTesting(); |
+ } |
+ |
gfx::Rect BoundsOfRootWindowInDIP() { |
return touch_exploration_controller_->BoundsOfRootWindowInDIPForTesting(); |
} |
@@ -1527,4 +1538,127 @@ TEST_F(TouchExplorationTest, InBoundariesTouchExploration) { |
EXPECT_TRUE(IsInTouchToMouseMode()); |
} |
+// If two fingers tap the screen at the same time and release before the tap |
+// timer runs out, a control key event should be sent to silence chromevox. |
+TEST_F(TouchExplorationTest, TwoFingerTap) { |
+ SwitchTouchExplorationMode(true); |
+ |
+ generator_->PressTouchId(1); |
+ EXPECT_FALSE(IsInTwoFingerTapState()); |
+ |
+ generator_->PressTouchId(2); |
+ EXPECT_TRUE(IsInTwoFingerTapState()); |
+ |
+ const ScopedVector<ui::Event>& captured_events = GetCapturedEvents(); |
+ ASSERT_EQ(0U, captured_events.size()); |
+ |
+ generator_->ReleaseTouchId(1); |
+ generator_->ReleaseTouchId(2); |
+ |
+ // Two key events should have been sent to silence the feedback. |
+ EXPECT_EQ(2U, captured_events.size()); |
+} |
+ |
+// If the fingers are not released before the tap timer runs out, a control |
+// keyevent is not sent and the state will no longer be in two finger tap. |
+TEST_F(TouchExplorationTest, TwoFingerTapAndHold) { |
+ SwitchTouchExplorationMode(true); |
+ |
+ generator_->PressTouchId(1); |
+ EXPECT_FALSE(IsInTwoFingerTapState()); |
+ |
+ generator_->PressTouchId(2); |
+ EXPECT_TRUE(IsInTwoFingerTapState()); |
+ |
+ const ScopedVector<ui::Event>& captured_events = GetCapturedEvents(); |
+ ASSERT_EQ(0U, captured_events.size()); |
+ |
+ AdvanceSimulatedTimePastTapDelay(); |
+ // Since the tap delay has elapsed, it should no longer be in two finger tap. |
+ EXPECT_FALSE(IsInTwoFingerTapState()); |
+} |
+ |
+// The next two tests set up two finger swipes to happen. If one of the fingers |
+// moves out of slop before the tap timer fires, a two finger tap is not made. |
+// In this first test, the first finger placed will move out of slop. |
+TEST_F(TouchExplorationTest, TwoFingerTapAndMoveFirstFinger) { |
+ SwitchTouchExplorationMode(true); |
+ |
+ // Once one of the fingers leaves slop, it should no longer be in two finger |
+ // tap. |
+ ui::TouchEvent first_press_id_1( |
+ ui::ET_TOUCH_PRESSED, gfx::Point(100, 200), 1, Now()); |
+ ui::TouchEvent first_press_id_2( |
+ ui::ET_TOUCH_PRESSED, gfx::Point(110, 200), 2, Now()); |
+ |
+ ui::TouchEvent slop_move_id_1( |
+ ui::ET_TOUCH_MOVED, |
+ gfx::Point(100 + gesture_detector_config_.touch_slop, 200), |
+ 1, |
+ Now()); |
+ ui::TouchEvent slop_move_id_2( |
+ ui::ET_TOUCH_MOVED, |
+ gfx::Point(110 + gesture_detector_config_.touch_slop, 200), |
+ 2, |
+ Now()); |
+ |
+ ui::TouchEvent out_slop_id_1( |
+ ui::ET_TOUCH_MOVED, |
+ gfx::Point(100 + gesture_detector_config_.touch_slop + 1, 200), |
+ 1, |
+ Now()); |
+ |
+ // Dispatch the inital presses. |
+ generator_->Dispatch(&first_press_id_1); |
+ EXPECT_FALSE(IsInTwoFingerTapState()); |
+ generator_->Dispatch(&first_press_id_2); |
+ EXPECT_TRUE(IsInTwoFingerTapState()); |
+ |
+ const ScopedVector<ui::Event>& captured_events = GetCapturedEvents(); |
+ ASSERT_EQ(0U, captured_events.size()); |
+ |
+ // The presses have not moved out of slop yet so it should still be in |
+ // TwoFingerTap. |
+ generator_->Dispatch(&slop_move_id_1); |
+ EXPECT_TRUE(IsInTwoFingerTapState()); |
+ generator_->Dispatch(&slop_move_id_2); |
+ EXPECT_TRUE(IsInTwoFingerTapState()); |
+ |
+ // Once one of the fingers moves out of slop, we are no longer in |
+ // TwoFingerTap. |
+ generator_->Dispatch(&out_slop_id_1); |
+ EXPECT_FALSE(IsInTwoFingerTapState()); |
+} |
+ |
+// Similar test to the previous test except the second finger placed will be the |
+// one to move out of slop. |
+TEST_F(TouchExplorationTest, TwoFingerTapAndMoveSecondFinger) { |
+ SwitchTouchExplorationMode(true); |
+ |
+ // Once one of the fingers leaves slop, it should no longer be in two finger |
+ // tap. |
+ ui::TouchEvent first_press_id_1( |
+ ui::ET_TOUCH_PRESSED, gfx::Point(100, 200), 1, Now()); |
+ ui::TouchEvent first_press_id_2( |
+ ui::ET_TOUCH_PRESSED, gfx::Point(110, 200), 2, Now()); |
+ |
+ ui::TouchEvent out_slop_id_2( |
+ ui::ET_TOUCH_MOVED, |
+ gfx::Point(100 + gesture_detector_config_.touch_slop + 1, 200), |
+ 1, |
+ Now()); |
+ |
+ generator_->Dispatch(&first_press_id_1); |
+ EXPECT_FALSE(IsInTwoFingerTapState()); |
+ |
+ generator_->Dispatch(&first_press_id_2); |
+ EXPECT_TRUE(IsInTwoFingerTapState()); |
+ |
+ const ScopedVector<ui::Event>& captured_events = GetCapturedEvents(); |
+ ASSERT_EQ(0U, captured_events.size()); |
+ |
+ generator_->Dispatch(&out_slop_id_2); |
+ EXPECT_FALSE(IsInTwoFingerTapState()); |
+} |
+ |
} // namespace ui |