Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(705)

Unified Diff: content/browser/android/overscroll_controller_android_unittest.cc

Issue 2884423003: Use scroll-boundary-behavior to control overscroll-refresh/glow on android. (Closed)
Patch Set: rebase Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/android/overscroll_controller_android_unittest.cc
diff --git a/content/browser/android/overscroll_controller_android_unittest.cc b/content/browser/android/overscroll_controller_android_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..201628ce9d4d4133f174942e29dc580ea13eaad2
--- /dev/null
+++ b/content/browser/android/overscroll_controller_android_unittest.cc
@@ -0,0 +1,167 @@
+// Copyright (c) 2017 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/android/overscroll_controller_android.h"
+#include <memory>
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "cc/layers/layer.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/android/overscroll_glow.h"
+#include "ui/android/overscroll_refresh.h"
+#include "ui/android/resources/resource_manager_impl.h"
+#include "ui/android/window_android_compositor.h"
+#include "ui/events/blink/did_overscroll_params.h"
+
+using ui::OverscrollGlow;
+using ui::OverscrollRefresh;
+using ui::WindowAndroidCompositor;
+using cc::CopyOutputRequest;
+using ::testing::_;
+using ::testing::Return;
+
+namespace content {
+
+namespace {
+
+class MockCompositor : public WindowAndroidCompositor {
+ public:
+ MOCK_METHOD1(AttachLayerForReadback, void(scoped_refptr<cc::Layer>));
+ void RequestCopyOfOutputOnRootLayer(
+ std::unique_ptr<cc::CopyOutputRequest> request) override {}
+ MOCK_METHOD0(SetNeedsAnimate, void());
+ MOCK_METHOD0(GetResourceManager, ui::ResourceManagerImpl&());
+ MOCK_METHOD0(GetFrameSinkId, viz::FrameSinkId());
+ MOCK_METHOD1(AddChildFrameSink, void(const viz::FrameSinkId& frame_sink_id));
+ MOCK_METHOD1(RemoveChildFrameSink,
+ void(const viz::FrameSinkId& frame_sink_id));
+};
+
+class MockGlow : public OverscrollGlow {
+ public:
+ MockGlow() : OverscrollGlow(nullptr) {}
+ MOCK_METHOD5(OnOverscrolled,
+ bool(base::TimeTicks,
+ const gfx::Vector2dF&,
+ gfx::Vector2dF,
+ gfx::Vector2dF,
+ const gfx::Vector2dF&));
+};
+
+class MockRefresh : public OverscrollRefresh {
+ public:
+ MockRefresh() : OverscrollRefresh(nullptr) {}
+ MOCK_METHOD1(OnOverscrolled, void(bool));
+ MOCK_CONST_METHOD0(IsActive, bool());
+ MOCK_CONST_METHOD0(IsAwaitingScrollUpdateAck, bool());
+};
+
+class OverscrollControllerAndroidUnitTest : public testing::Test {
+ public:
+ OverscrollControllerAndroidUnitTest()
+ : compositor(),
+ glow(),
+ refresh(),
+ controller(&compositor, 560, &glow, &refresh) {}
+
+ ui::DidOverscrollParams CreateVerticalOverscrollParams() {
+ ui::DidOverscrollParams params;
+ params.accumulated_overscroll = gfx::Vector2dF(0, 1);
+ params.latest_overscroll_delta = gfx::Vector2dF(0, 1);
+ params.current_fling_velocity = gfx::Vector2dF(0, 1);
+ params.causal_event_viewport_point = gfx::PointF(100, 100);
+ return params;
+ }
+
+ MockCompositor compositor;
+ MockGlow glow;
+ MockRefresh refresh;
+ OverscrollControllerAndroid controller;
+};
+
+TEST_F(OverscrollControllerAndroidUnitTest,
+ ScrollBoundaryBehaviorAutoAllowsGlowAndNavigation) {
+ ui::DidOverscrollParams params = CreateVerticalOverscrollParams();
+ params.scroll_boundary_behavior.y = cc::ScrollBoundaryBehavior::
+ ScrollBoundaryBehaviorType::kScrollBoundaryBehaviorTypeAuto;
+
+ EXPECT_CALL(refresh, OnOverscrolled(true));
+ EXPECT_CALL(refresh, IsActive()).WillOnce(Return(true));
+ EXPECT_CALL(refresh, IsAwaitingScrollUpdateAck()).Times(0);
+ EXPECT_CALL(glow, OnOverscrolled(_, _, _, _, _)).Times(0);
+
+ controller.OnOverscrolled(params);
+ testing::Mock::VerifyAndClearExpectations(&refresh);
+}
+
+TEST_F(OverscrollControllerAndroidUnitTest,
+ ScrollBoundaryBehaviorContainPreventsNavigation) {
+ ui::DidOverscrollParams params = CreateVerticalOverscrollParams();
+ params.scroll_boundary_behavior.y = cc::ScrollBoundaryBehavior::
+ ScrollBoundaryBehaviorType::kScrollBoundaryBehaviorTypeContain;
+
+ EXPECT_CALL(refresh, OnOverscrolled(false));
+ EXPECT_CALL(refresh, IsActive()).WillOnce(Return(false));
+ EXPECT_CALL(refresh, IsAwaitingScrollUpdateAck()).WillOnce(Return(false));
+ EXPECT_CALL(glow,
+ OnOverscrolled(_, gfx::Vector2dF(0, 560), gfx::Vector2dF(0, 560),
+ gfx::Vector2dF(0, 560), _));
+
+ controller.OnOverscrolled(params);
+ testing::Mock::VerifyAndClearExpectations(&refresh);
+ testing::Mock::VerifyAndClearExpectations(&glow);
+
+ // Test that the "contain" set on x-axis would not affect navigation.
+ params.scroll_boundary_behavior.y = cc::ScrollBoundaryBehavior::
+ ScrollBoundaryBehaviorType::kScrollBoundaryBehaviorTypeAuto;
+ params.scroll_boundary_behavior.x = cc::ScrollBoundaryBehavior::
+ ScrollBoundaryBehaviorType::kScrollBoundaryBehaviorTypeContain;
+
+ EXPECT_CALL(refresh, OnOverscrolled(true));
+ EXPECT_CALL(refresh, IsActive()).WillOnce(Return(true));
+ EXPECT_CALL(refresh, IsAwaitingScrollUpdateAck()).Times(0);
+ EXPECT_CALL(glow, OnOverscrolled(_, _, _, _, _)).Times(0);
+
+ controller.OnOverscrolled(params);
+ testing::Mock::VerifyAndClearExpectations(&refresh);
+ testing::Mock::VerifyAndClearExpectations(&glow);
+}
+
+TEST_F(OverscrollControllerAndroidUnitTest,
+ ScrollBoundaryBehaviorNonePreventsNavigationAndGlow) {
+ ui::DidOverscrollParams params = CreateVerticalOverscrollParams();
+ params.scroll_boundary_behavior.y = cc::ScrollBoundaryBehavior::
+ ScrollBoundaryBehaviorType::kScrollBoundaryBehaviorTypeNone;
+
+ EXPECT_CALL(refresh, OnOverscrolled(false));
+ EXPECT_CALL(refresh, IsActive()).WillOnce(Return(false));
+ EXPECT_CALL(refresh, IsAwaitingScrollUpdateAck()).WillOnce(Return(false));
+ EXPECT_CALL(glow, OnOverscrolled(_, gfx::Vector2dF(), gfx::Vector2dF(),
+ gfx::Vector2dF(), _));
+
+ controller.OnOverscrolled(params);
+ testing::Mock::VerifyAndClearExpectations(&refresh);
+ testing::Mock::VerifyAndClearExpectations(&glow);
+
+ // Test that the "none" set on y-axis would not affect glow on x-axis.
+ params.accumulated_overscroll = gfx::Vector2dF(1, 1);
+ params.latest_overscroll_delta = gfx::Vector2dF(1, 1);
+ params.current_fling_velocity = gfx::Vector2dF(1, 1);
+
+ EXPECT_CALL(refresh, OnOverscrolled(false));
+ EXPECT_CALL(refresh, IsActive()).WillOnce(Return(false));
+ EXPECT_CALL(refresh, IsAwaitingScrollUpdateAck()).WillOnce(Return(false));
+ EXPECT_CALL(glow,
+ OnOverscrolled(_, gfx::Vector2dF(560, 0), gfx::Vector2dF(560, 0),
+ gfx::Vector2dF(560, 0), _));
+
+ controller.OnOverscrolled(params);
+ testing::Mock::VerifyAndClearExpectations(&refresh);
+ testing::Mock::VerifyAndClearExpectations(&glow);
+}
+
+} // namespace
+
+} // namespace content

Powered by Google App Engine
This is Rietveld 408576698