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

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

Issue 2714603002: Make PermissionManager use ContentSettingsType internally more (Closed)
Patch Set: address comments Created 3 years, 10 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 <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 // ContentSetting. 74 // ContentSetting.
75 void ContentSettingToPermissionStatusCallbackWrapper( 75 void ContentSettingToPermissionStatusCallbackWrapper(
76 const base::Callback<void(PermissionStatus)>& callback, 76 const base::Callback<void(PermissionStatus)>& callback,
77 ContentSetting setting) { 77 ContentSetting setting) {
78 callback.Run(ContentSettingToPermissionStatus(setting)); 78 callback.Run(ContentSettingToPermissionStatus(setting));
79 } 79 }
80 80
81 // Helper method to convert PermissionType to ContentSettingType. 81 // Helper method to convert PermissionType to ContentSettingType.
82 ContentSettingsType PermissionTypeToContentSetting(PermissionType permission) { 82 ContentSettingsType PermissionTypeToContentSetting(PermissionType permission) {
83 switch (permission) { 83 switch (permission) {
84 case PermissionType::MIDI:
85 return CONTENT_SETTINGS_TYPE_MIDI;
84 case PermissionType::MIDI_SYSEX: 86 case PermissionType::MIDI_SYSEX:
85 return CONTENT_SETTINGS_TYPE_MIDI_SYSEX; 87 return CONTENT_SETTINGS_TYPE_MIDI_SYSEX;
86 case PermissionType::PUSH_MESSAGING: 88 case PermissionType::PUSH_MESSAGING:
87 return CONTENT_SETTINGS_TYPE_PUSH_MESSAGING; 89 return CONTENT_SETTINGS_TYPE_PUSH_MESSAGING;
88 case PermissionType::NOTIFICATIONS: 90 case PermissionType::NOTIFICATIONS:
89 return CONTENT_SETTINGS_TYPE_NOTIFICATIONS; 91 return CONTENT_SETTINGS_TYPE_NOTIFICATIONS;
90 case PermissionType::GEOLOCATION: 92 case PermissionType::GEOLOCATION:
91 return CONTENT_SETTINGS_TYPE_GEOLOCATION; 93 return CONTENT_SETTINGS_TYPE_GEOLOCATION;
92 case PermissionType::PROTECTED_MEDIA_IDENTIFIER: 94 case PermissionType::PROTECTED_MEDIA_IDENTIFIER:
93 #if defined(OS_ANDROID) || defined(OS_CHROMEOS) 95 #if defined(OS_ANDROID) || defined(OS_CHROMEOS)
94 return CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER; 96 return CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER;
95 #else 97 #else
96 NOTIMPLEMENTED(); 98 NOTIMPLEMENTED();
97 break; 99 break;
98 #endif 100 #endif
99 case PermissionType::DURABLE_STORAGE: 101 case PermissionType::DURABLE_STORAGE:
100 return CONTENT_SETTINGS_TYPE_DURABLE_STORAGE; 102 return CONTENT_SETTINGS_TYPE_DURABLE_STORAGE;
101 case PermissionType::MIDI:
102 // This will hit the NOTREACHED below.
103 break;
104 case PermissionType::AUDIO_CAPTURE: 103 case PermissionType::AUDIO_CAPTURE:
105 return CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC; 104 return CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC;
106 case PermissionType::VIDEO_CAPTURE: 105 case PermissionType::VIDEO_CAPTURE:
107 return CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA; 106 return CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA;
108 case PermissionType::BACKGROUND_SYNC: 107 case PermissionType::BACKGROUND_SYNC:
109 return CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC; 108 return CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC;
110 case PermissionType::FLASH: 109 case PermissionType::FLASH:
111 return CONTENT_SETTINGS_TYPE_PLUGINS; 110 return CONTENT_SETTINGS_TYPE_PLUGINS;
112 case PermissionType::NUM: 111 case PermissionType::NUM:
113 // This will hit the NOTREACHED below. 112 // This will hit the NOTREACHED below.
114 break; 113 break;
115 } 114 }
116 115
117 NOTREACHED() << "Unknown content setting for permission " 116 NOTREACHED() << "Unknown content setting for permission "
118 << static_cast<int>(permission); 117 << static_cast<int>(permission);
119 return CONTENT_SETTINGS_TYPE_DEFAULT; 118 return CONTENT_SETTINGS_TYPE_DEFAULT;
120 } 119 }
121 120
122 // Returns whether the permission has a constant PermissionStatus value (i.e. 121 // Returns whether the permission has a constant PermissionStatus value (i.e.
123 // always approved or always denied) 122 // always approved or always denied)
124 // The PermissionTypes for which true is returned should be exactly those which 123 // The ContentSettingsTypes for which true is returned will also return nullptr
125 // return nullptr in PermissionManager::GetPermissionContext since they don't 124 // in PermissionManager::GetPermissionContext since they don't have a context.
126 // have a context. 125 bool IsConstantPermission(ContentSettingsType type) {
127 bool IsConstantPermission(PermissionType type) { 126 return type == CONTENT_SETTINGS_TYPE_MIDI;
128 switch (type) {
129 case PermissionType::MIDI:
130 return true;
131 default:
132 return false;
133 }
134 } 127 }
135 128
136 void PermissionRequestResponseCallbackWrapper( 129 void PermissionRequestResponseCallbackWrapper(
137 const base::Callback<void(PermissionStatus)>& callback, 130 const base::Callback<void(PermissionStatus)>& callback,
138 const std::vector<PermissionStatus>& vector) { 131 const std::vector<PermissionStatus>& vector) {
139 DCHECK_EQ(vector.size(), 1ul); 132 DCHECK_EQ(vector.size(), 1ul);
140 callback.Run(vector[0]); 133 callback.Run(vector[0]);
141 } 134 }
142 135
143 // Function used for handling permission types which do not change their 136 // Function used for handling permission types which do not change their
144 // value i.e. they are always approved or always denied etc. 137 // value i.e. they are always approved or always denied etc.
145 // CONTENT_SETTING_DEFAULT is returned if the permission needs further handling. 138 // CONTENT_SETTING_DEFAULT is returned if the permission needs further handling.
146 // This function should only be called when IsConstantPermission has returned 139 // This function should only be called when IsConstantPermission has returned
147 // true for the PermissionType. 140 // true for the PermissionType.
148 blink::mojom::PermissionStatus GetPermissionStatusForConstantPermission( 141 blink::mojom::PermissionStatus GetPermissionStatusForConstantPermission(
149 PermissionType type) { 142 ContentSettingsType type) {
150 DCHECK(IsConstantPermission(type)); 143 DCHECK(IsConstantPermission(type));
151 switch (type) { 144 switch (type) {
152 case PermissionType::MIDI: 145 case CONTENT_SETTINGS_TYPE_MIDI:
153 return PermissionStatus::GRANTED; 146 return PermissionStatus::GRANTED;
154 default: 147 default:
155 return PermissionStatus::DENIED; 148 return PermissionStatus::DENIED;
156 } 149 }
157 } 150 }
158 151
159 } // anonymous namespace 152 } // anonymous namespace
160 153
161 class PermissionManager::PendingRequest { 154 class PermissionManager::PendingRequest {
162 public: 155 public:
163 PendingRequest(content::RenderFrameHost* render_frame_host, 156 PendingRequest(
164 const std::vector<PermissionType> permissions, 157 content::RenderFrameHost* render_frame_host,
165 const base::Callback< 158 const std::vector<ContentSettingsType>& permissions,
166 void(const std::vector<PermissionStatus>&)>& callback) 159 const base::Callback<void(const std::vector<PermissionStatus>&)>&
160 callback)
167 : render_process_id_(render_frame_host->GetProcess()->GetID()), 161 : render_process_id_(render_frame_host->GetProcess()->GetID()),
168 render_frame_id_(render_frame_host->GetRoutingID()), 162 render_frame_id_(render_frame_host->GetRoutingID()),
169 callback_(callback), 163 callback_(callback),
170 permissions_(permissions), 164 permissions_(permissions),
171 results_(permissions.size(), PermissionStatus::DENIED), 165 results_(permissions.size(), PermissionStatus::DENIED),
172 remaining_results_(permissions.size()) {} 166 remaining_results_(permissions.size()) {}
173 167
174 void SetPermissionStatus(int permission_id, PermissionStatus status) { 168 void SetPermissionStatus(int permission_id, PermissionStatus status) {
175 DCHECK(!IsComplete()); 169 DCHECK(!IsComplete());
176 170
177 results_[permission_id] = status; 171 results_[permission_id] = status;
178 --remaining_results_; 172 --remaining_results_;
179 } 173 }
180 174
181 bool IsComplete() const { 175 bool IsComplete() const {
182 return remaining_results_ == 0; 176 return remaining_results_ == 0;
183 } 177 }
184 178
185 int render_process_id() const { return render_process_id_; } 179 int render_process_id() const { return render_process_id_; }
186 int render_frame_id() const { return render_frame_id_; } 180 int render_frame_id() const { return render_frame_id_; }
187 181
188 const base::Callback<void(const std::vector<PermissionStatus>&)> 182 const base::Callback<void(const std::vector<PermissionStatus>&)>
189 callback() const { 183 callback() const {
190 return callback_; 184 return callback_;
191 } 185 }
192 186
193 std::vector<PermissionType> permissions() const { 187 std::vector<ContentSettingsType> permissions() const {
194 return permissions_; 188 return permissions_;
195 } 189 }
196 190
197 std::vector<PermissionStatus> results() const { 191 std::vector<PermissionStatus> results() const {
198 return results_; 192 return results_;
199 } 193 }
200 194
201 private: 195 private:
202 int render_process_id_; 196 int render_process_id_;
203 int render_frame_id_; 197 int render_frame_id_;
204 const base::Callback<void(const std::vector<PermissionStatus>&)> callback_; 198 const base::Callback<void(const std::vector<PermissionStatus>&)> callback_;
205 std::vector<PermissionType> permissions_; 199 std::vector<ContentSettingsType> permissions_;
206 std::vector<PermissionStatus> results_; 200 std::vector<PermissionStatus> results_;
207 size_t remaining_results_; 201 size_t remaining_results_;
208 }; 202 };
209 203
210 struct PermissionManager::Subscription { 204 struct PermissionManager::Subscription {
211 PermissionType permission; 205 ContentSettingsType permission;
212 GURL requesting_origin; 206 GURL requesting_origin;
213 GURL embedding_origin; 207 GURL embedding_origin;
214 base::Callback<void(PermissionStatus)> callback; 208 base::Callback<void(PermissionStatus)> callback;
215 PermissionStatus current_value; 209 PermissionStatus current_value;
216 }; 210 };
217 211
218 // static 212 // static
219 PermissionManager* PermissionManager::Get(Profile* profile) { 213 PermissionManager* PermissionManager::Get(Profile* profile) {
220 return PermissionManagerFactory::GetForProfile(profile); 214 return PermissionManagerFactory::GetForProfile(profile);
221 } 215 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 HostContentSettingsMapFactory::GetForProfile(profile_) 257 HostContentSettingsMapFactory::GetForProfile(profile_)
264 ->RemoveObserver(this); 258 ->RemoveObserver(this);
265 } 259 }
266 260
267 int PermissionManager::RequestPermission( 261 int PermissionManager::RequestPermission(
268 ContentSettingsType content_settings_type, 262 ContentSettingsType content_settings_type,
269 content::RenderFrameHost* render_frame_host, 263 content::RenderFrameHost* render_frame_host,
270 const GURL& requesting_origin, 264 const GURL& requesting_origin,
271 bool user_gesture, 265 bool user_gesture,
272 const base::Callback<void(PermissionStatus)>& callback) { 266 const base::Callback<void(PermissionStatus)>& callback) {
273 // TODO(timloh): We should be operating on ContentSettingsType instead of
274 // converting these back to PermissionType.
275 PermissionType permission_type;
276 bool success = PermissionUtil::GetPermissionType(content_settings_type,
277 &permission_type);
278 DCHECK(success);
279 return RequestPermissions(
280 std::vector<PermissionType>(1, permission_type), render_frame_host,
281 requesting_origin, user_gesture,
282 base::Bind(&PermissionRequestResponseCallbackWrapper, callback));
283 }
284
285 PermissionStatus PermissionManager::GetPermissionStatus(
286 ContentSettingsType permission,
287 const GURL& requesting_origin,
288 const GURL& embedding_origin) {
289 PermissionContextBase* context = GetPermissionContext(permission);
290 return ContentSettingToPermissionStatus(
291 context->GetPermissionStatus(requesting_origin.GetOrigin(),
292 embedding_origin.GetOrigin())
293 .content_setting);
294 }
295
296 int PermissionManager::RequestPermission(
297 PermissionType permission,
298 content::RenderFrameHost* render_frame_host,
299 const GURL& requesting_origin,
300 bool user_gesture,
301 const base::Callback<void(PermissionStatus)>& callback) {
302 return RequestPermissions( 267 return RequestPermissions(
303 std::vector<PermissionType>(1, permission), 268 std::vector<ContentSettingsType>(1, content_settings_type),
304 render_frame_host, 269 render_frame_host, requesting_origin, user_gesture,
305 requesting_origin,
306 user_gesture,
307 base::Bind(&PermissionRequestResponseCallbackWrapper, callback)); 270 base::Bind(&PermissionRequestResponseCallbackWrapper, callback));
308 } 271 }
309 272
310 int PermissionManager::RequestPermissions( 273 int PermissionManager::RequestPermissions(
311 const std::vector<PermissionType>& permissions, 274 const std::vector<ContentSettingsType>& permissions,
312 content::RenderFrameHost* render_frame_host, 275 content::RenderFrameHost* render_frame_host,
313 const GURL& requesting_origin, 276 const GURL& requesting_origin,
314 bool user_gesture, 277 bool user_gesture,
315 const base::Callback<void( 278 const base::Callback<void(const std::vector<PermissionStatus>&)>&
316 const std::vector<PermissionStatus>&)>& callback) { 279 callback) {
317 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 280 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
318 if (permissions.empty()) { 281 if (permissions.empty()) {
319 callback.Run(std::vector<PermissionStatus>()); 282 callback.Run(std::vector<PermissionStatus>());
320 return kNoPendingOperation; 283 return kNoPendingOperation;
321 } 284 }
322 285
323 content::WebContents* web_contents = 286 content::WebContents* web_contents =
324 content::WebContents::FromRenderFrameHost(render_frame_host); 287 content::WebContents::FromRenderFrameHost(render_frame_host);
325 GURL embedding_origin = web_contents->GetLastCommittedURL().GetOrigin(); 288 GURL embedding_origin = web_contents->GetLastCommittedURL().GetOrigin();
326 289
327 int request_id = pending_requests_.Add(base::MakeUnique<PendingRequest>( 290 int request_id = pending_requests_.Add(base::MakeUnique<PendingRequest>(
328 render_frame_host, permissions, callback)); 291 render_frame_host, permissions, callback));
329 292
330 const PermissionRequestID request(render_frame_host, request_id); 293 const PermissionRequestID request(render_frame_host, request_id);
331 294
332 for (size_t i = 0; i < permissions.size(); ++i) { 295 for (size_t i = 0; i < permissions.size(); ++i) {
333 const PermissionType permission = permissions[i]; 296 const ContentSettingsType permission = permissions[i];
334 297
335 if (IsConstantPermission(permission) || 298 if (IsConstantPermission(permission) || !GetPermissionContext(permission)) {
336 !GetPermissionContext(PermissionTypeToContentSetting(permission))) {
337 // Track permission request usages even for constant permissions. 299 // Track permission request usages even for constant permissions.
338 PermissionUmaUtil::PermissionRequested(permission, requesting_origin, 300 PermissionUmaUtil::PermissionRequested(permission, requesting_origin,
339 embedding_origin, profile_); 301 embedding_origin, profile_);
340 OnPermissionsRequestResponseStatus( 302 OnPermissionsRequestResponseStatus(
341 request_id, i, GetPermissionStatusForConstantPermission(permission)); 303 request_id, i, GetPermissionStatusForConstantPermission(permission));
342 continue; 304 continue;
343 } 305 }
344 306
345 PermissionContextBase* context = 307 PermissionContextBase* context = GetPermissionContext(permission);
346 GetPermissionContext(PermissionTypeToContentSetting(permission));
347 context->RequestPermission( 308 context->RequestPermission(
348 web_contents, request, requesting_origin, user_gesture, 309 web_contents, request, requesting_origin, user_gesture,
349 base::Bind(&ContentSettingToPermissionStatusCallbackWrapper, 310 base::Bind(&ContentSettingToPermissionStatusCallbackWrapper,
350 base::Bind(&PermissionManager::OnPermissionsRequestResponseStatus, 311 base::Bind(&PermissionManager::OnPermissionsRequestResponseStatus,
351 weak_ptr_factory_.GetWeakPtr(), request_id, i))); 312 weak_ptr_factory_.GetWeakPtr(), request_id, i)));
352 } 313 }
353 314
354 // The request might have been resolved already. 315 // The request might have been resolved already.
355 if (!pending_requests_.Lookup(request_id)) 316 if (!pending_requests_.Lookup(request_id))
356 return kNoPendingOperation; 317 return kNoPendingOperation;
357 318
358 return request_id; 319 return request_id;
359 } 320 }
360 321
322 PermissionStatus PermissionManager::GetPermissionStatus(
323 ContentSettingsType permission,
324 const GURL& requesting_origin,
325 const GURL& embedding_origin) {
326 if (IsConstantPermission(permission))
327 return GetPermissionStatusForConstantPermission(permission);
328 PermissionContextBase* context = GetPermissionContext(permission);
329 return ContentSettingToPermissionStatus(
330 context
331 ->GetPermissionStatus(requesting_origin.GetOrigin(),
332 embedding_origin.GetOrigin())
333 .content_setting);
334 }
335
336 int PermissionManager::RequestPermission(
337 PermissionType permission,
338 content::RenderFrameHost* render_frame_host,
339 const GURL& requesting_origin,
340 bool user_gesture,
341 const base::Callback<void(PermissionStatus)>& callback) {
342 ContentSettingsType content_settings_type =
343 PermissionTypeToContentSetting(permission);
344 return RequestPermissions(
345 std::vector<ContentSettingsType>(1, content_settings_type),
346 render_frame_host, requesting_origin, user_gesture,
347 base::Bind(&PermissionRequestResponseCallbackWrapper, callback));
348 }
349
350 int PermissionManager::RequestPermissions(
351 const std::vector<PermissionType>& permissions,
352 content::RenderFrameHost* render_frame_host,
353 const GURL& requesting_origin,
354 bool user_gesture,
355 const base::Callback<void(const std::vector<PermissionStatus>&)>&
356 callback) {
357 std::vector<ContentSettingsType> content_settings_types;
358 std::transform(permissions.begin(), permissions.end(),
359 back_inserter(content_settings_types),
360 PermissionTypeToContentSetting);
361 return RequestPermissions(content_settings_types, render_frame_host,
362 requesting_origin, user_gesture, callback);
363 }
364
361 PermissionContextBase* PermissionManager::GetPermissionContext( 365 PermissionContextBase* PermissionManager::GetPermissionContext(
362 ContentSettingsType type) { 366 ContentSettingsType type) {
363 const auto& it = permission_contexts_.find(type); 367 const auto& it = permission_contexts_.find(type);
364 return it == permission_contexts_.end() ? nullptr : it->second.get(); 368 return it == permission_contexts_.end() ? nullptr : it->second.get();
365 } 369 }
366 370
367 void PermissionManager::OnPermissionsRequestResponseStatus( 371 void PermissionManager::OnPermissionsRequestResponseStatus(
368 int request_id, 372 int request_id,
369 int permission_id, 373 int permission_id,
370 PermissionStatus status) { 374 PermissionStatus status) {
(...skipping 13 matching lines...) Expand all
384 if (!pending_request) 388 if (!pending_request)
385 return; 389 return;
386 390
387 content::WebContents* web_contents = tab_util::GetWebContentsByFrameID( 391 content::WebContents* web_contents = tab_util::GetWebContentsByFrameID(
388 pending_request->render_process_id(), pending_request->render_frame_id()); 392 pending_request->render_process_id(), pending_request->render_frame_id());
389 DCHECK(web_contents); 393 DCHECK(web_contents);
390 394
391 const PermissionRequestID request(pending_request->render_process_id(), 395 const PermissionRequestID request(pending_request->render_process_id(),
392 pending_request->render_frame_id(), 396 pending_request->render_frame_id(),
393 request_id); 397 request_id);
394 for (PermissionType permission : pending_request->permissions()) { 398 for (ContentSettingsType permission : pending_request->permissions()) {
395 PermissionContextBase* context = 399 PermissionContextBase* context = GetPermissionContext(permission);
396 GetPermissionContext(PermissionTypeToContentSetting(permission));
397 if (!context) 400 if (!context)
398 continue; 401 continue;
399 context->CancelPermissionRequest(web_contents, request); 402 context->CancelPermissionRequest(web_contents, request);
400 } 403 }
401 pending_requests_.Remove(request_id); 404 pending_requests_.Remove(request_id);
402 } 405 }
403 406
404 void PermissionManager::ResetPermission(PermissionType permission, 407 void PermissionManager::ResetPermission(PermissionType permission,
405 const GURL& requesting_origin, 408 const GURL& requesting_origin,
406 const GURL& embedding_origin) { 409 const GURL& embedding_origin) {
407 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 410 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
408 PermissionContextBase* context = 411 PermissionContextBase* context =
409 GetPermissionContext(PermissionTypeToContentSetting(permission)); 412 GetPermissionContext(PermissionTypeToContentSetting(permission));
410 if (!context) 413 if (!context)
411 return; 414 return;
412 415
413 context->ResetPermission(requesting_origin.GetOrigin(), 416 context->ResetPermission(requesting_origin.GetOrigin(),
414 embedding_origin.GetOrigin()); 417 embedding_origin.GetOrigin());
415 } 418 }
416 419
417 PermissionStatus PermissionManager::GetPermissionStatus( 420 PermissionStatus PermissionManager::GetPermissionStatus(
418 PermissionType permission, 421 PermissionType permission,
419 const GURL& requesting_origin, 422 const GURL& requesting_origin,
420 const GURL& embedding_origin) { 423 const GURL& embedding_origin) {
421 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 424 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
422 if (IsConstantPermission(permission))
423 return GetPermissionStatusForConstantPermission(permission);
424 return GetPermissionStatus(PermissionTypeToContentSetting(permission), 425 return GetPermissionStatus(PermissionTypeToContentSetting(permission),
425 requesting_origin, embedding_origin); 426 requesting_origin, embedding_origin);
426 } 427 }
427 428
428 int PermissionManager::SubscribePermissionStatusChange( 429 int PermissionManager::SubscribePermissionStatusChange(
429 PermissionType permission, 430 PermissionType permission,
430 const GURL& requesting_origin, 431 const GURL& requesting_origin,
431 const GURL& embedding_origin, 432 const GURL& embedding_origin,
432 const base::Callback<void(PermissionStatus)>& callback) { 433 const base::Callback<void(PermissionStatus)>& callback) {
433 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 434 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
434 if (subscriptions_.IsEmpty()) 435 if (subscriptions_.IsEmpty())
435 HostContentSettingsMapFactory::GetForProfile(profile_)->AddObserver(this); 436 HostContentSettingsMapFactory::GetForProfile(profile_)->AddObserver(this);
436 437
438 ContentSettingsType content_type = PermissionTypeToContentSetting(permission);
437 auto subscription = base::MakeUnique<Subscription>(); 439 auto subscription = base::MakeUnique<Subscription>();
438 subscription->permission = permission; 440 subscription->permission = content_type;
439 subscription->requesting_origin = requesting_origin; 441 subscription->requesting_origin = requesting_origin;
440 subscription->embedding_origin = embedding_origin; 442 subscription->embedding_origin = embedding_origin;
441 subscription->callback = callback; 443 subscription->callback = callback;
442 444
443 subscription->current_value = 445 subscription->current_value =
444 GetPermissionStatus(permission, requesting_origin, embedding_origin); 446 GetPermissionStatus(content_type, requesting_origin, embedding_origin);
445 447
446 return subscriptions_.Add(std::move(subscription)); 448 return subscriptions_.Add(std::move(subscription));
447 } 449 }
448 450
449 void PermissionManager::UnsubscribePermissionStatusChange(int subscription_id) { 451 void PermissionManager::UnsubscribePermissionStatusChange(int subscription_id) {
450 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 452 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
451 // Whether |subscription_id| is known will be checked by the Remove() call. 453 // Whether |subscription_id| is known will be checked by the Remove() call.
452 subscriptions_.Remove(subscription_id); 454 subscriptions_.Remove(subscription_id);
453 455
454 if (subscriptions_.IsEmpty()) 456 if (subscriptions_.IsEmpty())
(...skipping 13 matching lines...) Expand all
468 ContentSettingsType content_type, 470 ContentSettingsType content_type,
469 std::string resource_identifier) { 471 std::string resource_identifier) {
470 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 472 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
471 std::list<base::Closure> callbacks; 473 std::list<base::Closure> callbacks;
472 474
473 for (SubscriptionsMap::iterator iter(&subscriptions_); 475 for (SubscriptionsMap::iterator iter(&subscriptions_);
474 !iter.IsAtEnd(); iter.Advance()) { 476 !iter.IsAtEnd(); iter.Advance()) {
475 Subscription* subscription = iter.GetCurrentValue(); 477 Subscription* subscription = iter.GetCurrentValue();
476 if (IsConstantPermission(subscription->permission)) 478 if (IsConstantPermission(subscription->permission))
477 continue; 479 continue;
478 if (PermissionTypeToContentSetting(subscription->permission) != 480 if (subscription->permission != content_type)
479 content_type) {
480 continue; 481 continue;
481 }
482 482
483 if (primary_pattern.IsValid() && 483 if (primary_pattern.IsValid() &&
484 !primary_pattern.Matches(subscription->requesting_origin)) 484 !primary_pattern.Matches(subscription->requesting_origin))
485 continue; 485 continue;
486 if (secondary_pattern.IsValid() && 486 if (secondary_pattern.IsValid() &&
487 !secondary_pattern.Matches(subscription->embedding_origin)) 487 !secondary_pattern.Matches(subscription->embedding_origin))
488 continue; 488 continue;
489 489
490 PermissionStatus new_value = GetPermissionStatus( 490 PermissionStatus new_value = GetPermissionStatus(
491 subscription->permission, subscription->requesting_origin, 491 subscription->permission, subscription->requesting_origin,
492 subscription->embedding_origin); 492 subscription->embedding_origin);
493 if (subscription->current_value == new_value) 493 if (subscription->current_value == new_value)
494 continue; 494 continue;
495 495
496 subscription->current_value = new_value; 496 subscription->current_value = new_value;
497 497
498 // Add the callback to |callbacks| which will be run after the loop to 498 // Add the callback to |callbacks| which will be run after the loop to
499 // prevent re-entrance issues. 499 // prevent re-entrance issues.
500 callbacks.push_back(base::Bind(subscription->callback, new_value)); 500 callbacks.push_back(base::Bind(subscription->callback, new_value));
501 } 501 }
502 502
503 for (const auto& callback : callbacks) 503 for (const auto& callback : callbacks)
504 callback.Run(); 504 callback.Run();
505 } 505 }
OLDNEW
« no previous file with comments | « chrome/browser/permissions/permission_manager.h ('k') | chrome/browser/permissions/permission_uma_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698