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

Side by Side 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/android/overscroll_controller_android.h"
6 #include <memory>
7 #include "base/macros.h"
8 #include "base/memory/ptr_util.h"
9 #include "cc/layers/layer.h"
10 #include "testing/gmock/include/gmock/gmock.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 #include "ui/android/overscroll_glow.h"
13 #include "ui/android/overscroll_refresh.h"
14 #include "ui/android/resources/resource_manager_impl.h"
15 #include "ui/android/window_android_compositor.h"
16 #include "ui/events/blink/did_overscroll_params.h"
17
18 using ui::OverscrollGlow;
19 using ui::OverscrollRefresh;
20 using ui::WindowAndroidCompositor;
21 using cc::CopyOutputRequest;
22 using ::testing::_;
23 using ::testing::Return;
24
25 namespace content {
26
27 namespace {
28
29 class MockCompositor : public WindowAndroidCompositor {
30 public:
31 MOCK_METHOD1(AttachLayerForReadback, void(scoped_refptr<cc::Layer>));
32 void RequestCopyOfOutputOnRootLayer(
33 std::unique_ptr<cc::CopyOutputRequest> request) override {}
34 MOCK_METHOD0(SetNeedsAnimate, void());
35 MOCK_METHOD0(GetResourceManager, ui::ResourceManagerImpl&());
36 MOCK_METHOD0(GetFrameSinkId, viz::FrameSinkId());
37 MOCK_METHOD1(AddChildFrameSink, void(const viz::FrameSinkId& frame_sink_id));
38 MOCK_METHOD1(RemoveChildFrameSink,
39 void(const viz::FrameSinkId& frame_sink_id));
40 };
41
42 class MockGlow : public OverscrollGlow {
43 public:
44 MockGlow() : OverscrollGlow(nullptr) {}
45 MOCK_METHOD5(OnOverscrolled,
46 bool(base::TimeTicks,
47 const gfx::Vector2dF&,
48 gfx::Vector2dF,
49 gfx::Vector2dF,
50 const gfx::Vector2dF&));
51 };
52
53 class MockRefresh : public OverscrollRefresh {
54 public:
55 MockRefresh() : OverscrollRefresh(nullptr) {}
56 MOCK_METHOD1(OnOverscrolled, void(bool));
57 MOCK_CONST_METHOD0(IsActive, bool());
58 MOCK_CONST_METHOD0(IsAwaitingScrollUpdateAck, bool());
59 };
60
61 class OverscrollControllerAndroidUnitTest : public testing::Test {
62 public:
63 OverscrollControllerAndroidUnitTest()
64 : compositor(),
65 glow(),
66 refresh(),
67 controller(&compositor, 560, &glow, &refresh) {}
68
69 ui::DidOverscrollParams CreateVerticalOverscrollParams() {
70 ui::DidOverscrollParams params;
71 params.accumulated_overscroll = gfx::Vector2dF(0, 1);
72 params.latest_overscroll_delta = gfx::Vector2dF(0, 1);
73 params.current_fling_velocity = gfx::Vector2dF(0, 1);
74 params.causal_event_viewport_point = gfx::PointF(100, 100);
75 return params;
76 }
77
78 MockCompositor compositor;
79 MockGlow glow;
80 MockRefresh refresh;
81 OverscrollControllerAndroid controller;
82 };
83
84 TEST_F(OverscrollControllerAndroidUnitTest,
85 ScrollBoundaryBehaviorAutoAllowsGlowAndNavigation) {
86 ui::DidOverscrollParams params = CreateVerticalOverscrollParams();
87 params.scroll_boundary_behavior.y = cc::ScrollBoundaryBehavior::
88 ScrollBoundaryBehaviorType::kScrollBoundaryBehaviorTypeAuto;
89
90 EXPECT_CALL(refresh, OnOverscrolled(true));
91 EXPECT_CALL(refresh, IsActive()).WillOnce(Return(true));
92 EXPECT_CALL(refresh, IsAwaitingScrollUpdateAck()).Times(0);
93 EXPECT_CALL(glow, OnOverscrolled(_, _, _, _, _)).Times(0);
94
95 controller.OnOverscrolled(params);
96 testing::Mock::VerifyAndClearExpectations(&refresh);
97 }
98
99 TEST_F(OverscrollControllerAndroidUnitTest,
100 ScrollBoundaryBehaviorContainPreventsNavigation) {
101 ui::DidOverscrollParams params = CreateVerticalOverscrollParams();
102 params.scroll_boundary_behavior.y = cc::ScrollBoundaryBehavior::
103 ScrollBoundaryBehaviorType::kScrollBoundaryBehaviorTypeContain;
104
105 EXPECT_CALL(refresh, OnOverscrolled(false));
106 EXPECT_CALL(refresh, IsActive()).WillOnce(Return(false));
107 EXPECT_CALL(refresh, IsAwaitingScrollUpdateAck()).WillOnce(Return(false));
108 EXPECT_CALL(glow,
109 OnOverscrolled(_, gfx::Vector2dF(0, 560), gfx::Vector2dF(0, 560),
110 gfx::Vector2dF(0, 560), _));
111
112 controller.OnOverscrolled(params);
113 testing::Mock::VerifyAndClearExpectations(&refresh);
114 testing::Mock::VerifyAndClearExpectations(&glow);
115
116 // Test that the "contain" set on x-axis would not affect navigation.
117 params.scroll_boundary_behavior.y = cc::ScrollBoundaryBehavior::
118 ScrollBoundaryBehaviorType::kScrollBoundaryBehaviorTypeAuto;
119 params.scroll_boundary_behavior.x = cc::ScrollBoundaryBehavior::
120 ScrollBoundaryBehaviorType::kScrollBoundaryBehaviorTypeContain;
121
122 EXPECT_CALL(refresh, OnOverscrolled(true));
123 EXPECT_CALL(refresh, IsActive()).WillOnce(Return(true));
124 EXPECT_CALL(refresh, IsAwaitingScrollUpdateAck()).Times(0);
125 EXPECT_CALL(glow, OnOverscrolled(_, _, _, _, _)).Times(0);
126
127 controller.OnOverscrolled(params);
128 testing::Mock::VerifyAndClearExpectations(&refresh);
129 testing::Mock::VerifyAndClearExpectations(&glow);
130 }
131
132 TEST_F(OverscrollControllerAndroidUnitTest,
133 ScrollBoundaryBehaviorNonePreventsNavigationAndGlow) {
134 ui::DidOverscrollParams params = CreateVerticalOverscrollParams();
135 params.scroll_boundary_behavior.y = cc::ScrollBoundaryBehavior::
136 ScrollBoundaryBehaviorType::kScrollBoundaryBehaviorTypeNone;
137
138 EXPECT_CALL(refresh, OnOverscrolled(false));
139 EXPECT_CALL(refresh, IsActive()).WillOnce(Return(false));
140 EXPECT_CALL(refresh, IsAwaitingScrollUpdateAck()).WillOnce(Return(false));
141 EXPECT_CALL(glow, OnOverscrolled(_, gfx::Vector2dF(), gfx::Vector2dF(),
142 gfx::Vector2dF(), _));
143
144 controller.OnOverscrolled(params);
145 testing::Mock::VerifyAndClearExpectations(&refresh);
146 testing::Mock::VerifyAndClearExpectations(&glow);
147
148 // Test that the "none" set on y-axis would not affect glow on x-axis.
149 params.accumulated_overscroll = gfx::Vector2dF(1, 1);
150 params.latest_overscroll_delta = gfx::Vector2dF(1, 1);
151 params.current_fling_velocity = gfx::Vector2dF(1, 1);
152
153 EXPECT_CALL(refresh, OnOverscrolled(false));
154 EXPECT_CALL(refresh, IsActive()).WillOnce(Return(false));
155 EXPECT_CALL(refresh, IsAwaitingScrollUpdateAck()).WillOnce(Return(false));
156 EXPECT_CALL(glow,
157 OnOverscrolled(_, gfx::Vector2dF(560, 0), gfx::Vector2dF(560, 0),
158 gfx::Vector2dF(560, 0), _));
159
160 controller.OnOverscrolled(params);
161 testing::Mock::VerifyAndClearExpectations(&refresh);
162 testing::Mock::VerifyAndClearExpectations(&glow);
163 }
164
165 } // namespace
166
167 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698