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 |