Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Side by Side Diff: chrome/browser/permissions/permission_manager.cc

Issue 2441743003: Add DCHECKs for thread access PermissionManager. (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698