| 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 |