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

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

Issue 2897833002: Add a PermissionContext subclass for the midi permission (Closed)
Patch Set: Midi sysex Created 3 years, 6 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 | « chrome/browser/media/midi_sysex_permission_context_unittest.cc ('k') | chrome/test/BUILD.gn » ('j') | 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 <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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « chrome/browser/media/midi_sysex_permission_context_unittest.cc ('k') | chrome/test/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698