OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "chrome/browser/permissions/permission_manager.h" | 5 #include "chrome/browser/permissions/permission_manager.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> |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 ContentSetting GetContentSettingForConstantPermission(PermissionType type) { | 149 ContentSetting GetContentSettingForConstantPermission(PermissionType type) { |
150 DCHECK(IsConstantPermission(type)); | 150 DCHECK(IsConstantPermission(type)); |
151 switch (type) { | 151 switch (type) { |
152 case PermissionType::MIDI: | 152 case PermissionType::MIDI: |
153 return CONTENT_SETTING_ALLOW; | 153 return CONTENT_SETTING_ALLOW; |
154 default: | 154 default: |
155 return CONTENT_SETTING_DEFAULT; | 155 return CONTENT_SETTING_DEFAULT; |
156 } | 156 } |
157 } | 157 } |
158 | 158 |
159 PermissionStatus GetPermissionStatusForConstantPermission(PermissionType type) { | |
160 return ContentSettingToPermissionStatus( | |
161 GetContentSettingForConstantPermission(type)); | |
162 } | |
163 | |
164 } // anonymous namespace | 159 } // anonymous namespace |
165 | 160 |
166 class PermissionManager::PendingRequest { | 161 class PermissionManager::PendingRequest { |
167 public: | 162 public: |
168 PendingRequest(content::RenderFrameHost* render_frame_host, | 163 PendingRequest(content::RenderFrameHost* render_frame_host, |
169 const std::vector<PermissionType> permissions, | 164 const std::vector<PermissionType> permissions, |
170 const base::Callback< | 165 const base::Callback< |
171 void(const std::vector<PermissionStatus>&)>& callback) | 166 void(const std::vector<PermissionStatus>&)>& callback) |
172 : render_process_id_(render_frame_host->GetProcess()->GetID()), | 167 : render_process_id_(render_frame_host->GetProcess()->GetID()), |
173 render_frame_id_(render_frame_host->GetRoutingID()), | 168 render_frame_id_(render_frame_host->GetRoutingID()), |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 | 382 |
388 context->ResetPermission(requesting_origin.GetOrigin(), | 383 context->ResetPermission(requesting_origin.GetOrigin(), |
389 embedding_origin.GetOrigin()); | 384 embedding_origin.GetOrigin()); |
390 } | 385 } |
391 | 386 |
392 PermissionStatus PermissionManager::GetPermissionStatus( | 387 PermissionStatus PermissionManager::GetPermissionStatus( |
393 PermissionType permission, | 388 PermissionType permission, |
394 const GURL& requesting_origin, | 389 const GURL& requesting_origin, |
395 const GURL& embedding_origin) { | 390 const GURL& embedding_origin) { |
396 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 391 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
397 if (IsConstantPermission(permission)) | 392 return ContentSettingToPermissionStatus(GetPermissionStatusInternal( |
398 return GetPermissionStatusForConstantPermission(permission); | 393 permission, requesting_origin, embedding_origin)); |
399 | |
400 PermissionContextBase* context = GetPermissionContext(permission); | |
401 if (!context) | |
402 return PermissionStatus::DENIED; | |
403 | |
404 return ContentSettingToPermissionStatus(context->GetPermissionStatus( | |
405 requesting_origin.GetOrigin(), embedding_origin.GetOrigin())); | |
406 } | 394 } |
407 | 395 |
408 void PermissionManager::RegisterPermissionUsage(PermissionType permission, | 396 void PermissionManager::RegisterPermissionUsage(PermissionType permission, |
409 const GURL& requesting_origin, | 397 const GURL& requesting_origin, |
410 const GURL& embedding_origin) { | 398 const GURL& embedding_origin) { |
411 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 399 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
412 // This is required because constant permissions don't have a | 400 // This is required because constant permissions don't have a |
413 // ContentSettingsType. | 401 // ContentSettingsType. |
414 if (IsConstantPermission(permission)) | 402 if (IsConstantPermission(permission)) |
415 return; | 403 return; |
(...skipping 12 matching lines...) Expand all Loading... |
428 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 416 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
429 if (subscriptions_.IsEmpty()) | 417 if (subscriptions_.IsEmpty()) |
430 HostContentSettingsMapFactory::GetForProfile(profile_)->AddObserver(this); | 418 HostContentSettingsMapFactory::GetForProfile(profile_)->AddObserver(this); |
431 | 419 |
432 auto subscription = base::MakeUnique<Subscription>(); | 420 auto subscription = base::MakeUnique<Subscription>(); |
433 subscription->permission = permission; | 421 subscription->permission = permission; |
434 subscription->requesting_origin = requesting_origin; | 422 subscription->requesting_origin = requesting_origin; |
435 subscription->embedding_origin = embedding_origin; | 423 subscription->embedding_origin = embedding_origin; |
436 subscription->callback = callback; | 424 subscription->callback = callback; |
437 | 425 |
438 if (IsConstantPermission(permission)) { | 426 subscription->current_value = GetPermissionStatusInternal( |
439 subscription->current_value = GetContentSettingForConstantPermission( | 427 permission, requesting_origin, embedding_origin); |
440 permission); | |
441 } else { | |
442 subscription->current_value = | |
443 GetPermissionContext(permission) | |
444 ->GetPermissionStatus(subscription->requesting_origin, | |
445 subscription->embedding_origin); | |
446 } | |
447 | 428 |
448 return subscriptions_.Add(std::move(subscription)); | 429 return subscriptions_.Add(std::move(subscription)); |
449 } | 430 } |
450 | 431 |
451 void PermissionManager::UnsubscribePermissionStatusChange(int subscription_id) { | 432 void PermissionManager::UnsubscribePermissionStatusChange(int subscription_id) { |
452 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 433 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
453 // Whether |subscription_id| is known will be checked by the Remove() call. | 434 // Whether |subscription_id| is known will be checked by the Remove() call. |
454 subscriptions_.Remove(subscription_id); | 435 subscriptions_.Remove(subscription_id); |
455 | 436 |
456 if (subscriptions_.IsEmpty()) | 437 if (subscriptions_.IsEmpty()) |
457 HostContentSettingsMapFactory::GetForProfile(profile_) | 438 HostContentSettingsMapFactory::GetForProfile(profile_) |
458 ->RemoveObserver(this); | 439 ->RemoveObserver(this); |
459 } | 440 } |
460 | 441 |
| 442 bool PermissionManager::IsPermissionKillSwitchOn( |
| 443 content::PermissionType permission) { |
| 444 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 445 return GetPermissionContext(permission)->IsPermissionKillSwitchOn(); |
| 446 } |
| 447 |
461 void PermissionManager::OnContentSettingChanged( | 448 void PermissionManager::OnContentSettingChanged( |
462 const ContentSettingsPattern& primary_pattern, | 449 const ContentSettingsPattern& primary_pattern, |
463 const ContentSettingsPattern& secondary_pattern, | 450 const ContentSettingsPattern& secondary_pattern, |
464 ContentSettingsType content_type, | 451 ContentSettingsType content_type, |
465 std::string resource_identifier) { | 452 std::string resource_identifier) { |
466 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 453 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
467 std::list<base::Closure> callbacks; | 454 std::list<base::Closure> callbacks; |
468 | 455 |
469 for (SubscriptionsMap::iterator iter(&subscriptions_); | 456 for (SubscriptionsMap::iterator iter(&subscriptions_); |
470 !iter.IsAtEnd(); iter.Advance()) { | 457 !iter.IsAtEnd(); iter.Advance()) { |
471 Subscription* subscription = iter.GetCurrentValue(); | 458 Subscription* subscription = iter.GetCurrentValue(); |
472 if (IsConstantPermission(subscription->permission)) | 459 if (IsConstantPermission(subscription->permission)) |
473 continue; | 460 continue; |
474 if (PermissionTypeToContentSetting(subscription->permission) != | 461 if (PermissionTypeToContentSetting(subscription->permission) != |
475 content_type) { | 462 content_type) { |
476 continue; | 463 continue; |
477 } | 464 } |
478 | 465 |
479 if (primary_pattern.IsValid() && | 466 if (primary_pattern.IsValid() && |
480 !primary_pattern.Matches(subscription->requesting_origin)) | 467 !primary_pattern.Matches(subscription->requesting_origin)) |
481 continue; | 468 continue; |
482 if (secondary_pattern.IsValid() && | 469 if (secondary_pattern.IsValid() && |
483 !secondary_pattern.Matches(subscription->embedding_origin)) | 470 !secondary_pattern.Matches(subscription->embedding_origin)) |
484 continue; | 471 continue; |
485 | 472 |
486 ContentSetting new_value = | 473 ContentSetting new_value = GetPermissionStatusInternal( |
487 GetPermissionContext(subscription->permission) | 474 subscription->permission, subscription->requesting_origin, |
488 ->GetPermissionStatus(subscription->requesting_origin, | 475 subscription->embedding_origin); |
489 subscription->embedding_origin); | |
490 if (subscription->current_value == new_value) | 476 if (subscription->current_value == new_value) |
491 continue; | 477 continue; |
492 | 478 |
493 subscription->current_value = new_value; | 479 subscription->current_value = new_value; |
494 | 480 |
495 // Add the callback to |callbacks| which will be run after the loop to | 481 // Add the callback to |callbacks| which will be run after the loop to |
496 // prevent re-entrance issues. | 482 // prevent re-entrance issues. |
497 callbacks.push_back( | 483 callbacks.push_back( |
498 base::Bind(subscription->callback, | 484 base::Bind(subscription->callback, |
499 ContentSettingToPermissionStatus(new_value))); | 485 ContentSettingToPermissionStatus(new_value))); |
500 } | 486 } |
501 | 487 |
502 for (const auto& callback : callbacks) | 488 for (const auto& callback : callbacks) |
503 callback.Run(); | 489 callback.Run(); |
504 } | 490 } |
| 491 |
| 492 ContentSetting PermissionManager::GetPermissionStatusInternal( |
| 493 PermissionType permission, |
| 494 const GURL& requesting_origin, |
| 495 const GURL& embedding_origin) { |
| 496 if (IsConstantPermission(permission)) |
| 497 return GetContentSettingForConstantPermission(permission); |
| 498 |
| 499 PermissionContextBase* context = GetPermissionContext(permission); |
| 500 return context->GetPermissionStatus(requesting_origin.GetOrigin(), |
| 501 embedding_origin.GetOrigin()); |
| 502 } |
OLD | NEW |