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

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

Issue 1871343002: Remove PermissionContext factories (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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
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 "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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698