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

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: format 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 = base::MakeUnique<MockCompositor>();
65 glow = base::MakeUnique<MockGlow>();
66 refresh = base::MakeUnique<MockRefresh>();
67 controller = base::MakeUnique<OverscrollControllerAndroid>(
68 compositor.get(), 560, glow.get(), refresh.get());
69 }
70
71 ui::DidOverscrollParams CreateVerticalOverscrollParams() {
72 ui::DidOverscrollParams params;
73 params.accumulated_overscroll = gfx::Vector2dF(0, 1);
74 params.latest_overscroll_delta = gfx::Vector2dF(0, 1);
75 params.current_fling_velocity = gfx::Vector2dF(0, 1);
76 params.causal_event_viewport_point = gfx::PointF(100, 100);
77 return params;
78 }
79
80 std::unique_ptr<MockCompositor> compositor;
81 std::unique_ptr<MockGlow> glow;
82 std::unique_ptr<MockRefresh> refresh;
83 std::unique_ptr<OverscrollControllerAndroid> controller;
majidvp 2017/07/20 13:26:55 nit: It does not seem to me that you actually need
sunyunjia 2017/07/21 13:52:23 Done.
84 };
85
86 TEST_F(OverscrollControllerAndroidUnitTest, AutoAllowsGlowAndNavigation) {
87 ui::DidOverscrollParams params = CreateVerticalOverscrollParams();
88 params.scroll_boundary_behavior.y = cc::ScrollBoundaryBehavior::
89 ScrollBoundaryBehaviorType::kScrollBoundaryBehaviorTypeAuto;
90
91 EXPECT_CALL(*refresh, OnOverscrolled(true));
92 EXPECT_CALL(*refresh, IsActive()).WillOnce(Return(true));
93 EXPECT_CALL(*refresh, IsAwaitingScrollUpdateAck()).Times(0);
94 EXPECT_CALL(*glow, OnOverscrolled(_, _, _, _, _)).Times(0);
95
96 controller->OnOverscrolled(params);
97 testing::Mock::VerifyAndClearExpectations(refresh.get());
98 }
99
100 TEST_F(OverscrollControllerAndroidUnitTest, ContainPreventsNavigation) {
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.get());
114 testing::Mock::VerifyAndClearExpectations(glow.get());
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.get());
129 testing::Mock::VerifyAndClearExpectations(glow.get());
130 }
131
132 TEST_F(OverscrollControllerAndroidUnitTest, NonePreventsNavigationAndGlow) {
133 ui::DidOverscrollParams params = CreateVerticalOverscrollParams();
134 params.scroll_boundary_behavior.y = cc::ScrollBoundaryBehavior::
135 ScrollBoundaryBehaviorType::kScrollBoundaryBehaviorTypeNone;
136
137 EXPECT_CALL(*refresh, OnOverscrolled(false));
138 EXPECT_CALL(*refresh, IsActive()).WillOnce(Return(false));
139 EXPECT_CALL(*refresh, IsAwaitingScrollUpdateAck()).WillOnce(Return(false));
140 EXPECT_CALL(*glow, OnOverscrolled(_, gfx::Vector2dF(), gfx::Vector2dF(),
141 gfx::Vector2dF(), _));
142
143 controller->OnOverscrolled(params);
144 testing::Mock::VerifyAndClearExpectations(refresh.get());
145 testing::Mock::VerifyAndClearExpectations(glow.get());
146
147 // Test that the "none" set on y-axis would not affect glow on x-axis.
148 params.accumulated_overscroll = gfx::Vector2dF(1, 1);
149 params.latest_overscroll_delta = gfx::Vector2dF(1, 1);
150 params.current_fling_velocity = gfx::Vector2dF(1, 1);
151
152 EXPECT_CALL(*refresh, OnOverscrolled(false));
153 EXPECT_CALL(*refresh, IsActive()).WillOnce(Return(false));
154 EXPECT_CALL(*refresh, IsAwaitingScrollUpdateAck()).WillOnce(Return(false));
155 EXPECT_CALL(*glow,
156 OnOverscrolled(_, gfx::Vector2dF(560, 0), gfx::Vector2dF(560, 0),
157 gfx::Vector2dF(560, 0), _));
158
159 controller->OnOverscrolled(params);
160 testing::Mock::VerifyAndClearExpectations(refresh.get());
161 testing::Mock::VerifyAndClearExpectations(glow.get());
162 }
163
164 } // namespace
165
166 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698