| 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 "content/browser/permissions/permission_service_impl.h" | 5 #include "content/browser/permissions/permission_service_impl.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/memory/ptr_util.h" | 13 #include "base/memory/ptr_util.h" |
| 14 #include "content/public/browser/browser_context.h" | 14 #include "content/public/browser/browser_context.h" |
| 15 #include "content/public/browser/permission_manager.h" | 15 #include "content/public/browser/permission_manager.h" |
| 16 #include "content/public/browser/permission_type.h" | 16 #include "content/public/browser/permission_type.h" |
| 17 | 17 |
| 18 using blink::mojom::PermissionDescriptorPtr; | 18 using blink::mojom::PermissionDescriptorPtr; |
| 19 using blink::mojom::PermissionName; | 19 using blink::mojom::PermissionName; |
| 20 using blink::mojom::PermissionObserverPtr; |
| 20 using blink::mojom::PermissionStatus; | 21 using blink::mojom::PermissionStatus; |
| 21 | 22 |
| 22 namespace content { | 23 namespace content { |
| 23 | 24 |
| 24 namespace { | 25 namespace { |
| 25 | 26 |
| 26 PermissionType PermissionDescriptorToPermissionType( | 27 PermissionType PermissionDescriptorToPermissionType( |
| 27 const PermissionDescriptorPtr& descriptor) { | 28 const PermissionDescriptorPtr& descriptor) { |
| 28 switch (descriptor->name) { | 29 switch (descriptor->name) { |
| 29 case PermissionName::GEOLOCATION: | 30 case PermissionName::GEOLOCATION: |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 } | 75 } |
| 75 | 76 |
| 76 PermissionServiceImpl::PendingRequest::~PendingRequest() { | 77 PermissionServiceImpl::PendingRequest::~PendingRequest() { |
| 77 if (callback.is_null()) | 78 if (callback.is_null()) |
| 78 return; | 79 return; |
| 79 | 80 |
| 80 std::vector<PermissionStatus> result(request_count, PermissionStatus::DENIED); | 81 std::vector<PermissionStatus> result(request_count, PermissionStatus::DENIED); |
| 81 callback.Run(result); | 82 callback.Run(result); |
| 82 } | 83 } |
| 83 | 84 |
| 84 PermissionServiceImpl::PendingSubscription::PendingSubscription( | |
| 85 PermissionType permission, | |
| 86 const url::Origin& origin, | |
| 87 const PermissionStatusCallback& callback) | |
| 88 : id(-1), permission(permission), origin(origin), callback(callback) {} | |
| 89 | |
| 90 PermissionServiceImpl::PendingSubscription::~PendingSubscription() { | |
| 91 if (!callback.is_null()) | |
| 92 callback.Run(PermissionStatus::ASK); | |
| 93 } | |
| 94 | |
| 95 PermissionServiceImpl::PermissionServiceImpl( | 85 PermissionServiceImpl::PermissionServiceImpl( |
| 96 PermissionServiceContext* context, | 86 PermissionServiceContext* context, |
| 97 mojo::InterfaceRequest<blink::mojom::PermissionService> request) | 87 mojo::InterfaceRequest<blink::mojom::PermissionService> request) |
| 98 : context_(context), | 88 : context_(context), |
| 99 binding_(this, std::move(request)), | 89 binding_(this, std::move(request)), |
| 100 weak_factory_(this) { | 90 weak_factory_(this) { |
| 101 binding_.set_connection_error_handler( | 91 binding_.set_connection_error_handler( |
| 102 base::Bind(&PermissionServiceImpl::OnConnectionError, | 92 base::Bind(&PermissionServiceImpl::OnConnectionError, |
| 103 base::Unretained(this))); | 93 base::Unretained(this))); |
| 104 } | 94 } |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 if (!permission_manager) | 209 if (!permission_manager) |
| 220 return; | 210 return; |
| 221 | 211 |
| 222 // Cancel pending requests. | 212 // Cancel pending requests. |
| 223 for (RequestsMap::Iterator<PendingRequest> it(&pending_requests_); | 213 for (RequestsMap::Iterator<PendingRequest> it(&pending_requests_); |
| 224 !it.IsAtEnd(); it.Advance()) { | 214 !it.IsAtEnd(); it.Advance()) { |
| 225 permission_manager->CancelPermissionRequest( | 215 permission_manager->CancelPermissionRequest( |
| 226 it.GetCurrentValue()->id); | 216 it.GetCurrentValue()->id); |
| 227 } | 217 } |
| 228 pending_requests_.Clear(); | 218 pending_requests_.Clear(); |
| 229 | |
| 230 // Cancel pending subscriptions. | |
| 231 for (SubscriptionsMap::Iterator<PendingSubscription> | |
| 232 it(&pending_subscriptions_); !it.IsAtEnd(); it.Advance()) { | |
| 233 it.GetCurrentValue()->callback.Run(GetPermissionStatusFromType( | |
| 234 it.GetCurrentValue()->permission, it.GetCurrentValue()->origin)); | |
| 235 it.GetCurrentValue()->callback.Reset(); | |
| 236 permission_manager->UnsubscribePermissionStatusChange( | |
| 237 it.GetCurrentValue()->id); | |
| 238 } | |
| 239 pending_subscriptions_.Clear(); | |
| 240 } | 219 } |
| 241 | 220 |
| 242 void PermissionServiceImpl::HasPermission( | 221 void PermissionServiceImpl::HasPermission( |
| 243 PermissionDescriptorPtr permission, | 222 PermissionDescriptorPtr permission, |
| 244 const url::Origin& origin, | 223 const url::Origin& origin, |
| 245 const PermissionStatusCallback& callback) { | 224 const PermissionStatusCallback& callback) { |
| 246 callback.Run(GetPermissionStatus(permission, origin)); | 225 callback.Run(GetPermissionStatus(permission, origin)); |
| 247 } | 226 } |
| 248 | 227 |
| 249 void PermissionServiceImpl::RevokePermission( | 228 void PermissionServiceImpl::RevokePermission( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 260 if (status != PermissionStatus::GRANTED) { | 239 if (status != PermissionStatus::GRANTED) { |
| 261 callback.Run(status); | 240 callback.Run(status); |
| 262 return; | 241 return; |
| 263 } | 242 } |
| 264 | 243 |
| 265 ResetPermissionStatus(permission_type, origin); | 244 ResetPermissionStatus(permission_type, origin); |
| 266 | 245 |
| 267 callback.Run(GetPermissionStatusFromType(permission_type, origin)); | 246 callback.Run(GetPermissionStatusFromType(permission_type, origin)); |
| 268 } | 247 } |
| 269 | 248 |
| 270 void PermissionServiceImpl::GetNextPermissionChange( | 249 void PermissionServiceImpl::AddPermissionObserver( |
| 271 PermissionDescriptorPtr permission, | 250 PermissionDescriptorPtr permission, |
| 272 const url::Origin& origin, | 251 const url::Origin& origin, |
| 273 PermissionStatus last_known_status, | 252 PermissionStatus last_known_status, |
| 274 const PermissionStatusCallback& callback) { | 253 PermissionObserverPtr observer) { |
| 275 PermissionStatus current_status = GetPermissionStatus(permission, origin); | 254 PermissionStatus current_status = GetPermissionStatus(permission, origin); |
| 276 if (current_status != last_known_status) { | 255 if (current_status != last_known_status) { |
| 277 callback.Run(current_status); | 256 observer->OnPermissionStatusChange(current_status); |
| 278 return; | 257 last_known_status = current_status; |
| 279 } | 258 } |
| 280 | 259 |
| 281 BrowserContext* browser_context = context_->GetBrowserContext(); | 260 BrowserContext* browser_context = context_->GetBrowserContext(); |
| 282 DCHECK(browser_context); | 261 DCHECK(browser_context); |
| 283 if (!browser_context->GetPermissionManager()) { | 262 if (!browser_context->GetPermissionManager()) |
| 284 callback.Run(current_status); | |
| 285 return; | 263 return; |
| 286 } | |
| 287 | 264 |
| 288 PermissionType permission_type = | 265 context_->CreateSubscription(PermissionDescriptorToPermissionType(permission), |
| 289 PermissionDescriptorToPermissionType(permission); | 266 origin, std::move(observer)); |
| 290 | |
| 291 // We need to pass the id of PendingSubscription in pending_subscriptions_ | |
| 292 // to the callback but SubscribePermissionStatusChange() will also return an | |
| 293 // id which is different. | |
| 294 auto subscription = | |
| 295 base::MakeUnique<PendingSubscription>(permission_type, origin, callback); | |
| 296 PendingSubscription* subscription_raw = subscription.get(); | |
| 297 int pending_subscription_id = | |
| 298 pending_subscriptions_.Add(std::move(subscription)); | |
| 299 | |
| 300 GURL requesting_origin(origin.Serialize()); | |
| 301 GURL embedding_origin = context_->GetEmbeddingOrigin(); | |
| 302 subscription_raw->id = | |
| 303 browser_context->GetPermissionManager()->SubscribePermissionStatusChange( | |
| 304 permission_type, requesting_origin, | |
| 305 // If the embedding_origin is empty, we,ll use the |origin| instead. | |
| 306 embedding_origin.is_empty() ? requesting_origin : embedding_origin, | |
| 307 base::Bind(&PermissionServiceImpl::OnPermissionStatusChanged, | |
| 308 weak_factory_.GetWeakPtr(), pending_subscription_id)); | |
| 309 } | 267 } |
| 310 | 268 |
| 311 PermissionStatus PermissionServiceImpl::GetPermissionStatus( | 269 PermissionStatus PermissionServiceImpl::GetPermissionStatus( |
| 312 const PermissionDescriptorPtr& permission, | 270 const PermissionDescriptorPtr& permission, |
| 313 const url::Origin& origin) { | 271 const url::Origin& origin) { |
| 314 return GetPermissionStatusFromType( | 272 return GetPermissionStatusFromType( |
| 315 PermissionDescriptorToPermissionType(permission), origin); | 273 PermissionDescriptorToPermissionType(permission), origin); |
| 316 } | 274 } |
| 317 | 275 |
| 318 PermissionStatus PermissionServiceImpl::GetPermissionStatusFromType( | 276 PermissionStatus PermissionServiceImpl::GetPermissionStatusFromType( |
| (...skipping 20 matching lines...) Expand all Loading... |
| 339 return; | 297 return; |
| 340 | 298 |
| 341 GURL requesting_origin(origin.Serialize()); | 299 GURL requesting_origin(origin.Serialize()); |
| 342 // If the embedding_origin is empty we'll use |origin| instead. | 300 // If the embedding_origin is empty we'll use |origin| instead. |
| 343 GURL embedding_origin = context_->GetEmbeddingOrigin(); | 301 GURL embedding_origin = context_->GetEmbeddingOrigin(); |
| 344 browser_context->GetPermissionManager()->ResetPermission( | 302 browser_context->GetPermissionManager()->ResetPermission( |
| 345 type, requesting_origin, | 303 type, requesting_origin, |
| 346 embedding_origin.is_empty() ? requesting_origin : embedding_origin); | 304 embedding_origin.is_empty() ? requesting_origin : embedding_origin); |
| 347 } | 305 } |
| 348 | 306 |
| 349 void PermissionServiceImpl::OnPermissionStatusChanged( | |
| 350 int pending_subscription_id, | |
| 351 PermissionStatus status) { | |
| 352 PendingSubscription* subscription = | |
| 353 pending_subscriptions_.Lookup(pending_subscription_id); | |
| 354 | |
| 355 BrowserContext* browser_context = context_->GetBrowserContext(); | |
| 356 DCHECK(browser_context); | |
| 357 if (browser_context->GetPermissionManager()) { | |
| 358 browser_context->GetPermissionManager()->UnsubscribePermissionStatusChange( | |
| 359 subscription->id); | |
| 360 } | |
| 361 | |
| 362 PermissionStatusCallback callback = subscription->callback; | |
| 363 | |
| 364 subscription->callback.Reset(); | |
| 365 pending_subscriptions_.Remove(pending_subscription_id); | |
| 366 | |
| 367 callback.Run(status); | |
| 368 } | |
| 369 | |
| 370 } // namespace content | 307 } // namespace content |
| OLD | NEW |