OLD | NEW |
1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "platform/UserGestureIndicator.h" | 5 #include "platform/UserGestureIndicator.h" |
6 | 6 |
7 #include "platform/wtf/CurrentTime.h" | 7 #include "platform/wtf/CurrentTime.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 | 9 |
10 namespace blink { | 10 namespace blink { |
(...skipping 16 matching lines...) Expand all Loading... |
27 Status status = kPossiblyExistingGesture) { | 27 Status status = kPossiblyExistingGesture) { |
28 return AdoptRef(new TestUserGestureToken(status)); | 28 return AdoptRef(new TestUserGestureToken(status)); |
29 } | 29 } |
30 | 30 |
31 private: | 31 private: |
32 TestUserGestureToken(Status status) : UserGestureToken(status) {} | 32 TestUserGestureToken(Status status) : UserGestureToken(status) {} |
33 }; | 33 }; |
34 | 34 |
35 // Checks for the initial state of UserGestureIndicator. | 35 // Checks for the initial state of UserGestureIndicator. |
36 TEST(UserGestureIndicatorTest, InitialState) { | 36 TEST(UserGestureIndicatorTest, InitialState) { |
37 EXPECT_FALSE(UserGestureIndicator::UtilizeUserGesture()); | 37 EXPECT_FALSE(UserGestureIndicator::ProcessingUserGesture()); |
38 EXPECT_EQ(nullptr, UserGestureIndicator::CurrentToken()); | 38 EXPECT_EQ(nullptr, UserGestureIndicator::CurrentToken()); |
39 EXPECT_FALSE(UserGestureIndicator::ConsumeUserGesture()); | 39 EXPECT_FALSE(UserGestureIndicator::ConsumeUserGesture()); |
40 } | 40 } |
41 | 41 |
42 TEST(UserGestureIndicatorTest, ConstructedWithNewUserGesture) { | 42 TEST(UserGestureIndicatorTest, ConstructedWithNewUserGesture) { |
43 UserGestureIndicator user_gesture_scope( | 43 UserGestureIndicator user_gesture_scope( |
44 TestUserGestureToken::Create(UserGestureToken::kNewGesture)); | 44 TestUserGestureToken::Create(UserGestureToken::kNewGesture)); |
45 | 45 |
46 EXPECT_TRUE(UserGestureIndicator::UtilizeUserGesture()); | 46 EXPECT_TRUE(UserGestureIndicator::ProcessingUserGesture()); |
47 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); | 47 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); |
48 | 48 |
49 EXPECT_TRUE(UserGestureIndicator::ConsumeUserGesture()); | 49 EXPECT_TRUE(UserGestureIndicator::ConsumeUserGesture()); |
50 } | 50 } |
51 | 51 |
52 TEST(UserGestureIndicatorTest, ConstructedWithUserGesture) { | 52 TEST(UserGestureIndicatorTest, ConstructedWithUserGesture) { |
53 UserGestureIndicator user_gesture_scope(TestUserGestureToken::Create()); | 53 UserGestureIndicator user_gesture_scope(TestUserGestureToken::Create()); |
54 | 54 |
55 EXPECT_TRUE(UserGestureIndicator::UtilizeUserGesture()); | 55 EXPECT_TRUE(UserGestureIndicator::ProcessingUserGesture()); |
56 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); | 56 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); |
57 | 57 |
58 EXPECT_TRUE(UserGestureIndicator::ConsumeUserGesture()); | 58 EXPECT_TRUE(UserGestureIndicator::ConsumeUserGesture()); |
59 } | 59 } |
60 | 60 |
61 TEST(UserGestureIndicatorTest, ConstructedWithNoUserGesture) { | 61 TEST(UserGestureIndicatorTest, ConstructedWithNoUserGesture) { |
62 UserGestureIndicator user_gesture_scope(nullptr); | 62 UserGestureIndicator user_gesture_scope(nullptr); |
63 | 63 |
64 EXPECT_FALSE(UserGestureIndicator::UtilizeUserGesture()); | 64 EXPECT_FALSE(UserGestureIndicator::ProcessingUserGesture()); |
65 EXPECT_EQ(nullptr, UserGestureIndicator::CurrentToken()); | 65 EXPECT_EQ(nullptr, UserGestureIndicator::CurrentToken()); |
66 | 66 |
67 EXPECT_FALSE(UserGestureIndicator::ConsumeUserGesture()); | 67 EXPECT_FALSE(UserGestureIndicator::ConsumeUserGesture()); |
68 } | 68 } |
69 | 69 |
70 // Check that after UserGestureIndicator destruction state will be cleared. | 70 // Check that after UserGestureIndicator destruction state will be cleared. |
71 TEST(UserGestureIndicatorTest, DestructUserGestureIndicator) { | 71 TEST(UserGestureIndicatorTest, DestructUserGestureIndicator) { |
72 { | 72 { |
73 UserGestureIndicator user_gesture_scope(TestUserGestureToken::Create()); | 73 UserGestureIndicator user_gesture_scope(TestUserGestureToken::Create()); |
74 | 74 |
75 EXPECT_TRUE(UserGestureIndicator::UtilizeUserGesture()); | 75 EXPECT_TRUE(UserGestureIndicator::ProcessingUserGesture()); |
76 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); | 76 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); |
77 } | 77 } |
78 | 78 |
79 EXPECT_FALSE(UserGestureIndicator::UtilizeUserGesture()); | 79 EXPECT_FALSE(UserGestureIndicator::ProcessingUserGesture()); |
80 EXPECT_EQ(nullptr, UserGestureIndicator::CurrentToken()); | 80 EXPECT_EQ(nullptr, UserGestureIndicator::CurrentToken()); |
81 EXPECT_FALSE(UserGestureIndicator::ConsumeUserGesture()); | 81 EXPECT_FALSE(UserGestureIndicator::ConsumeUserGesture()); |
82 } | 82 } |
83 | 83 |
84 // Tests creation of scoped UserGestureIndicator objects. | 84 // Tests creation of scoped UserGestureIndicator objects. |
85 TEST(UserGestureIndicatorTest, ScopedNewUserGestureIndicators) { | 85 TEST(UserGestureIndicatorTest, ScopedNewUserGestureIndicators) { |
86 // Root GestureIndicator and GestureToken. | 86 // Root GestureIndicator and GestureToken. |
87 UserGestureIndicator user_gesture_scope( | 87 UserGestureIndicator user_gesture_scope( |
88 TestUserGestureToken::Create(UserGestureToken::kNewGesture)); | 88 TestUserGestureToken::Create(UserGestureToken::kNewGesture)); |
89 | 89 |
90 EXPECT_TRUE(UserGestureIndicator::UtilizeUserGesture()); | 90 EXPECT_TRUE(UserGestureIndicator::ProcessingUserGesture()); |
91 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); | 91 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); |
92 { | 92 { |
93 // Construct inner UserGestureIndicator. | 93 // Construct inner UserGestureIndicator. |
94 // It should share GestureToken with the root indicator. | 94 // It should share GestureToken with the root indicator. |
95 UserGestureIndicator inner_user_gesture( | 95 UserGestureIndicator inner_user_gesture( |
96 TestUserGestureToken::Create(UserGestureToken::kNewGesture)); | 96 TestUserGestureToken::Create(UserGestureToken::kNewGesture)); |
97 | 97 |
98 EXPECT_TRUE(UserGestureIndicator::UtilizeUserGesture()); | 98 EXPECT_TRUE(UserGestureIndicator::ProcessingUserGesture()); |
99 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); | 99 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); |
100 | 100 |
101 // Consume inner gesture. | 101 // Consume inner gesture. |
102 EXPECT_TRUE(UserGestureIndicator::ConsumeUserGesture()); | 102 EXPECT_TRUE(UserGestureIndicator::ConsumeUserGesture()); |
103 } | 103 } |
104 | 104 |
105 EXPECT_TRUE(UserGestureIndicator::UtilizeUserGesture()); | 105 EXPECT_TRUE(UserGestureIndicator::ProcessingUserGesture()); |
106 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); | 106 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); |
107 | 107 |
108 // Consume root gesture. | 108 // Consume root gesture. |
109 EXPECT_TRUE(UserGestureIndicator::ConsumeUserGesture()); | 109 EXPECT_TRUE(UserGestureIndicator::ConsumeUserGesture()); |
110 EXPECT_FALSE(UserGestureIndicator::UtilizeUserGesture()); | 110 EXPECT_FALSE(UserGestureIndicator::ProcessingUserGesture()); |
111 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); | 111 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); |
112 } | 112 } |
113 | 113 |
114 TEST(UserGestureIndicatorTest, MultipleGesturesWithTheSameToken) { | 114 TEST(UserGestureIndicatorTest, MultipleGesturesWithTheSameToken) { |
115 UserGestureIndicator indicator( | 115 UserGestureIndicator indicator( |
116 TestUserGestureToken::Create(UserGestureToken::kNewGesture)); | 116 TestUserGestureToken::Create(UserGestureToken::kNewGesture)); |
117 EXPECT_TRUE(UserGestureIndicator::ProcessingUserGesture()); | 117 EXPECT_TRUE(UserGestureIndicator::ProcessingUserGesture()); |
118 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); | 118 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); |
119 { | 119 { |
120 // Construct an inner indicator that shares the same token. | 120 // Construct an inner indicator that shares the same token. |
121 UserGestureIndicator inner_indicator(UserGestureIndicator::CurrentToken()); | 121 UserGestureIndicator inner_indicator(UserGestureIndicator::CurrentToken()); |
122 EXPECT_TRUE(UserGestureIndicator::ProcessingUserGesture()); | 122 EXPECT_TRUE(UserGestureIndicator::ProcessingUserGesture()); |
123 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); | 123 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); |
124 } | 124 } |
125 // Though the inner indicator was destroyed, the outer is still present (and | 125 // Though the inner indicator was destroyed, the outer is still present (and |
126 // the gesture hasn't been consumed), so it should still be processing a user | 126 // the gesture hasn't been consumed), so it should still be processing a user |
127 // gesture. | 127 // gesture. |
128 EXPECT_TRUE(UserGestureIndicator::ProcessingUserGesture()); | 128 EXPECT_TRUE(UserGestureIndicator::ProcessingUserGesture()); |
129 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); | 129 EXPECT_NE(nullptr, UserGestureIndicator::CurrentToken()); |
130 } | 130 } |
131 | 131 |
132 class UsedCallback : public UserGestureUtilizedCallback { | |
133 public: | |
134 UsedCallback() : used_count_(0) {} | |
135 | |
136 void UserGestureUtilized() override { used_count_++; } | |
137 | |
138 unsigned GetAndResetUsedCount() { | |
139 unsigned cur_count = used_count_; | |
140 used_count_ = 0; | |
141 return cur_count; | |
142 } | |
143 | |
144 private: | |
145 unsigned used_count_; | |
146 }; | |
147 | |
148 // Tests callback invocation. | |
149 TEST(UserGestureIndicatorTest, Callback) { | |
150 UsedCallback cb; | |
151 | |
152 { | |
153 UserGestureIndicator user_gesture_scope(TestUserGestureToken::Create()); | |
154 UserGestureIndicator::CurrentToken()->SetUserGestureUtilizedCallback(&cb); | |
155 EXPECT_EQ(0u, cb.GetAndResetUsedCount()); | |
156 | |
157 // Untracked doesn't invoke the callback | |
158 EXPECT_TRUE(UserGestureIndicator::ProcessingUserGesture()); | |
159 EXPECT_EQ(0u, cb.GetAndResetUsedCount()); | |
160 | |
161 // But processingUserGesture does | |
162 EXPECT_TRUE(UserGestureIndicator::UtilizeUserGesture()); | |
163 EXPECT_EQ(1u, cb.GetAndResetUsedCount()); | |
164 | |
165 // But only the first time | |
166 EXPECT_TRUE(UserGestureIndicator::UtilizeUserGesture()); | |
167 EXPECT_TRUE(UserGestureIndicator::ConsumeUserGesture()); | |
168 EXPECT_EQ(0u, cb.GetAndResetUsedCount()); | |
169 } | |
170 EXPECT_EQ(0u, cb.GetAndResetUsedCount()); | |
171 | |
172 { | |
173 UserGestureIndicator user_gesture_scope(TestUserGestureToken::Create()); | |
174 UserGestureIndicator::CurrentToken()->SetUserGestureUtilizedCallback(&cb); | |
175 | |
176 // Consume also invokes the callback | |
177 EXPECT_TRUE(UserGestureIndicator::ConsumeUserGesture()); | |
178 EXPECT_EQ(1u, cb.GetAndResetUsedCount()); | |
179 | |
180 // But only once | |
181 EXPECT_FALSE(UserGestureIndicator::UtilizeUserGesture()); | |
182 EXPECT_FALSE(UserGestureIndicator::ConsumeUserGesture()); | |
183 EXPECT_EQ(0u, cb.GetAndResetUsedCount()); | |
184 } | |
185 | |
186 { | |
187 std::unique_ptr<UserGestureIndicator> user_gesture_scope( | |
188 new UserGestureIndicator(TestUserGestureToken::Create())); | |
189 RefPtr<UserGestureToken> token = UserGestureIndicator::CurrentToken(); | |
190 token->SetUserGestureUtilizedCallback(&cb); | |
191 user_gesture_scope.reset(); | |
192 | |
193 // The callback should be cleared when the UseGestureIndicator is deleted. | |
194 EXPECT_FALSE(UserGestureIndicator::UtilizeUserGesture()); | |
195 EXPECT_EQ(0u, cb.GetAndResetUsedCount()); | |
196 } | |
197 | |
198 // The callback isn't invoked outside the scope of the UGI | |
199 EXPECT_FALSE(UserGestureIndicator::UtilizeUserGesture()); | |
200 EXPECT_EQ(0u, cb.GetAndResetUsedCount()); | |
201 EXPECT_FALSE(UserGestureIndicator::ConsumeUserGesture()); | |
202 EXPECT_EQ(0u, cb.GetAndResetUsedCount()); | |
203 } | |
204 | |
205 TEST(UserGestureIndicatorTest, Timeouts) { | 132 TEST(UserGestureIndicatorTest, Timeouts) { |
206 TimeFunction previous = SetTimeFunctionsForTesting(MockTimeFunction); | 133 TimeFunction previous = SetTimeFunctionsForTesting(MockTimeFunction); |
207 | 134 |
208 { | 135 { |
209 // Token times out after 1 second. | 136 // Token times out after 1 second. |
210 RefPtr<UserGestureToken> token = TestUserGestureToken::Create(); | 137 RefPtr<UserGestureToken> token = TestUserGestureToken::Create(); |
211 EXPECT_TRUE(token->HasGestures()); | 138 EXPECT_TRUE(token->HasGestures()); |
212 UserGestureIndicator user_gesture_scope(token.Get()); | 139 UserGestureIndicator user_gesture_scope(token.Get()); |
213 EXPECT_TRUE(token->HasGestures()); | 140 EXPECT_TRUE(token->HasGestures()); |
214 AdvanceClock(0.75); | 141 AdvanceClock(0.75); |
(...skipping 12 matching lines...) Expand all Loading... |
227 AdvanceClock(0.75); | 154 AdvanceClock(0.75); |
228 EXPECT_TRUE(token->HasGestures()); | 155 EXPECT_TRUE(token->HasGestures()); |
229 AdvanceClock(0.75); | 156 AdvanceClock(0.75); |
230 EXPECT_FALSE(token->HasGestures()); | 157 EXPECT_FALSE(token->HasGestures()); |
231 } | 158 } |
232 | 159 |
233 SetTimeFunctionsForTesting(previous); | 160 SetTimeFunctionsForTesting(previous); |
234 } | 161 } |
235 | 162 |
236 } // namespace blink | 163 } // namespace blink |
OLD | NEW |