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