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

Side by Side Diff: android_webview/native/permission/permission_request_handler_unittest.cc

Issue 2863233002: [WebView] Move files from native to browser (Closed)
Patch Set: Created 3 years, 7 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 2014 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 "android_webview/native/permission/permission_request_handler.h"
6
7 #include <utility>
8
9 #include "android_webview/native/permission/aw_permission_request.h"
10 #include "android_webview/native/permission/aw_permission_request_delegate.h"
11 #include "android_webview/native/permission/permission_request_handler_client.h"
12 #include "base/bind.h"
13 #include "base/callback.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15
16 namespace android_webview {
17
18 class TestAwPermissionRequestDelegate : public AwPermissionRequestDelegate {
19 public:
20 TestAwPermissionRequestDelegate(const GURL& origin,
21 int64_t resources,
22 base::Callback<void(bool)> callback)
23 : origin_(origin), resources_(resources), callback_(callback) {}
24
25 // Get the origin which initiated the permission request.
26 const GURL& GetOrigin() override { return origin_; }
27
28 // Get the resources the origin wanted to access.
29 int64_t GetResources() override { return resources_; }
30
31 // Notify the permission request is allowed or not.
32 void NotifyRequestResult(bool allowed) override { callback_.Run(allowed); }
33
34 private:
35 GURL origin_;
36 int64_t resources_;
37 base::Callback<void(bool)> callback_;
38 };
39
40 class TestPermissionRequestHandlerClient :
41 public PermissionRequestHandlerClient {
42 public:
43 struct Permission {
44 Permission()
45 :resources(0) {}
46 Permission(const GURL& origin, int64_t resources)
47 : origin(origin), resources(resources) {}
48 GURL origin;
49 int64_t resources;
50 };
51
52 TestPermissionRequestHandlerClient()
53 : request_(NULL) {}
54
55 void OnPermissionRequest(
56 base::android::ScopedJavaLocalRef<jobject> j_request,
57 AwPermissionRequest* request) override {
58 DCHECK(request);
59 request_ = request;
60 java_request_ = j_request;
61 requested_permission_ =
62 Permission(request->GetOrigin(), request->GetResources());
63 }
64
65 void OnPermissionRequestCanceled(AwPermissionRequest* request) override {
66 canceled_permission_ =
67 Permission(request->GetOrigin(), request->GetResources());
68 }
69
70 AwPermissionRequest* request() {
71 return request_;
72 }
73
74 const Permission& requested_permission() {
75 return requested_permission_;
76 }
77
78 const Permission& canceled_permission() {
79 return canceled_permission_;
80 }
81
82 void Grant() {
83 request_->OnAccept(NULL, NULL, true);
84 request_->DeleteThis();
85 request_ = NULL;
86 }
87
88 void Deny() {
89 request_->OnAccept(NULL, NULL, false);
90 request_->DeleteThis();
91 request_ = NULL;
92 }
93
94 void Reset() {
95 request_ = NULL;
96 requested_permission_ = Permission();
97 canceled_permission_ = Permission();
98 }
99
100 private:
101 base::android::ScopedJavaLocalRef<jobject> java_request_;
102 AwPermissionRequest* request_;
103 Permission requested_permission_;
104 Permission canceled_permission_;
105 };
106
107 class TestPermissionRequestHandler : public PermissionRequestHandler {
108 public:
109 TestPermissionRequestHandler(PermissionRequestHandlerClient* client)
110 : PermissionRequestHandler(client, NULL) {
111 }
112
113 const std::vector<base::WeakPtr<AwPermissionRequest> > requests() {
114 return requests_;
115 }
116
117 void PruneRequests() {
118 return PermissionRequestHandler::PruneRequests();
119 }
120 };
121
122 class PermissionRequestHandlerTest : public testing::Test {
123 public:
124 PermissionRequestHandlerTest()
125 : handler_(&client_),
126 allowed_(false) {}
127
128 void NotifyRequestResult(bool allowed) {
129 allowed_ = allowed;
130 }
131
132 protected:
133 void SetUp() override {
134 testing::Test::SetUp();
135 origin_ = GURL("http://www.google.com");
136 resources_ =
137 AwPermissionRequest::VideoCapture | AwPermissionRequest::AudioCapture;
138 delegate_.reset(
139 new TestAwPermissionRequestDelegate(
140 origin_, resources_, base::Bind(
141 &PermissionRequestHandlerTest::NotifyRequestResult,
142 base::Unretained(this))));
143 }
144
145 const GURL& origin() {
146 return origin_;
147 }
148
149 int64_t resources() { return resources_; }
150
151 std::unique_ptr<AwPermissionRequestDelegate> delegate() {
152 return std::move(delegate_);
153 }
154
155 TestPermissionRequestHandler* handler() {
156 return &handler_;
157 }
158
159 TestPermissionRequestHandlerClient* client() {
160 return &client_;
161 }
162
163 bool allowed() {
164 return allowed_;
165 }
166
167 private:
168 GURL origin_;
169 int64_t resources_;
170 std::unique_ptr<AwPermissionRequestDelegate> delegate_;
171 TestPermissionRequestHandlerClient client_;
172 TestPermissionRequestHandler handler_;
173 bool allowed_;
174 };
175
176 TEST_F(PermissionRequestHandlerTest, TestPermissionGranted) {
177 handler()->SendRequest(delegate());
178 // Verify Handler store the request correctly.
179 ASSERT_EQ(1u, handler()->requests().size());
180 EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin());
181 EXPECT_EQ(resources(), handler()->requests()[0]->GetResources());
182
183 // Verify client's onPermissionRequest was called
184 EXPECT_EQ(origin(), client()->request()->GetOrigin());
185 EXPECT_EQ(resources(), client()->request()->GetResources());
186
187 // Simulate the grant request.
188 client()->Grant();
189 // Verify the request is notified as granted
190 EXPECT_TRUE(allowed());
191 handler()->PruneRequests();
192 // Verify the weak reference in handler was removed.
193 EXPECT_TRUE(handler()->requests().empty());
194 }
195
196 TEST_F(PermissionRequestHandlerTest, TestPermissionDenied) {
197 handler()->SendRequest(delegate());
198 // Verify Handler store the request correctly.
199 ASSERT_EQ(1u, handler()->requests().size());
200 EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin());
201 EXPECT_EQ(resources(), handler()->requests()[0]->GetResources());
202
203 // Verify client's onPermissionRequest was called
204 EXPECT_EQ(origin(), client()->request()->GetOrigin());
205 EXPECT_EQ(resources(), client()->request()->GetResources());
206
207 // Simulate the deny request.
208 client()->Deny();
209 // Verify the request is notified as granted
210 EXPECT_FALSE(allowed());
211 handler()->PruneRequests();
212 // Verify the weak reference in handler was removed.
213 EXPECT_TRUE(handler()->requests().empty());
214 }
215
216 TEST_F(PermissionRequestHandlerTest, TestMultiplePermissionRequest) {
217 GURL origin1 = GURL("http://a.google.com");
218 int64_t resources1 = AwPermissionRequest::Geolocation;
219
220 std::unique_ptr<AwPermissionRequestDelegate> delegate1;
221 delegate1.reset(new TestAwPermissionRequestDelegate(
222 origin1, resources1,
223 base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult,
224 base::Unretained(this))));
225
226 // Send 1st request
227 handler()->SendRequest(delegate());
228 // Verify Handler store the request correctly.
229 ASSERT_EQ(1u, handler()->requests().size());
230 EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin());
231 EXPECT_EQ(resources(), handler()->requests()[0]->GetResources());
232 // Verify client's onPermissionRequest was called
233 EXPECT_EQ(origin(), client()->request()->GetOrigin());
234 EXPECT_EQ(resources(), client()->request()->GetResources());
235
236 // Send 2nd request
237 handler()->SendRequest(std::move(delegate1));
238 // Verify Handler store the request correctly.
239 ASSERT_EQ(2u, handler()->requests().size());
240 EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin());
241 EXPECT_EQ(resources(), handler()->requests()[0]->GetResources());
242 EXPECT_EQ(origin1, handler()->requests()[1]->GetOrigin());
243 EXPECT_EQ(resources1, handler()->requests()[1]->GetResources());
244 // Verify client's onPermissionRequest was called
245 EXPECT_EQ(origin1, client()->request()->GetOrigin());
246 EXPECT_EQ(resources1, client()->request()->GetResources());
247
248 // Send 3rd request which has same origin and resources as first one.
249 delegate1.reset(new TestAwPermissionRequestDelegate(origin(), resources(),
250 base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult,
251 base::Unretained(this))));
252 handler()->SendRequest(std::move(delegate1));
253 // Verify Handler store the request correctly.
254 ASSERT_EQ(3u, handler()->requests().size());
255 EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin());
256 EXPECT_EQ(resources(), handler()->requests()[0]->GetResources());
257 EXPECT_EQ(origin1, handler()->requests()[1]->GetOrigin());
258 EXPECT_EQ(resources1, handler()->requests()[1]->GetResources());
259 EXPECT_EQ(origin(), handler()->requests()[2]->GetOrigin());
260 EXPECT_EQ(resources(), handler()->requests()[2]->GetResources());
261 // Verify client's onPermissionRequest was called
262 EXPECT_EQ(origin(), client()->request()->GetOrigin());
263 EXPECT_EQ(resources(), client()->request()->GetResources());
264
265 // Cancel the request.
266 handler()->CancelRequest(origin(), resources());
267 // Verify client's OnPermissionRequestCancled() was called.
268 EXPECT_EQ(origin(), client()->canceled_permission().origin);
269 EXPECT_EQ(resources(), client()->canceled_permission().resources);
270 // Verify Handler store the request correctly, the 1st and 3rd were removed.
271 handler()->PruneRequests();
272 ASSERT_EQ(1u, handler()->requests().size());
273 EXPECT_EQ(origin1, handler()->requests()[0]->GetOrigin());
274 EXPECT_EQ(resources1, handler()->requests()[0]->GetResources());
275 }
276
277 TEST_F(PermissionRequestHandlerTest, TestPreauthorizePermission) {
278 handler()->PreauthorizePermission(origin(), resources());
279
280 // Permission should granted without asking PermissionRequestHandlerClient.
281 handler()->SendRequest(delegate());
282 EXPECT_TRUE(allowed());
283 EXPECT_EQ(NULL, client()->request());
284
285 // Only ask one preauthorized resource, permission should granted
286 // without asking PermissionRequestHandlerClient.
287 std::unique_ptr<AwPermissionRequestDelegate> delegate;
288 delegate.reset(new TestAwPermissionRequestDelegate(
289 origin(), AwPermissionRequest::AudioCapture,
290 base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult,
291 base::Unretained(this))));
292 client()->Reset();
293 handler()->SendRequest(std::move(delegate));
294 EXPECT_TRUE(allowed());
295 EXPECT_EQ(NULL, client()->request());
296 }
297
298 TEST_F(PermissionRequestHandlerTest, TestOriginNotPreauthorized) {
299 handler()->PreauthorizePermission(origin(), resources());
300
301 // Ask the origin which wasn't preauthorized.
302 GURL origin ("http://a.google.com/a/b");
303 std::unique_ptr<AwPermissionRequestDelegate> delegate;
304 int64_t requested_resources = AwPermissionRequest::AudioCapture;
305 delegate.reset(new TestAwPermissionRequestDelegate(
306 origin, requested_resources,
307 base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult,
308 base::Unretained(this))));
309 handler()->SendRequest(std::move(delegate));
310 EXPECT_EQ(origin, handler()->requests()[0]->GetOrigin());
311 EXPECT_EQ(requested_resources, handler()->requests()[0]->GetResources());
312 client()->Grant();
313 EXPECT_TRUE(allowed());
314 }
315
316 TEST_F(PermissionRequestHandlerTest, TestResourcesNotPreauthorized) {
317 handler()->PreauthorizePermission(origin(), resources());
318
319 // Ask the resources which weren't preauthorized.
320 std::unique_ptr<AwPermissionRequestDelegate> delegate;
321 int64_t requested_resources =
322 AwPermissionRequest::AudioCapture | AwPermissionRequest::Geolocation;
323 delegate.reset(new TestAwPermissionRequestDelegate(
324 origin(), requested_resources,
325 base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult,
326 base::Unretained(this))));
327
328 handler()->SendRequest(std::move(delegate));
329 EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin());
330 EXPECT_EQ(requested_resources, handler()->requests()[0]->GetResources());
331 client()->Deny();
332 EXPECT_FALSE(allowed());
333 }
334
335 TEST_F(PermissionRequestHandlerTest, TestPreauthorizeMultiplePermission) {
336 handler()->PreauthorizePermission(origin(), resources());
337 // Preauthorize another permission.
338 GURL origin ("http://a.google.com/a/b");
339 handler()->PreauthorizePermission(origin, AwPermissionRequest::Geolocation);
340 GURL origin_hostname ("http://a.google.com/");
341 std::unique_ptr<AwPermissionRequestDelegate> delegate;
342 delegate.reset(new TestAwPermissionRequestDelegate(
343 origin_hostname, AwPermissionRequest::Geolocation,
344 base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult,
345 base::Unretained(this))));
346 handler()->SendRequest(std::move(delegate));
347 EXPECT_TRUE(allowed());
348 EXPECT_EQ(NULL, client()->request());
349 }
350
351 } // android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698