Index: content/browser/renderer_host/input/touch_handle_unittest.cc |
diff --git a/content/browser/renderer_host/input/touch_handle_unittest.cc b/content/browser/renderer_host/input/touch_handle_unittest.cc |
deleted file mode 100644 |
index b43aa1786158d164ec1810dd8d622e86dc3dbc75..0000000000000000000000000000000000000000 |
--- a/content/browser/renderer_host/input/touch_handle_unittest.cc |
+++ /dev/null |
@@ -1,492 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "content/browser/renderer_host/input/touch_handle.h" |
- |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "ui/events/test/motion_event_test_utils.h" |
-#include "ui/gfx/geometry/rect_f.h" |
- |
-using ui::test::MockMotionEvent; |
- |
-namespace content { |
-namespace { |
- |
-const int kDefaultTapTimeoutMs = 200; |
-const float kDefaultTapSlop = 10.f; |
-const float kDefaultDrawableSize = 10.f; |
- |
-struct MockDrawableData { |
- MockDrawableData() |
- : orientation(TOUCH_HANDLE_ORIENTATION_UNDEFINED), |
- alpha(0.f), |
- enabled(false), |
- visible(false), |
- rect(0, 0, kDefaultDrawableSize, kDefaultDrawableSize) {} |
- TouchHandleOrientation orientation; |
- float alpha; |
- bool enabled; |
- bool visible; |
- gfx::RectF rect; |
-}; |
- |
-class MockTouchHandleDrawable : public TouchHandleDrawable { |
- public: |
- explicit MockTouchHandleDrawable(MockDrawableData* data) : data_(data) {} |
- ~MockTouchHandleDrawable() override {} |
- |
- void SetEnabled(bool enabled) override { data_->enabled = enabled; } |
- |
- void SetOrientation(TouchHandleOrientation orientation) override { |
- data_->orientation = orientation; |
- } |
- |
- void SetAlpha(float alpha) override { |
- data_->alpha = alpha; |
- data_->visible = alpha > 0; |
- } |
- |
- void SetFocus(const gfx::PointF& position) override { |
- // Anchor focus to the top left of the rect (regardless of orientation). |
- data_->rect.set_origin(position); |
- } |
- |
- bool IntersectsWith(const gfx::RectF& rect) const override { |
- return data_->rect.Intersects(rect); |
- } |
- |
- private: |
- MockDrawableData* data_; |
-}; |
- |
-} // namespace |
- |
-class TouchHandleTest : public testing::Test, public TouchHandleClient { |
- public: |
- TouchHandleTest() |
- : dragging_(false), |
- dragged_(false), |
- tapped_(false), |
- needs_animate_(false) {} |
- |
- ~TouchHandleTest() override {} |
- |
- // TouchHandleClient implementation. |
- void OnHandleDragBegin(const TouchHandle& handle) override { |
- dragging_ = true; |
- } |
- |
- void OnHandleDragUpdate(const TouchHandle& handle, |
- const gfx::PointF& new_position) override { |
- dragged_ = true; |
- drag_position_ = new_position; |
- } |
- |
- void OnHandleDragEnd(const TouchHandle& handle) override { |
- dragging_ = false; |
- } |
- |
- void OnHandleTapped(const TouchHandle& handle) override { tapped_ = true; } |
- |
- void SetNeedsAnimate() override { needs_animate_ = true; } |
- |
- scoped_ptr<TouchHandleDrawable> CreateDrawable() override { |
- return scoped_ptr<TouchHandleDrawable>( |
- new MockTouchHandleDrawable(&drawable_data_)); |
- } |
- |
- base::TimeDelta GetTapTimeout() const override { |
- return base::TimeDelta::FromMilliseconds(kDefaultTapTimeoutMs); |
- } |
- |
- float GetTapSlop() const override { return kDefaultTapSlop; } |
- |
- void Animate(TouchHandle& handle) { |
- needs_animate_ = false; |
- base::TimeTicks now = base::TimeTicks::Now(); |
- while (handle.Animate(now)) |
- now += base::TimeDelta::FromMilliseconds(16); |
- } |
- |
- bool GetAndResetHandleDragged() { |
- bool dragged = dragged_; |
- dragged_ = false; |
- return dragged; |
- } |
- |
- bool GetAndResetHandleTapped() { |
- bool tapped = tapped_; |
- tapped_ = false; |
- return tapped; |
- } |
- |
- bool GetAndResetNeedsAnimate() { |
- bool needs_animate = needs_animate_; |
- needs_animate_ = false; |
- return needs_animate; |
- } |
- |
- bool IsDragging() const { return dragging_; } |
- const gfx::PointF& DragPosition() const { return drag_position_; } |
- bool NeedsAnimate() const { return needs_animate_; } |
- |
- const MockDrawableData& drawable() { return drawable_data_; } |
- |
- private: |
- gfx::PointF drag_position_; |
- bool dragging_; |
- bool dragged_; |
- bool tapped_; |
- bool needs_animate_; |
- |
- MockDrawableData drawable_data_; |
-}; |
- |
-TEST_F(TouchHandleTest, Visibility) { |
- TouchHandle handle(this, TOUCH_HANDLE_CENTER); |
- EXPECT_FALSE(drawable().visible); |
- |
- handle.SetVisible(true, TouchHandle::ANIMATION_NONE); |
- EXPECT_TRUE(drawable().visible); |
- EXPECT_EQ(1.f, drawable().alpha); |
- |
- handle.SetVisible(false, TouchHandle::ANIMATION_NONE); |
- EXPECT_FALSE(drawable().visible); |
- |
- handle.SetVisible(true, TouchHandle::ANIMATION_NONE); |
- EXPECT_TRUE(drawable().visible); |
- EXPECT_EQ(1.f, drawable().alpha); |
-} |
- |
-TEST_F(TouchHandleTest, VisibilityAnimation) { |
- TouchHandle handle(this, TOUCH_HANDLE_CENTER); |
- ASSERT_FALSE(NeedsAnimate()); |
- ASSERT_FALSE(drawable().visible); |
- ASSERT_EQ(0.f, drawable().alpha); |
- |
- handle.SetVisible(true, TouchHandle::ANIMATION_SMOOTH); |
- EXPECT_TRUE(NeedsAnimate()); |
- EXPECT_FALSE(drawable().visible); |
- EXPECT_EQ(0.f, drawable().alpha); |
- |
- Animate(handle); |
- EXPECT_TRUE(drawable().visible); |
- EXPECT_EQ(1.f, drawable().alpha); |
- |
- ASSERT_FALSE(NeedsAnimate()); |
- handle.SetVisible(false, TouchHandle::ANIMATION_SMOOTH); |
- EXPECT_TRUE(NeedsAnimate()); |
- EXPECT_TRUE(drawable().visible); |
- EXPECT_EQ(1.f, drawable().alpha); |
- |
- Animate(handle); |
- EXPECT_FALSE(drawable().visible); |
- EXPECT_EQ(0.f, drawable().alpha); |
- |
- handle.SetVisible(true, TouchHandle::ANIMATION_NONE); |
- EXPECT_EQ(1.f, drawable().alpha); |
- EXPECT_FALSE(GetAndResetNeedsAnimate()); |
- handle.SetVisible(false, TouchHandle::ANIMATION_SMOOTH); |
- EXPECT_EQ(1.f, drawable().alpha); |
- EXPECT_TRUE(GetAndResetNeedsAnimate()); |
- handle.SetVisible(true, TouchHandle::ANIMATION_SMOOTH); |
- EXPECT_EQ(1.f, drawable().alpha); |
- EXPECT_FALSE(GetAndResetNeedsAnimate()); |
-} |
- |
-TEST_F(TouchHandleTest, Orientation) { |
- TouchHandle handle(this, TOUCH_HANDLE_CENTER); |
- EXPECT_EQ(TOUCH_HANDLE_CENTER, drawable().orientation); |
- |
- handle.SetOrientation(TOUCH_HANDLE_LEFT); |
- EXPECT_EQ(TOUCH_HANDLE_LEFT, drawable().orientation); |
- |
- handle.SetOrientation(TOUCH_HANDLE_RIGHT); |
- EXPECT_EQ(TOUCH_HANDLE_RIGHT, drawable().orientation); |
- |
- handle.SetOrientation(TOUCH_HANDLE_CENTER); |
- EXPECT_EQ(TOUCH_HANDLE_CENTER, drawable().orientation); |
-} |
- |
-TEST_F(TouchHandleTest, Position) { |
- TouchHandle handle(this, TOUCH_HANDLE_CENTER); |
- handle.SetVisible(true, TouchHandle::ANIMATION_NONE); |
- |
- gfx::PointF position; |
- EXPECT_EQ(gfx::PointF(), drawable().rect.origin()); |
- |
- position = gfx::PointF(7.3f, -3.7f); |
- handle.SetPosition(position); |
- EXPECT_EQ(position, drawable().rect.origin()); |
- |
- position = gfx::PointF(-7.3f, 3.7f); |
- handle.SetPosition(position); |
- EXPECT_EQ(position, drawable().rect.origin()); |
-} |
- |
-TEST_F(TouchHandleTest, PositionNotUpdatedWhileFadingOrInvisible) { |
- TouchHandle handle(this, TOUCH_HANDLE_CENTER); |
- |
- handle.SetVisible(true, TouchHandle::ANIMATION_NONE); |
- ASSERT_TRUE(drawable().visible); |
- ASSERT_FALSE(NeedsAnimate()); |
- |
- gfx::PointF old_position(7.3f, -3.7f); |
- handle.SetPosition(old_position); |
- ASSERT_EQ(old_position, drawable().rect.origin()); |
- |
- handle.SetVisible(false, TouchHandle::ANIMATION_SMOOTH); |
- ASSERT_TRUE(NeedsAnimate()); |
- |
- gfx::PointF new_position(3.7f, -3.7f); |
- handle.SetPosition(new_position); |
- EXPECT_EQ(old_position, drawable().rect.origin()); |
- EXPECT_TRUE(NeedsAnimate()); |
- |
- // While the handle is fading, the new position should not take affect. |
- base::TimeTicks now = base::TimeTicks::Now(); |
- while (handle.Animate(now)) { |
- EXPECT_EQ(old_position, drawable().rect.origin()); |
- now += base::TimeDelta::FromMilliseconds(16); |
- } |
- |
- // Even after the animation terminates, the new position will not be pushed. |
- EXPECT_EQ(old_position, drawable().rect.origin()); |
- |
- // As soon as the handle becomes visible, the new position will be pushed. |
- handle.SetVisible(true, TouchHandle::ANIMATION_SMOOTH); |
- EXPECT_EQ(new_position, drawable().rect.origin()); |
-} |
- |
-TEST_F(TouchHandleTest, Enabled) { |
- // A newly created handle defaults to enabled. |
- TouchHandle handle(this, TOUCH_HANDLE_CENTER); |
- EXPECT_TRUE(drawable().enabled); |
- |
- handle.SetVisible(true, TouchHandle::ANIMATION_SMOOTH); |
- EXPECT_TRUE(GetAndResetNeedsAnimate()); |
- EXPECT_EQ(0.f, drawable().alpha); |
- handle.SetEnabled(false); |
- EXPECT_FALSE(drawable().enabled); |
- |
- // Dragging should not be allowed while the handle is disabled. |
- base::TimeTicks event_time = base::TimeTicks::Now(); |
- const float kOffset = kDefaultDrawableSize / 2.f; |
- MockMotionEvent event( |
- MockMotionEvent::ACTION_DOWN, event_time, kOffset, kOffset); |
- EXPECT_FALSE(handle.WillHandleTouchEvent(event)); |
- |
- // Disabling mid-animation should cancel the animation. |
- handle.SetEnabled(true); |
- handle.SetVisible(false, TouchHandle::ANIMATION_SMOOTH); |
- EXPECT_TRUE(drawable().visible); |
- EXPECT_TRUE(GetAndResetNeedsAnimate()); |
- handle.SetEnabled(false); |
- EXPECT_FALSE(drawable().enabled); |
- EXPECT_FALSE(drawable().visible); |
- EXPECT_FALSE(handle.Animate(base::TimeTicks::Now())); |
- |
- // Disabling mid-drag should cancel the drag. |
- handle.SetEnabled(true); |
- handle.SetVisible(true, TouchHandle::ANIMATION_NONE); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_TRUE(IsDragging()); |
- handle.SetEnabled(false); |
- EXPECT_FALSE(IsDragging()); |
- EXPECT_FALSE(handle.WillHandleTouchEvent(event)); |
-} |
- |
-TEST_F(TouchHandleTest, Drag) { |
- TouchHandle handle(this, TOUCH_HANDLE_CENTER); |
- |
- base::TimeTicks event_time = base::TimeTicks::Now(); |
- const float kOffset = kDefaultDrawableSize / 2.f; |
- |
- // The handle must be visible to trigger drag. |
- MockMotionEvent event( |
- MockMotionEvent::ACTION_DOWN, event_time, kOffset, kOffset); |
- EXPECT_FALSE(handle.WillHandleTouchEvent(event)); |
- EXPECT_FALSE(IsDragging()); |
- handle.SetVisible(true, TouchHandle::ANIMATION_NONE); |
- |
- // ACTION_DOWN must fall within the drawable region to trigger drag. |
- event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 50, 50); |
- EXPECT_FALSE(handle.WillHandleTouchEvent(event)); |
- EXPECT_FALSE(IsDragging()); |
- |
- // Only ACTION_DOWN will trigger drag. |
- event = MockMotionEvent( |
- MockMotionEvent::ACTION_MOVE, event_time, kOffset, kOffset); |
- EXPECT_FALSE(handle.WillHandleTouchEvent(event)); |
- EXPECT_FALSE(IsDragging()); |
- |
- // Start the drag. |
- event = MockMotionEvent( |
- MockMotionEvent::ACTION_DOWN, event_time, kOffset, kOffset); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_TRUE(IsDragging()); |
- |
- event = MockMotionEvent( |
- MockMotionEvent::ACTION_MOVE, event_time, kOffset + 10, kOffset + 15); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_TRUE(GetAndResetHandleDragged()); |
- EXPECT_TRUE(IsDragging()); |
- EXPECT_EQ(gfx::PointF(10, 15), DragPosition()); |
- |
- event = MockMotionEvent( |
- MockMotionEvent::ACTION_MOVE, event_time, kOffset - 10, kOffset - 15); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_TRUE(GetAndResetHandleDragged()); |
- EXPECT_TRUE(IsDragging()); |
- EXPECT_EQ(gfx::PointF(-10, -15), DragPosition()); |
- |
- event = MockMotionEvent(MockMotionEvent::ACTION_UP); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_FALSE(GetAndResetHandleDragged()); |
- EXPECT_FALSE(IsDragging()); |
- |
- // Non-ACTION_DOWN events after the drag has terminated should not be handled. |
- event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL); |
- EXPECT_FALSE(handle.WillHandleTouchEvent(event)); |
-} |
- |
-TEST_F(TouchHandleTest, DragDefersOrientationChange) { |
- TouchHandle handle(this, TOUCH_HANDLE_RIGHT); |
- ASSERT_EQ(drawable().orientation, TOUCH_HANDLE_RIGHT); |
- handle.SetVisible(true, TouchHandle::ANIMATION_NONE); |
- |
- MockMotionEvent event(MockMotionEvent::ACTION_DOWN); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_TRUE(IsDragging()); |
- |
- // Orientation changes will be deferred until the drag ends. |
- handle.SetOrientation(TOUCH_HANDLE_LEFT); |
- EXPECT_EQ(TOUCH_HANDLE_RIGHT, drawable().orientation); |
- |
- event = MockMotionEvent(MockMotionEvent::ACTION_MOVE); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_TRUE(GetAndResetHandleDragged()); |
- EXPECT_TRUE(IsDragging()); |
- EXPECT_EQ(TOUCH_HANDLE_RIGHT, drawable().orientation); |
- |
- event = MockMotionEvent(MockMotionEvent::ACTION_UP); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_FALSE(GetAndResetHandleDragged()); |
- EXPECT_FALSE(IsDragging()); |
- EXPECT_EQ(TOUCH_HANDLE_LEFT, drawable().orientation); |
-} |
- |
-TEST_F(TouchHandleTest, DragDefersFade) { |
- TouchHandle handle(this, TOUCH_HANDLE_CENTER); |
- handle.SetVisible(true, TouchHandle::ANIMATION_NONE); |
- |
- MockMotionEvent event(MockMotionEvent::ACTION_DOWN); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_TRUE(IsDragging()); |
- |
- // Fade will be deferred until the drag ends. |
- handle.SetVisible(false, TouchHandle::ANIMATION_SMOOTH); |
- EXPECT_FALSE(NeedsAnimate()); |
- EXPECT_TRUE(drawable().visible); |
- EXPECT_EQ(1.f, drawable().alpha); |
- |
- event = MockMotionEvent(MockMotionEvent::ACTION_MOVE); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_FALSE(NeedsAnimate()); |
- EXPECT_TRUE(drawable().visible); |
- |
- event = MockMotionEvent(MockMotionEvent::ACTION_UP); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_FALSE(IsDragging()); |
- EXPECT_TRUE(NeedsAnimate()); |
- |
- Animate(handle); |
- EXPECT_FALSE(drawable().visible); |
- EXPECT_EQ(0.f, drawable().alpha); |
-} |
- |
-TEST_F(TouchHandleTest, DragTargettingUsesTouchSize) { |
- TouchHandle handle(this, TOUCH_HANDLE_CENTER); |
- handle.SetVisible(true, TouchHandle::ANIMATION_NONE); |
- |
- base::TimeTicks event_time = base::TimeTicks::Now(); |
- const float kTouchSize = 24.f; |
- const float kOffset = kDefaultDrawableSize + kTouchSize / 2.001f; |
- |
- MockMotionEvent event( |
- MockMotionEvent::ACTION_DOWN, event_time, kOffset, kOffset); |
- event.SetTouchMajor(0.f); |
- EXPECT_FALSE(handle.WillHandleTouchEvent(event)); |
- EXPECT_FALSE(IsDragging()); |
- |
- event.SetTouchMajor(kTouchSize / 2.f); |
- EXPECT_FALSE(handle.WillHandleTouchEvent(event)); |
- EXPECT_FALSE(IsDragging()); |
- |
- event.SetTouchMajor(kTouchSize); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_TRUE(IsDragging()); |
- |
- event.SetTouchMajor(kTouchSize * 2.f); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_TRUE(IsDragging()); |
- |
- // Ensure a touch size of 0 can still register a hit. |
- event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, |
- event_time, |
- kDefaultDrawableSize / 2.f, |
- kDefaultDrawableSize / 2.f); |
- event.SetTouchMajor(0); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_TRUE(IsDragging()); |
-} |
- |
-TEST_F(TouchHandleTest, Tap) { |
- TouchHandle handle(this, TOUCH_HANDLE_CENTER); |
- handle.SetVisible(true, TouchHandle::ANIMATION_NONE); |
- |
- base::TimeTicks event_time = base::TimeTicks::Now(); |
- |
- // ACTION_CANCEL shouldn't trigger a tap. |
- MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- event_time += base::TimeDelta::FromMilliseconds(50); |
- event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_FALSE(GetAndResetHandleTapped()); |
- |
- // Long press shouldn't trigger a tap. |
- event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- event_time += 2 * GetTapTimeout(); |
- event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_FALSE(GetAndResetHandleTapped()); |
- |
- // Only a brief tap within the slop region should trigger a tap. |
- event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- event_time += GetTapTimeout() / 2; |
- event = MockMotionEvent( |
- MockMotionEvent::ACTION_MOVE, event_time, kDefaultTapSlop / 2.f, 0); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- event = MockMotionEvent( |
- MockMotionEvent::ACTION_UP, event_time, kDefaultTapSlop / 2.f, 0); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_TRUE(GetAndResetHandleTapped()); |
- |
- // Moving beyond the slop region shouldn't trigger a tap. |
- event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- event_time += GetTapTimeout() / 2; |
- event = MockMotionEvent( |
- MockMotionEvent::ACTION_MOVE, event_time, kDefaultTapSlop * 2.f, 0); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- event = MockMotionEvent( |
- MockMotionEvent::ACTION_UP, event_time, kDefaultTapSlop * 2.f, 0); |
- EXPECT_TRUE(handle.WillHandleTouchEvent(event)); |
- EXPECT_FALSE(GetAndResetHandleTapped()); |
-} |
- |
-} // namespace content |