| 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 <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| 11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
| 12 #include "build/build_config.h" | 12 #include "build/build_config.h" |
| 13 #include "chrome/browser/background_sync/background_sync_permission_context.h" | 13 #include "chrome/browser/background_sync/background_sync_permission_context.h" |
| 14 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" | 14 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" |
| 15 #include "chrome/browser/media/midi_permission_context.h" | 15 #include "chrome/browser/media/midi_permission_context.h" |
| 16 #include "chrome/browser/media/midi_sysex_permission_context.h" |
| 16 #include "chrome/browser/media/webrtc/media_stream_device_permission_context.h" | 17 #include "chrome/browser/media/webrtc/media_stream_device_permission_context.h" |
| 17 #include "chrome/browser/notifications/notification_permission_context.h" | 18 #include "chrome/browser/notifications/notification_permission_context.h" |
| 18 #include "chrome/browser/permissions/permission_context_base.h" | 19 #include "chrome/browser/permissions/permission_context_base.h" |
| 19 #include "chrome/browser/permissions/permission_manager_factory.h" | 20 #include "chrome/browser/permissions/permission_manager_factory.h" |
| 20 #include "chrome/browser/permissions/permission_request_id.h" | 21 #include "chrome/browser/permissions/permission_request_id.h" |
| 21 #include "chrome/browser/permissions/permission_result.h" | 22 #include "chrome/browser/permissions/permission_result.h" |
| 22 #include "chrome/browser/permissions/permission_uma_util.h" | 23 #include "chrome/browser/permissions/permission_uma_util.h" |
| 23 #include "chrome/browser/profiles/profile.h" | 24 #include "chrome/browser/profiles/profile.h" |
| 24 #include "chrome/browser/storage/durable_storage_permission_context.h" | 25 #include "chrome/browser/storage/durable_storage_permission_context.h" |
| 25 #include "chrome/browser/tab_contents/tab_util.h" | 26 #include "chrome/browser/tab_contents/tab_util.h" |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 case PermissionType::NUM: | 105 case PermissionType::NUM: |
| 105 // This will hit the NOTREACHED below. | 106 // This will hit the NOTREACHED below. |
| 106 break; | 107 break; |
| 107 } | 108 } |
| 108 | 109 |
| 109 NOTREACHED() << "Unknown content setting for permission " | 110 NOTREACHED() << "Unknown content setting for permission " |
| 110 << static_cast<int>(permission); | 111 << static_cast<int>(permission); |
| 111 return CONTENT_SETTINGS_TYPE_DEFAULT; | 112 return CONTENT_SETTINGS_TYPE_DEFAULT; |
| 112 } | 113 } |
| 113 | 114 |
| 114 // Returns whether the permission has a constant ContentSetting value (i.e. | |
| 115 // always approved or always denied) | |
| 116 // The ContentSettingsTypes for which true is returned will also return nullptr | |
| 117 // in PermissionManager::GetPermissionContext since they don't have a context. | |
| 118 bool IsConstantPermission(ContentSettingsType type) { | |
| 119 return type == CONTENT_SETTINGS_TYPE_MIDI; | |
| 120 } | |
| 121 | |
| 122 void SubscriptionCallbackWrapper( | 115 void SubscriptionCallbackWrapper( |
| 123 const base::Callback<void(PermissionStatus)>& callback, | 116 const base::Callback<void(PermissionStatus)>& callback, |
| 124 ContentSetting content_setting) { | 117 ContentSetting content_setting) { |
| 125 callback.Run(ContentSettingToPermissionStatus(content_setting)); | 118 callback.Run(ContentSettingToPermissionStatus(content_setting)); |
| 126 } | 119 } |
| 127 | 120 |
| 128 void PermissionStatusCallbackWrapper( | 121 void PermissionStatusCallbackWrapper( |
| 129 const base::Callback<void(PermissionStatus)>& callback, | 122 const base::Callback<void(PermissionStatus)>& callback, |
| 130 const std::vector<ContentSetting>& vector) { | 123 const std::vector<ContentSetting>& vector) { |
| 131 DCHECK_EQ(1ul, vector.size()); | 124 DCHECK_EQ(1ul, vector.size()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 142 callback.Run(permission_statuses); | 135 callback.Run(permission_statuses); |
| 143 } | 136 } |
| 144 | 137 |
| 145 void ContentSettingCallbackWraper( | 138 void ContentSettingCallbackWraper( |
| 146 const base::Callback<void(ContentSetting)>& callback, | 139 const base::Callback<void(ContentSetting)>& callback, |
| 147 const std::vector<ContentSetting>& vector) { | 140 const std::vector<ContentSetting>& vector) { |
| 148 DCHECK_EQ(1ul, vector.size()); | 141 DCHECK_EQ(1ul, vector.size()); |
| 149 callback.Run(vector[0]); | 142 callback.Run(vector[0]); |
| 150 } | 143 } |
| 151 | 144 |
| 152 // Function used for handling permission types which do not change their | |
| 153 // value i.e. they are always approved or always denied etc. | |
| 154 // CONTENT_SETTING_DEFAULT is returned if the permission needs further handling. | |
| 155 // This function should only be called when IsConstantPermission has returned | |
| 156 // true for the PermissionType. | |
| 157 ContentSetting GetContentSettingForConstantPermission( | |
| 158 ContentSettingsType type) { | |
| 159 DCHECK(IsConstantPermission(type)); | |
| 160 switch (type) { | |
| 161 case CONTENT_SETTINGS_TYPE_MIDI: | |
| 162 return CONTENT_SETTING_ALLOW; | |
| 163 default: | |
| 164 return CONTENT_SETTING_BLOCK; | |
| 165 } | |
| 166 } | |
| 167 | |
| 168 } // anonymous namespace | 145 } // anonymous namespace |
| 169 | 146 |
| 170 class PermissionManager::PendingRequest { | 147 class PermissionManager::PendingRequest { |
| 171 public: | 148 public: |
| 172 PendingRequest( | 149 PendingRequest( |
| 173 content::RenderFrameHost* render_frame_host, | 150 content::RenderFrameHost* render_frame_host, |
| 174 const std::vector<ContentSettingsType>& permissions, | 151 const std::vector<ContentSettingsType>& permissions, |
| 175 const base::Callback<void(const std::vector<ContentSetting>&)>& callback) | 152 const base::Callback<void(const std::vector<ContentSetting>&)>& callback) |
| 176 : render_process_id_(render_frame_host->GetProcess()->GetID()), | 153 : render_process_id_(render_frame_host->GetProcess()->GetID()), |
| 177 render_frame_id_(render_frame_host->GetRoutingID()), | 154 render_frame_id_(render_frame_host->GetRoutingID()), |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 | 201 |
| 225 // static | 202 // static |
| 226 PermissionManager* PermissionManager::Get(Profile* profile) { | 203 PermissionManager* PermissionManager::Get(Profile* profile) { |
| 227 return PermissionManagerFactory::GetForProfile(profile); | 204 return PermissionManagerFactory::GetForProfile(profile); |
| 228 } | 205 } |
| 229 | 206 |
| 230 PermissionManager::PermissionManager(Profile* profile) | 207 PermissionManager::PermissionManager(Profile* profile) |
| 231 : profile_(profile), | 208 : profile_(profile), |
| 232 weak_ptr_factory_(this) { | 209 weak_ptr_factory_(this) { |
| 233 permission_contexts_[CONTENT_SETTINGS_TYPE_MIDI_SYSEX] = | 210 permission_contexts_[CONTENT_SETTINGS_TYPE_MIDI_SYSEX] = |
| 211 base::MakeUnique<MidiSysexPermissionContext>(profile); |
| 212 permission_contexts_[CONTENT_SETTINGS_TYPE_MIDI] = |
| 234 base::MakeUnique<MidiPermissionContext>(profile); | 213 base::MakeUnique<MidiPermissionContext>(profile); |
| 235 permission_contexts_[CONTENT_SETTINGS_TYPE_PUSH_MESSAGING] = | 214 permission_contexts_[CONTENT_SETTINGS_TYPE_PUSH_MESSAGING] = |
| 236 base::MakeUnique<NotificationPermissionContext>( | 215 base::MakeUnique<NotificationPermissionContext>( |
| 237 profile, CONTENT_SETTINGS_TYPE_PUSH_MESSAGING); | 216 profile, CONTENT_SETTINGS_TYPE_PUSH_MESSAGING); |
| 238 permission_contexts_[CONTENT_SETTINGS_TYPE_NOTIFICATIONS] = | 217 permission_contexts_[CONTENT_SETTINGS_TYPE_NOTIFICATIONS] = |
| 239 base::MakeUnique<NotificationPermissionContext>( | 218 base::MakeUnique<NotificationPermissionContext>( |
| 240 profile, CONTENT_SETTINGS_TYPE_NOTIFICATIONS); | 219 profile, CONTENT_SETTINGS_TYPE_NOTIFICATIONS); |
| 241 #if !defined(OS_ANDROID) | 220 #if !defined(OS_ANDROID) |
| 242 permission_contexts_[CONTENT_SETTINGS_TYPE_GEOLOCATION] = | 221 permission_contexts_[CONTENT_SETTINGS_TYPE_GEOLOCATION] = |
| 243 base::MakeUnique<GeolocationPermissionContext>(profile); | 222 base::MakeUnique<GeolocationPermissionContext>(profile); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 GURL embedding_origin = web_contents->GetLastCommittedURL().GetOrigin(); | 285 GURL embedding_origin = web_contents->GetLastCommittedURL().GetOrigin(); |
| 307 | 286 |
| 308 int request_id = pending_requests_.Add(base::MakeUnique<PendingRequest>( | 287 int request_id = pending_requests_.Add(base::MakeUnique<PendingRequest>( |
| 309 render_frame_host, permissions, callback)); | 288 render_frame_host, permissions, callback)); |
| 310 | 289 |
| 311 const PermissionRequestID request(render_frame_host, request_id); | 290 const PermissionRequestID request(render_frame_host, request_id); |
| 312 | 291 |
| 313 for (size_t i = 0; i < permissions.size(); ++i) { | 292 for (size_t i = 0; i < permissions.size(); ++i) { |
| 314 const ContentSettingsType permission = permissions[i]; | 293 const ContentSettingsType permission = permissions[i]; |
| 315 | 294 |
| 316 if (IsConstantPermission(permission) || !GetPermissionContext(permission)) { | |
| 317 // Track permission request usages even for constant permissions. | |
| 318 PermissionUmaUtil::PermissionRequested(permission, requesting_origin, | |
| 319 embedding_origin, profile_); | |
| 320 OnPermissionsRequestResponseStatus( | |
| 321 request_id, i, GetContentSettingForConstantPermission(permission)); | |
| 322 continue; | |
| 323 } | |
| 324 | |
| 325 PermissionContextBase* context = GetPermissionContext(permission); | 295 PermissionContextBase* context = GetPermissionContext(permission); |
| 296 DCHECK(context); |
| 326 context->RequestPermission( | 297 context->RequestPermission( |
| 327 web_contents, request, requesting_origin, user_gesture, | 298 web_contents, request, requesting_origin, user_gesture, |
| 328 base::Bind(&PermissionManager::OnPermissionsRequestResponseStatus, | 299 base::Bind(&PermissionManager::OnPermissionsRequestResponseStatus, |
| 329 weak_ptr_factory_.GetWeakPtr(), request_id, i)); | 300 weak_ptr_factory_.GetWeakPtr(), request_id, i)); |
| 330 } | 301 } |
| 331 | 302 |
| 332 // The request might have been resolved already. | 303 // The request might have been resolved already. |
| 333 if (!pending_requests_.Lookup(request_id)) | 304 if (!pending_requests_.Lookup(request_id)) |
| 334 return kNoPendingOperation; | 305 return kNoPendingOperation; |
| 335 | 306 |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 const ContentSettingsPattern& primary_pattern, | 479 const ContentSettingsPattern& primary_pattern, |
| 509 const ContentSettingsPattern& secondary_pattern, | 480 const ContentSettingsPattern& secondary_pattern, |
| 510 ContentSettingsType content_type, | 481 ContentSettingsType content_type, |
| 511 std::string resource_identifier) { | 482 std::string resource_identifier) { |
| 512 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 483 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 513 std::list<base::Closure> callbacks; | 484 std::list<base::Closure> callbacks; |
| 514 | 485 |
| 515 for (SubscriptionsMap::iterator iter(&subscriptions_); | 486 for (SubscriptionsMap::iterator iter(&subscriptions_); |
| 516 !iter.IsAtEnd(); iter.Advance()) { | 487 !iter.IsAtEnd(); iter.Advance()) { |
| 517 Subscription* subscription = iter.GetCurrentValue(); | 488 Subscription* subscription = iter.GetCurrentValue(); |
| 518 if (IsConstantPermission(subscription->permission)) | |
| 519 continue; | |
| 520 if (subscription->permission != content_type) | 489 if (subscription->permission != content_type) |
| 521 continue; | 490 continue; |
| 522 | 491 |
| 523 if (primary_pattern.IsValid() && | 492 if (primary_pattern.IsValid() && |
| 524 !primary_pattern.Matches(subscription->requesting_origin)) | 493 !primary_pattern.Matches(subscription->requesting_origin)) |
| 525 continue; | 494 continue; |
| 526 if (secondary_pattern.IsValid() && | 495 if (secondary_pattern.IsValid() && |
| 527 !secondary_pattern.Matches(subscription->embedding_origin)) | 496 !secondary_pattern.Matches(subscription->embedding_origin)) |
| 528 continue; | 497 continue; |
| 529 | 498 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 544 | 513 |
| 545 for (const auto& callback : callbacks) | 514 for (const auto& callback : callbacks) |
| 546 callback.Run(); | 515 callback.Run(); |
| 547 } | 516 } |
| 548 | 517 |
| 549 PermissionResult PermissionManager::GetPermissionStatusHelper( | 518 PermissionResult PermissionManager::GetPermissionStatusHelper( |
| 550 ContentSettingsType permission, | 519 ContentSettingsType permission, |
| 551 content::RenderFrameHost* render_frame_host, | 520 content::RenderFrameHost* render_frame_host, |
| 552 const GURL& requesting_origin, | 521 const GURL& requesting_origin, |
| 553 const GURL& embedding_origin) { | 522 const GURL& embedding_origin) { |
| 554 if (IsConstantPermission(permission)) { | |
| 555 return PermissionResult(GetContentSettingForConstantPermission(permission), | |
| 556 PermissionStatusSource::UNSPECIFIED); | |
| 557 } | |
| 558 PermissionContextBase* context = GetPermissionContext(permission); | 523 PermissionContextBase* context = GetPermissionContext(permission); |
| 559 PermissionResult result = context->GetPermissionStatus( | 524 PermissionResult result = context->GetPermissionStatus( |
| 560 nullptr /* render_frame_host */, requesting_origin.GetOrigin(), | 525 render_frame_host, requesting_origin.GetOrigin(), |
| 561 embedding_origin.GetOrigin()); | 526 embedding_origin.GetOrigin()); |
| 562 DCHECK(result.content_setting == CONTENT_SETTING_ALLOW || | 527 DCHECK(result.content_setting == CONTENT_SETTING_ALLOW || |
| 563 result.content_setting == CONTENT_SETTING_ASK || | 528 result.content_setting == CONTENT_SETTING_ASK || |
| 564 result.content_setting == CONTENT_SETTING_BLOCK); | 529 result.content_setting == CONTENT_SETTING_BLOCK); |
| 565 return result; | 530 return result; |
| 566 } | 531 } |
| OLD | NEW |