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