Chromium Code Reviews| 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 "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "build/build_config.h" | 10 #include "build/build_config.h" |
| 11 #include "chrome/browser/background_sync/background_sync_permission_context.h" | |
| 11 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" | 12 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" |
| 12 #include "chrome/browser/permissions/permission_context.h" | 13 #include "chrome/browser/media/media_stream_device_permission_context.h" |
| 14 #include "chrome/browser/media/midi_permission_context.h" | |
| 15 #include "chrome/browser/notifications/notification_permission_context.h" | |
| 13 #include "chrome/browser/permissions/permission_context_base.h" | 16 #include "chrome/browser/permissions/permission_context_base.h" |
| 14 #include "chrome/browser/permissions/permission_request_id.h" | 17 #include "chrome/browser/permissions/permission_request_id.h" |
| 15 #include "chrome/browser/profiles/profile.h" | 18 #include "chrome/browser/profiles/profile.h" |
| 19 #include "chrome/browser/push_messaging/push_messaging_permission_context.h" | |
| 20 #include "chrome/browser/storage/durable_storage_permission_context.h" | |
| 16 #include "chrome/browser/tab_contents/tab_util.h" | 21 #include "chrome/browser/tab_contents/tab_util.h" |
| 22 #include "chrome/common/features.h" | |
| 17 #include "components/content_settings/core/browser/host_content_settings_map.h" | 23 #include "components/content_settings/core/browser/host_content_settings_map.h" |
| 18 #include "content/public/browser/permission_type.h" | 24 #include "content/public/browser/permission_type.h" |
| 19 #include "content/public/browser/render_frame_host.h" | 25 #include "content/public/browser/render_frame_host.h" |
| 20 #include "content/public/browser/render_process_host.h" | 26 #include "content/public/browser/render_process_host.h" |
| 21 #include "content/public/browser/web_contents.h" | 27 #include "content/public/browser/web_contents.h" |
| 22 | 28 |
| 29 #if defined(OS_ANDROID) || defined(OS_CHROMEOS) | |
| 30 #include "chrome/browser/media/protected_media_identifier_permission_context.h" | |
| 31 #endif | |
| 32 | |
| 23 #if !defined(OS_ANDROID) | 33 #if !defined(OS_ANDROID) |
| 24 #include "chrome/browser/ui/website_settings/permission_bubble_manager.h" | 34 #include "chrome/browser/ui/website_settings/permission_bubble_manager.h" |
| 25 #endif | 35 #endif |
| 26 | 36 |
| 37 #if BUILDFLAG(ANDROID_JAVA_UI) | |
| 38 #include "chrome/browser/geolocation/geolocation_permission_context_android.h" | |
| 39 #else | |
| 40 #include "chrome/browser/geolocation/geolocation_permission_context.h" | |
| 41 #endif | |
| 42 | |
| 27 using blink::mojom::PermissionStatus; | 43 using blink::mojom::PermissionStatus; |
| 28 using content::PermissionType; | 44 using content::PermissionType; |
| 29 | 45 |
| 30 namespace { | 46 namespace { |
| 31 | 47 |
| 32 // Helper method to convert ContentSetting to PermissionStatus. | 48 // Helper method to convert ContentSetting to PermissionStatus. |
| 33 PermissionStatus ContentSettingToPermissionStatus(ContentSetting setting) { | 49 PermissionStatus ContentSettingToPermissionStatus(ContentSetting setting) { |
| 34 switch (setting) { | 50 switch (setting) { |
| 35 case CONTENT_SETTING_ALLOW: | 51 case CONTENT_SETTING_ALLOW: |
| 36 case CONTENT_SETTING_SESSION_ONLY: | 52 case CONTENT_SETTING_SESSION_ONLY: |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 92 } | 108 } |
| 93 | 109 |
| 94 NOTREACHED() << "Unknown content setting for permission " | 110 NOTREACHED() << "Unknown content setting for permission " |
| 95 << static_cast<int>(permission); | 111 << static_cast<int>(permission); |
| 96 return CONTENT_SETTINGS_TYPE_DEFAULT; | 112 return CONTENT_SETTINGS_TYPE_DEFAULT; |
| 97 } | 113 } |
| 98 | 114 |
| 99 // Returns whether the permission has a constant PermissionStatus value (i.e. | 115 // Returns whether the permission has a constant PermissionStatus value (i.e. |
| 100 // always approved or always denied) | 116 // always approved or always denied) |
| 101 // The PermissionTypes for which true is returned should be exactly those which | 117 // The PermissionTypes for which true is returned should be exactly those which |
| 102 // return nullptr in PermissionContext::Get since they don't have a context. | 118 // return nullptr in PermissionManager::GetPermissionContext since they don't |
| 119 // have a context. | |
| 103 bool IsConstantPermission(PermissionType type) { | 120 bool IsConstantPermission(PermissionType type) { |
| 104 switch (type) { | 121 switch (type) { |
| 105 case PermissionType::MIDI: | 122 case PermissionType::MIDI: |
| 106 return true; | 123 return true; |
| 107 default: | 124 default: |
| 108 return false; | 125 return false; |
| 109 } | 126 } |
| 110 } | 127 } |
| 111 | 128 |
| 112 void PermissionRequestResponseCallbackWrapper( | 129 void PermissionRequestResponseCallbackWrapper( |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 191 PermissionType permission; | 208 PermissionType permission; |
| 192 GURL requesting_origin; | 209 GURL requesting_origin; |
| 193 GURL embedding_origin; | 210 GURL embedding_origin; |
| 194 base::Callback<void(PermissionStatus)> callback; | 211 base::Callback<void(PermissionStatus)> callback; |
| 195 ContentSetting current_value; | 212 ContentSetting current_value; |
| 196 }; | 213 }; |
| 197 | 214 |
| 198 PermissionManager::PermissionManager(Profile* profile) | 215 PermissionManager::PermissionManager(Profile* profile) |
| 199 : profile_(profile), | 216 : profile_(profile), |
| 200 weak_ptr_factory_(this) { | 217 weak_ptr_factory_(this) { |
| 218 permission_contexts_[PermissionType::MIDI_SYSEX] = | |
| 219 make_scoped_ptr(new MidiPermissionContext(profile)); | |
|
mlamouri (slow - plz ping)
2016/04/11 14:06:05
Use base::WrapUnique() from "base/memory/ptr_util.
raymes
2016/04/12 07:44:54
Done.
| |
| 220 permission_contexts_[PermissionType::PUSH_MESSAGING] = | |
| 221 make_scoped_ptr(new PushMessagingPermissionContext(profile)); | |
| 222 permission_contexts_[PermissionType::NOTIFICATIONS] = | |
| 223 make_scoped_ptr(new NotificationPermissionContext(profile)); | |
| 224 #if !BUILDFLAG(ANDROID_JAVA_UI) | |
| 225 permission_contexts_[PermissionType::GEOLOCATION] = | |
| 226 make_scoped_ptr(new GeolocationPermissionContext(profile)); | |
| 227 #else | |
| 228 permission_contexts_[PermissionType::GEOLOCATION] = | |
| 229 make_scoped_ptr(new GeolocationPermissionContextAndroid(profile)); | |
| 230 #endif | |
| 231 #if defined(OS_CHROMEOS) || defined(OS_ANDROID) | |
| 232 permission_contexts_[PermissionType::PROTECTED_MEDIA_IDENTIFIER] = | |
| 233 make_scoped_ptr(new ProtectedMediaIdentifierPermissionContext(profile)); | |
| 234 #endif | |
| 235 permission_contexts_[PermissionType::DURABLE_STORAGE] = | |
| 236 make_scoped_ptr(new DurableStoragePermissionContext(profile)); | |
| 237 permission_contexts_[PermissionType::AUDIO_CAPTURE] = | |
| 238 make_scoped_ptr(new MediaStreamDevicePermissionContext( | |
| 239 profile, content::PermissionType::AUDIO_CAPTURE, | |
| 240 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); | |
| 241 permission_contexts_[PermissionType::VIDEO_CAPTURE] = | |
| 242 make_scoped_ptr(new MediaStreamDevicePermissionContext( | |
| 243 profile, content::PermissionType::VIDEO_CAPTURE, | |
| 244 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); | |
| 245 permission_contexts_[PermissionType::BACKGROUND_SYNC] = | |
| 246 make_scoped_ptr(new BackgroundSyncPermissionContext(profile)); | |
| 201 } | 247 } |
| 202 | 248 |
| 203 PermissionManager::~PermissionManager() { | 249 PermissionManager::~PermissionManager() { |
| 204 if (!subscriptions_.IsEmpty()) | 250 if (!subscriptions_.IsEmpty()) |
| 205 HostContentSettingsMapFactory::GetForProfile(profile_) | 251 HostContentSettingsMapFactory::GetForProfile(profile_) |
| 206 ->RemoveObserver(this); | 252 ->RemoveObserver(this); |
| 207 } | 253 } |
| 208 | 254 |
| 255 PermissionContextBase* PermissionManager::GetPermissionContext( | |
| 256 PermissionType type) { | |
| 257 const auto& it = permission_contexts_.find(type); | |
| 258 return it == permission_contexts_.end() ? nullptr : it->second.get(); | |
| 259 } | |
| 260 | |
| 209 int PermissionManager::RequestPermission( | 261 int PermissionManager::RequestPermission( |
| 210 PermissionType permission, | 262 PermissionType permission, |
| 211 content::RenderFrameHost* render_frame_host, | 263 content::RenderFrameHost* render_frame_host, |
| 212 const GURL& requesting_origin, | 264 const GURL& requesting_origin, |
| 213 const base::Callback<void(PermissionStatus)>& callback) { | 265 const base::Callback<void(PermissionStatus)>& callback) { |
| 214 return RequestPermissions( | 266 return RequestPermissions( |
| 215 std::vector<PermissionType>(1, permission), | 267 std::vector<PermissionType>(1, permission), |
| 216 render_frame_host, | 268 render_frame_host, |
| 217 requesting_origin, | 269 requesting_origin, |
| 218 base::Bind(&PermissionRequestResponseCallbackWrapper, callback)); | 270 base::Bind(&PermissionRequestResponseCallbackWrapper, callback)); |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 237 render_frame_host, permissions, callback); | 289 render_frame_host, permissions, callback); |
| 238 int request_id = pending_requests_.Add(pending_request); | 290 int request_id = pending_requests_.Add(pending_request); |
| 239 | 291 |
| 240 const PermissionRequestID request(render_frame_host, request_id); | 292 const PermissionRequestID request(render_frame_host, request_id); |
| 241 | 293 |
| 242 for (size_t i = 0; i < permissions.size(); ++i) { | 294 for (size_t i = 0; i < permissions.size(); ++i) { |
| 243 const PermissionType permission = permissions[i]; | 295 const PermissionType permission = permissions[i]; |
| 244 | 296 |
| 245 if (IsConstantPermission(permission) || | 297 if (IsConstantPermission(permission) || |
| 246 IsPermissionBubbleManagerMissing(web_contents) || | 298 IsPermissionBubbleManagerMissing(web_contents) || |
| 247 !PermissionContext::Get(profile_, permission)) { | 299 !GetPermissionContext(permission)) { |
| 248 OnPermissionsRequestResponseStatus(request_id, i, | 300 OnPermissionsRequestResponseStatus(request_id, i, |
| 249 GetPermissionStatus(permission, requesting_origin, embedding_origin)); | 301 GetPermissionStatus(permission, requesting_origin, embedding_origin)); |
| 250 continue; | 302 continue; |
| 251 } | 303 } |
| 252 | 304 |
| 253 PermissionContextBase* context = PermissionContext::Get( | 305 PermissionContextBase* context = GetPermissionContext(permission); |
| 254 profile_, permission); | |
| 255 context->RequestPermission( | 306 context->RequestPermission( |
| 256 web_contents, request, requesting_origin, | 307 web_contents, request, requesting_origin, |
| 257 base::Bind(&ContentSettingToPermissionStatusCallbackWrapper, | 308 base::Bind(&ContentSettingToPermissionStatusCallbackWrapper, |
| 258 base::Bind(&PermissionManager::OnPermissionsRequestResponseStatus, | 309 base::Bind(&PermissionManager::OnPermissionsRequestResponseStatus, |
| 259 weak_ptr_factory_.GetWeakPtr(), request_id, i))); | 310 weak_ptr_factory_.GetWeakPtr(), request_id, i))); |
| 260 } | 311 } |
| 261 | 312 |
| 262 // The request might have been resolved already. | 313 // The request might have been resolved already. |
| 263 if (!pending_requests_.Lookup(request_id)) | 314 if (!pending_requests_.Lookup(request_id)) |
| 264 return kNoPendingOperation; | 315 return kNoPendingOperation; |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 290 DCHECK(web_contents); | 341 DCHECK(web_contents); |
| 291 if (IsPermissionBubbleManagerMissing(web_contents)) { | 342 if (IsPermissionBubbleManagerMissing(web_contents)) { |
| 292 pending_requests_.Remove(request_id); | 343 pending_requests_.Remove(request_id); |
| 293 return; | 344 return; |
| 294 } | 345 } |
| 295 | 346 |
| 296 const PermissionRequestID request(pending_request->render_process_id(), | 347 const PermissionRequestID request(pending_request->render_process_id(), |
| 297 pending_request->render_frame_id(), | 348 pending_request->render_frame_id(), |
| 298 request_id); | 349 request_id); |
| 299 for (PermissionType permission : pending_request->permissions()) { | 350 for (PermissionType permission : pending_request->permissions()) { |
| 300 PermissionContextBase* context = PermissionContext::Get( | 351 PermissionContextBase* context = GetPermissionContext(permission); |
| 301 profile_, permission); | |
| 302 if (!context) | 352 if (!context) |
| 303 continue; | 353 continue; |
| 304 context->CancelPermissionRequest(web_contents, request); | 354 context->CancelPermissionRequest(web_contents, request); |
| 305 } | 355 } |
| 306 pending_requests_.Remove(request_id); | 356 pending_requests_.Remove(request_id); |
| 307 } | 357 } |
| 308 | 358 |
| 309 void PermissionManager::ResetPermission(PermissionType permission, | 359 void PermissionManager::ResetPermission(PermissionType permission, |
| 310 const GURL& requesting_origin, | 360 const GURL& requesting_origin, |
| 311 const GURL& embedding_origin) { | 361 const GURL& embedding_origin) { |
| 312 PermissionContextBase* context = PermissionContext::Get(profile_, permission); | 362 PermissionContextBase* context = GetPermissionContext(permission); |
| 313 if (!context) | 363 if (!context) |
| 314 return; | 364 return; |
| 315 | 365 |
| 316 context->ResetPermission(requesting_origin.GetOrigin(), | 366 context->ResetPermission(requesting_origin.GetOrigin(), |
| 317 embedding_origin.GetOrigin()); | 367 embedding_origin.GetOrigin()); |
| 318 } | 368 } |
| 319 | 369 |
| 320 PermissionStatus PermissionManager::GetPermissionStatus( | 370 PermissionStatus PermissionManager::GetPermissionStatus( |
| 321 PermissionType permission, | 371 PermissionType permission, |
| 322 const GURL& requesting_origin, | 372 const GURL& requesting_origin, |
| 323 const GURL& embedding_origin) { | 373 const GURL& embedding_origin) { |
| 324 if (IsConstantPermission(permission)) | 374 if (IsConstantPermission(permission)) |
| 325 return GetPermissionStatusForConstantPermission(permission); | 375 return GetPermissionStatusForConstantPermission(permission); |
| 326 | 376 |
| 327 PermissionContextBase* context = PermissionContext::Get(profile_, permission); | 377 PermissionContextBase* context = GetPermissionContext(permission); |
| 328 if (!context) | 378 if (!context) |
| 329 return PermissionStatus::DENIED; | 379 return PermissionStatus::DENIED; |
| 330 | 380 |
| 331 return ContentSettingToPermissionStatus(context->GetPermissionStatus( | 381 return ContentSettingToPermissionStatus(context->GetPermissionStatus( |
| 332 requesting_origin.GetOrigin(), embedding_origin.GetOrigin())); | 382 requesting_origin.GetOrigin(), embedding_origin.GetOrigin())); |
| 333 } | 383 } |
| 334 | 384 |
| 335 void PermissionManager::RegisterPermissionUsage(PermissionType permission, | 385 void PermissionManager::RegisterPermissionUsage(PermissionType permission, |
| 336 const GURL& requesting_origin, | 386 const GURL& requesting_origin, |
| 337 const GURL& embedding_origin) { | 387 const GURL& embedding_origin) { |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 357 Subscription* subscription = new Subscription(); | 407 Subscription* subscription = new Subscription(); |
| 358 subscription->permission = permission; | 408 subscription->permission = permission; |
| 359 subscription->requesting_origin = requesting_origin; | 409 subscription->requesting_origin = requesting_origin; |
| 360 subscription->embedding_origin = embedding_origin; | 410 subscription->embedding_origin = embedding_origin; |
| 361 subscription->callback = callback; | 411 subscription->callback = callback; |
| 362 | 412 |
| 363 if (IsConstantPermission(permission)) { | 413 if (IsConstantPermission(permission)) { |
| 364 subscription->current_value = GetContentSettingForConstantPermission( | 414 subscription->current_value = GetContentSettingForConstantPermission( |
| 365 permission); | 415 permission); |
| 366 } else { | 416 } else { |
| 367 subscription->current_value = PermissionContext::Get(profile_, permission) | 417 subscription->current_value = |
| 368 ->GetPermissionStatus(subscription->requesting_origin, | 418 GetPermissionContext(permission) |
| 369 subscription->embedding_origin); | 419 ->GetPermissionStatus(subscription->requesting_origin, |
| 420 subscription->embedding_origin); | |
| 370 } | 421 } |
| 371 | 422 |
| 372 return subscriptions_.Add(subscription); | 423 return subscriptions_.Add(subscription); |
| 373 } | 424 } |
| 374 | 425 |
| 375 void PermissionManager::UnsubscribePermissionStatusChange(int subscription_id) { | 426 void PermissionManager::UnsubscribePermissionStatusChange(int subscription_id) { |
| 376 // Whether |subscription_id| is known will be checked by the Remove() call. | 427 // Whether |subscription_id| is known will be checked by the Remove() call. |
| 377 subscriptions_.Remove(subscription_id); | 428 subscriptions_.Remove(subscription_id); |
| 378 | 429 |
| 379 if (subscriptions_.IsEmpty()) | 430 if (subscriptions_.IsEmpty()) |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 404 } | 455 } |
| 405 | 456 |
| 406 if (primary_pattern.IsValid() && | 457 if (primary_pattern.IsValid() && |
| 407 !primary_pattern.Matches(subscription->requesting_origin)) | 458 !primary_pattern.Matches(subscription->requesting_origin)) |
| 408 continue; | 459 continue; |
| 409 if (secondary_pattern.IsValid() && | 460 if (secondary_pattern.IsValid() && |
| 410 !secondary_pattern.Matches(subscription->embedding_origin)) | 461 !secondary_pattern.Matches(subscription->embedding_origin)) |
| 411 continue; | 462 continue; |
| 412 | 463 |
| 413 ContentSetting new_value = | 464 ContentSetting new_value = |
| 414 PermissionContext::Get(profile_, subscription->permission) | 465 GetPermissionContext(subscription->permission) |
| 415 ->GetPermissionStatus(subscription->requesting_origin, | 466 ->GetPermissionStatus(subscription->requesting_origin, |
| 416 subscription->embedding_origin); | 467 subscription->embedding_origin); |
| 417 if (subscription->current_value == new_value) | 468 if (subscription->current_value == new_value) |
| 418 continue; | 469 continue; |
| 419 | 470 |
| 420 subscription->current_value = new_value; | 471 subscription->current_value = new_value; |
| 421 | 472 |
| 422 // Add the callback to |callbacks| which will be run after the loop to | 473 // Add the callback to |callbacks| which will be run after the loop to |
| 423 // prevent re-entrance issues. | 474 // prevent re-entrance issues. |
| 424 callbacks.push_back( | 475 callbacks.push_back( |
| 425 base::Bind(subscription->callback, | 476 base::Bind(subscription->callback, |
| 426 ContentSettingToPermissionStatus(new_value))); | 477 ContentSettingToPermissionStatus(new_value))); |
| 427 } | 478 } |
| 428 | 479 |
| 429 for (const auto& callback : callbacks) | 480 for (const auto& callback : callbacks) |
| 430 callback.Run(); | 481 callback.Run(); |
| 431 } | 482 } |
| OLD | NEW |