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 |