| 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 | 10 |
| 11 #include "base/callback.h" | 11 #include "base/callback.h" |
| 12 #include "base/memory/ptr_util.h" | 12 #include "base/memory/ptr_util.h" |
| 13 #include "build/build_config.h" | 13 #include "build/build_config.h" |
| 14 #include "chrome/browser/background_sync/background_sync_permission_context.h" | 14 #include "chrome/browser/background_sync/background_sync_permission_context.h" |
| 15 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" | 15 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" |
| 16 #include "chrome/browser/media/midi_permission_context.h" | 16 #include "chrome/browser/media/midi_permission_context.h" |
| 17 #include "chrome/browser/media/webrtc/media_stream_device_permission_context.h" | 17 #include "chrome/browser/media/webrtc/media_stream_device_permission_context.h" |
| 18 #include "chrome/browser/notifications/notification_permission_context.h" | 18 #include "chrome/browser/notifications/notification_permission_context.h" |
| 19 #include "chrome/browser/permissions/permission_context_base.h" | 19 #include "chrome/browser/permissions/permission_context_base.h" |
| 20 #include "chrome/browser/permissions/permission_manager_factory.h" | 20 #include "chrome/browser/permissions/permission_manager_factory.h" |
| 21 #include "chrome/browser/permissions/permission_request_id.h" | 21 #include "chrome/browser/permissions/permission_request_id.h" |
| 22 #include "chrome/browser/permissions/permission_uma_util.h" | 22 #include "chrome/browser/permissions/permission_uma_util.h" |
| 23 #include "chrome/browser/profiles/profile.h" | 23 #include "chrome/browser/profiles/profile.h" |
| 24 #include "chrome/browser/storage/durable_storage_permission_context.h" | 24 #include "chrome/browser/storage/durable_storage_permission_context.h" |
| 25 #include "chrome/browser/tab_contents/tab_util.h" | 25 #include "chrome/browser/tab_contents/tab_util.h" |
| 26 #include "chrome/common/features.h" | 26 #include "chrome/common/features.h" |
| 27 #include "components/content_settings/core/browser/host_content_settings_map.h" | 27 #include "components/content_settings/core/browser/host_content_settings_map.h" |
| 28 #include "content/public/browser/browser_thread.h" |
| 28 #include "content/public/browser/permission_type.h" | 29 #include "content/public/browser/permission_type.h" |
| 29 #include "content/public/browser/render_frame_host.h" | 30 #include "content/public/browser/render_frame_host.h" |
| 30 #include "content/public/browser/render_process_host.h" | 31 #include "content/public/browser/render_process_host.h" |
| 31 #include "content/public/browser/web_contents.h" | 32 #include "content/public/browser/web_contents.h" |
| 32 | 33 |
| 33 #if defined(ENABLE_PLUGINS) | 34 #if defined(ENABLE_PLUGINS) |
| 34 #include "chrome/browser/plugins/flash_permission_context.h" | 35 #include "chrome/browser/plugins/flash_permission_context.h" |
| 35 #endif | 36 #endif |
| 36 | 37 |
| 37 #if defined(OS_ANDROID) || defined(OS_CHROMEOS) | 38 #if defined(OS_ANDROID) || defined(OS_CHROMEOS) |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 base::Bind(&PermissionRequestResponseCallbackWrapper, callback)); | 283 base::Bind(&PermissionRequestResponseCallbackWrapper, callback)); |
| 283 } | 284 } |
| 284 | 285 |
| 285 int PermissionManager::RequestPermissions( | 286 int PermissionManager::RequestPermissions( |
| 286 const std::vector<PermissionType>& permissions, | 287 const std::vector<PermissionType>& permissions, |
| 287 content::RenderFrameHost* render_frame_host, | 288 content::RenderFrameHost* render_frame_host, |
| 288 const GURL& requesting_origin, | 289 const GURL& requesting_origin, |
| 289 bool user_gesture, | 290 bool user_gesture, |
| 290 const base::Callback<void( | 291 const base::Callback<void( |
| 291 const std::vector<PermissionStatus>&)>& callback) { | 292 const std::vector<PermissionStatus>&)>& callback) { |
| 293 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 292 if (permissions.empty()) { | 294 if (permissions.empty()) { |
| 293 callback.Run(std::vector<PermissionStatus>()); | 295 callback.Run(std::vector<PermissionStatus>()); |
| 294 return kNoPendingOperation; | 296 return kNoPendingOperation; |
| 295 } | 297 } |
| 296 | 298 |
| 297 content::WebContents* web_contents = | 299 content::WebContents* web_contents = |
| 298 content::WebContents::FromRenderFrameHost(render_frame_host); | 300 content::WebContents::FromRenderFrameHost(render_frame_host); |
| 299 GURL embedding_origin = web_contents->GetLastCommittedURL().GetOrigin(); | 301 GURL embedding_origin = web_contents->GetLastCommittedURL().GetOrigin(); |
| 300 | 302 |
| 301 PendingRequest* pending_request = new PendingRequest( | 303 PendingRequest* pending_request = new PendingRequest( |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 pending_request->SetPermissionStatus(permission_id, status); | 348 pending_request->SetPermissionStatus(permission_id, status); |
| 347 | 349 |
| 348 if (!pending_request->IsComplete()) | 350 if (!pending_request->IsComplete()) |
| 349 return; | 351 return; |
| 350 | 352 |
| 351 pending_request->callback().Run(pending_request->results()); | 353 pending_request->callback().Run(pending_request->results()); |
| 352 pending_requests_.Remove(request_id); | 354 pending_requests_.Remove(request_id); |
| 353 } | 355 } |
| 354 | 356 |
| 355 void PermissionManager::CancelPermissionRequest(int request_id) { | 357 void PermissionManager::CancelPermissionRequest(int request_id) { |
| 358 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 356 PendingRequest* pending_request = pending_requests_.Lookup(request_id); | 359 PendingRequest* pending_request = pending_requests_.Lookup(request_id); |
| 357 if (!pending_request) | 360 if (!pending_request) |
| 358 return; | 361 return; |
| 359 | 362 |
| 360 content::WebContents* web_contents = tab_util::GetWebContentsByFrameID( | 363 content::WebContents* web_contents = tab_util::GetWebContentsByFrameID( |
| 361 pending_request->render_process_id(), pending_request->render_frame_id()); | 364 pending_request->render_process_id(), pending_request->render_frame_id()); |
| 362 DCHECK(web_contents); | 365 DCHECK(web_contents); |
| 363 | 366 |
| 364 const PermissionRequestID request(pending_request->render_process_id(), | 367 const PermissionRequestID request(pending_request->render_process_id(), |
| 365 pending_request->render_frame_id(), | 368 pending_request->render_frame_id(), |
| 366 request_id); | 369 request_id); |
| 367 for (PermissionType permission : pending_request->permissions()) { | 370 for (PermissionType permission : pending_request->permissions()) { |
| 368 PermissionContextBase* context = GetPermissionContext(permission); | 371 PermissionContextBase* context = GetPermissionContext(permission); |
| 369 if (!context) | 372 if (!context) |
| 370 continue; | 373 continue; |
| 371 context->CancelPermissionRequest(web_contents, request); | 374 context->CancelPermissionRequest(web_contents, request); |
| 372 } | 375 } |
| 373 pending_requests_.Remove(request_id); | 376 pending_requests_.Remove(request_id); |
| 374 } | 377 } |
| 375 | 378 |
| 376 void PermissionManager::ResetPermission(PermissionType permission, | 379 void PermissionManager::ResetPermission(PermissionType permission, |
| 377 const GURL& requesting_origin, | 380 const GURL& requesting_origin, |
| 378 const GURL& embedding_origin) { | 381 const GURL& embedding_origin) { |
| 382 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 379 PermissionContextBase* context = GetPermissionContext(permission); | 383 PermissionContextBase* context = GetPermissionContext(permission); |
| 380 if (!context) | 384 if (!context) |
| 381 return; | 385 return; |
| 382 | 386 |
| 383 context->ResetPermission(requesting_origin.GetOrigin(), | 387 context->ResetPermission(requesting_origin.GetOrigin(), |
| 384 embedding_origin.GetOrigin()); | 388 embedding_origin.GetOrigin()); |
| 385 } | 389 } |
| 386 | 390 |
| 387 PermissionStatus PermissionManager::GetPermissionStatus( | 391 PermissionStatus PermissionManager::GetPermissionStatus( |
| 388 PermissionType permission, | 392 PermissionType permission, |
| 389 const GURL& requesting_origin, | 393 const GURL& requesting_origin, |
| 390 const GURL& embedding_origin) { | 394 const GURL& embedding_origin) { |
| 395 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 391 if (IsConstantPermission(permission)) | 396 if (IsConstantPermission(permission)) |
| 392 return GetPermissionStatusForConstantPermission(permission); | 397 return GetPermissionStatusForConstantPermission(permission); |
| 393 | 398 |
| 394 PermissionContextBase* context = GetPermissionContext(permission); | 399 PermissionContextBase* context = GetPermissionContext(permission); |
| 395 if (!context) | 400 if (!context) |
| 396 return PermissionStatus::DENIED; | 401 return PermissionStatus::DENIED; |
| 397 | 402 |
| 398 return ContentSettingToPermissionStatus(context->GetPermissionStatus( | 403 return ContentSettingToPermissionStatus(context->GetPermissionStatus( |
| 399 requesting_origin.GetOrigin(), embedding_origin.GetOrigin())); | 404 requesting_origin.GetOrigin(), embedding_origin.GetOrigin())); |
| 400 } | 405 } |
| 401 | 406 |
| 402 void PermissionManager::RegisterPermissionUsage(PermissionType permission, | 407 void PermissionManager::RegisterPermissionUsage(PermissionType permission, |
| 403 const GURL& requesting_origin, | 408 const GURL& requesting_origin, |
| 404 const GURL& embedding_origin) { | 409 const GURL& embedding_origin) { |
| 410 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 405 // This is required because constant permissions don't have a | 411 // This is required because constant permissions don't have a |
| 406 // ContentSettingsType. | 412 // ContentSettingsType. |
| 407 if (IsConstantPermission(permission)) | 413 if (IsConstantPermission(permission)) |
| 408 return; | 414 return; |
| 409 | 415 |
| 410 HostContentSettingsMapFactory::GetForProfile(profile_)->UpdateLastUsage( | 416 HostContentSettingsMapFactory::GetForProfile(profile_)->UpdateLastUsage( |
| 411 requesting_origin, | 417 requesting_origin, |
| 412 embedding_origin, | 418 embedding_origin, |
| 413 PermissionTypeToContentSetting(permission)); | 419 PermissionTypeToContentSetting(permission)); |
| 414 } | 420 } |
| 415 | 421 |
| 416 int PermissionManager::SubscribePermissionStatusChange( | 422 int PermissionManager::SubscribePermissionStatusChange( |
| 417 PermissionType permission, | 423 PermissionType permission, |
| 418 const GURL& requesting_origin, | 424 const GURL& requesting_origin, |
| 419 const GURL& embedding_origin, | 425 const GURL& embedding_origin, |
| 420 const base::Callback<void(PermissionStatus)>& callback) { | 426 const base::Callback<void(PermissionStatus)>& callback) { |
| 427 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 421 if (subscriptions_.IsEmpty()) | 428 if (subscriptions_.IsEmpty()) |
| 422 HostContentSettingsMapFactory::GetForProfile(profile_)->AddObserver(this); | 429 HostContentSettingsMapFactory::GetForProfile(profile_)->AddObserver(this); |
| 423 | 430 |
| 424 Subscription* subscription = new Subscription(); | 431 Subscription* subscription = new Subscription(); |
| 425 subscription->permission = permission; | 432 subscription->permission = permission; |
| 426 subscription->requesting_origin = requesting_origin; | 433 subscription->requesting_origin = requesting_origin; |
| 427 subscription->embedding_origin = embedding_origin; | 434 subscription->embedding_origin = embedding_origin; |
| 428 subscription->callback = callback; | 435 subscription->callback = callback; |
| 429 | 436 |
| 430 if (IsConstantPermission(permission)) { | 437 if (IsConstantPermission(permission)) { |
| 431 subscription->current_value = GetContentSettingForConstantPermission( | 438 subscription->current_value = GetContentSettingForConstantPermission( |
| 432 permission); | 439 permission); |
| 433 } else { | 440 } else { |
| 434 subscription->current_value = | 441 subscription->current_value = |
| 435 GetPermissionContext(permission) | 442 GetPermissionContext(permission) |
| 436 ->GetPermissionStatus(subscription->requesting_origin, | 443 ->GetPermissionStatus(subscription->requesting_origin, |
| 437 subscription->embedding_origin); | 444 subscription->embedding_origin); |
| 438 } | 445 } |
| 439 | 446 |
| 440 return subscriptions_.Add(subscription); | 447 return subscriptions_.Add(subscription); |
| 441 } | 448 } |
| 442 | 449 |
| 443 void PermissionManager::UnsubscribePermissionStatusChange(int subscription_id) { | 450 void PermissionManager::UnsubscribePermissionStatusChange(int subscription_id) { |
| 451 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 444 // Whether |subscription_id| is known will be checked by the Remove() call. | 452 // Whether |subscription_id| is known will be checked by the Remove() call. |
| 445 subscriptions_.Remove(subscription_id); | 453 subscriptions_.Remove(subscription_id); |
| 446 | 454 |
| 447 if (subscriptions_.IsEmpty()) | 455 if (subscriptions_.IsEmpty()) |
| 448 HostContentSettingsMapFactory::GetForProfile(profile_) | 456 HostContentSettingsMapFactory::GetForProfile(profile_) |
| 449 ->RemoveObserver(this); | 457 ->RemoveObserver(this); |
| 450 } | 458 } |
| 451 | 459 |
| 452 void PermissionManager::OnContentSettingChanged( | 460 void PermissionManager::OnContentSettingChanged( |
| 453 const ContentSettingsPattern& primary_pattern, | 461 const ContentSettingsPattern& primary_pattern, |
| 454 const ContentSettingsPattern& secondary_pattern, | 462 const ContentSettingsPattern& secondary_pattern, |
| 455 ContentSettingsType content_type, | 463 ContentSettingsType content_type, |
| 456 std::string resource_identifier) { | 464 std::string resource_identifier) { |
| 465 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 457 std::list<base::Closure> callbacks; | 466 std::list<base::Closure> callbacks; |
| 458 | 467 |
| 459 for (SubscriptionsMap::iterator iter(&subscriptions_); | 468 for (SubscriptionsMap::iterator iter(&subscriptions_); |
| 460 !iter.IsAtEnd(); iter.Advance()) { | 469 !iter.IsAtEnd(); iter.Advance()) { |
| 461 Subscription* subscription = iter.GetCurrentValue(); | 470 Subscription* subscription = iter.GetCurrentValue(); |
| 462 if (IsConstantPermission(subscription->permission)) | 471 if (IsConstantPermission(subscription->permission)) |
| 463 continue; | 472 continue; |
| 464 if (PermissionTypeToContentSetting(subscription->permission) != | 473 if (PermissionTypeToContentSetting(subscription->permission) != |
| 465 content_type) { | 474 content_type) { |
| 466 continue; | 475 continue; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 485 // Add the callback to |callbacks| which will be run after the loop to | 494 // Add the callback to |callbacks| which will be run after the loop to |
| 486 // prevent re-entrance issues. | 495 // prevent re-entrance issues. |
| 487 callbacks.push_back( | 496 callbacks.push_back( |
| 488 base::Bind(subscription->callback, | 497 base::Bind(subscription->callback, |
| 489 ContentSettingToPermissionStatus(new_value))); | 498 ContentSettingToPermissionStatus(new_value))); |
| 490 } | 499 } |
| 491 | 500 |
| 492 for (const auto& callback : callbacks) | 501 for (const auto& callback : callbacks) |
| 493 callback.Run(); | 502 callback.Run(); |
| 494 } | 503 } |
| OLD | NEW |