| OLD | NEW |
| (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 | |
| OLD | NEW |