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

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

Issue 1726323002: Have Permission{Manager,Service} use Origin. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. 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/content_settings/host_content_settings_map_factory.h" 11 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
12 #include "chrome/browser/permissions/permission_context.h" 12 #include "chrome/browser/permissions/permission_context.h"
13 #include "chrome/browser/permissions/permission_context_base.h" 13 #include "chrome/browser/permissions/permission_context_base.h"
14 #include "chrome/browser/permissions/permission_request_id.h" 14 #include "chrome/browser/permissions/permission_request_id.h"
15 #include "chrome/browser/profiles/profile.h" 15 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/browser/tab_contents/tab_util.h" 16 #include "chrome/browser/tab_contents/tab_util.h"
17 #include "components/content_settings/core/browser/host_content_settings_map.h" 17 #include "components/content_settings/core/browser/host_content_settings_map.h"
18 #include "content/public/browser/permission_type.h" 18 #include "content/public/browser/permission_type.h"
19 #include "content/public/browser/render_frame_host.h" 19 #include "content/public/browser/render_frame_host.h"
20 #include "content/public/browser/render_process_host.h" 20 #include "content/public/browser/render_process_host.h"
21 #include "content/public/browser/web_contents.h" 21 #include "content/public/browser/web_contents.h"
22 #include "url/origin.h"
22 23
23 #if !defined(OS_ANDROID) 24 #if !defined(OS_ANDROID)
24 #include "chrome/browser/ui/website_settings/permission_bubble_manager.h" 25 #include "chrome/browser/ui/website_settings/permission_bubble_manager.h"
25 #endif 26 #endif
26 27
27 using content::mojom::PermissionStatus; 28 using content::mojom::PermissionStatus;
28 using content::PermissionType; 29 using content::PermissionType;
29 30
30 namespace { 31 namespace {
31 32
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 int render_process_id_; 183 int render_process_id_;
183 int render_frame_id_; 184 int render_frame_id_;
184 const base::Callback<void(const std::vector<PermissionStatus>&)> callback_; 185 const base::Callback<void(const std::vector<PermissionStatus>&)> callback_;
185 std::vector<PermissionType> permissions_; 186 std::vector<PermissionType> permissions_;
186 std::vector<PermissionStatus> results_; 187 std::vector<PermissionStatus> results_;
187 size_t remaining_results_; 188 size_t remaining_results_;
188 }; 189 };
189 190
190 struct PermissionManager::Subscription { 191 struct PermissionManager::Subscription {
191 PermissionType permission; 192 PermissionType permission;
192 GURL requesting_origin; 193 url::Origin requesting_origin;
193 GURL embedding_origin; 194 url::Origin embedding_origin;
194 base::Callback<void(PermissionStatus)> callback; 195 base::Callback<void(PermissionStatus)> callback;
195 ContentSetting current_value; 196 ContentSetting current_value;
196 }; 197 };
197 198
198 PermissionManager::PermissionManager(Profile* profile) 199 PermissionManager::PermissionManager(Profile* profile)
199 : profile_(profile), 200 : profile_(profile),
200 weak_ptr_factory_(this) { 201 weak_ptr_factory_(this) {
201 } 202 }
202 203
203 PermissionManager::~PermissionManager() { 204 PermissionManager::~PermissionManager() {
204 if (!subscriptions_.IsEmpty()) 205 if (!subscriptions_.IsEmpty())
205 HostContentSettingsMapFactory::GetForProfile(profile_) 206 HostContentSettingsMapFactory::GetForProfile(profile_)
206 ->RemoveObserver(this); 207 ->RemoveObserver(this);
207 } 208 }
208 209
209 int PermissionManager::RequestPermission( 210 int PermissionManager::RequestPermission(
210 PermissionType permission, 211 PermissionType permission,
211 content::RenderFrameHost* render_frame_host, 212 content::RenderFrameHost* render_frame_host,
212 const GURL& requesting_origin, 213 const url::Origin& requesting_origin,
213 const base::Callback<void(PermissionStatus)>& callback) { 214 const base::Callback<void(PermissionStatus)>& callback) {
214 return RequestPermissions( 215 return RequestPermissions(
215 std::vector<PermissionType>(1, permission), 216 std::vector<PermissionType>(1, permission),
216 render_frame_host, 217 render_frame_host,
217 requesting_origin, 218 requesting_origin,
218 base::Bind(&PermissionRequestResponseCallbackWrapper, callback)); 219 base::Bind(&PermissionRequestResponseCallbackWrapper, callback));
219 } 220 }
220 221
221 int PermissionManager::RequestPermissions( 222 int PermissionManager::RequestPermissions(
222 const std::vector<PermissionType>& permissions, 223 const std::vector<PermissionType>& permissions,
223 content::RenderFrameHost* render_frame_host, 224 content::RenderFrameHost* render_frame_host,
224 const GURL& requesting_origin, 225 const url::Origin& requesting_origin,
225 const base::Callback<void( 226 const base::Callback<void(const std::vector<PermissionStatus>&)>&
226 const std::vector<PermissionStatus>&)>& callback) { 227 callback) {
227 if (permissions.empty()) { 228 if (permissions.empty()) {
228 callback.Run(std::vector<PermissionStatus>()); 229 callback.Run(std::vector<PermissionStatus>());
229 return kNoPendingOperation; 230 return kNoPendingOperation;
230 } 231 }
231 232
232 content::WebContents* web_contents = 233 content::WebContents* web_contents =
233 content::WebContents::FromRenderFrameHost(render_frame_host); 234 content::WebContents::FromRenderFrameHost(render_frame_host);
234 GURL embedding_origin = web_contents->GetLastCommittedURL().GetOrigin(); 235 const url::Origin embedding_origin(web_contents->GetLastCommittedURL());
235 236
236 PendingRequest* pending_request = new PendingRequest( 237 PendingRequest* pending_request = new PendingRequest(
237 render_frame_host, permissions, callback); 238 render_frame_host, permissions, callback);
238 int request_id = pending_requests_.Add(pending_request); 239 int request_id = pending_requests_.Add(pending_request);
239 240
240 const PermissionRequestID request(render_frame_host, request_id); 241 const PermissionRequestID request(render_frame_host, request_id);
241 242
242 for (size_t i = 0; i < permissions.size(); ++i) { 243 for (size_t i = 0; i < permissions.size(); ++i) {
243 const PermissionType permission = permissions[i]; 244 const PermissionType permission = permissions[i];
244 245
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 PermissionContextBase* context = PermissionContext::Get( 301 PermissionContextBase* context = PermissionContext::Get(
301 profile_, permission); 302 profile_, permission);
302 if (!context) 303 if (!context)
303 continue; 304 continue;
304 context->CancelPermissionRequest(web_contents, request); 305 context->CancelPermissionRequest(web_contents, request);
305 } 306 }
306 pending_requests_.Remove(request_id); 307 pending_requests_.Remove(request_id);
307 } 308 }
308 309
309 void PermissionManager::ResetPermission(PermissionType permission, 310 void PermissionManager::ResetPermission(PermissionType permission,
310 const GURL& requesting_origin, 311 const url::Origin& requesting_origin,
311 const GURL& embedding_origin) { 312 const url::Origin& embedding_origin) {
312 PermissionContextBase* context = PermissionContext::Get(profile_, permission); 313 PermissionContextBase* context = PermissionContext::Get(profile_, permission);
313 if (!context) 314 if (!context)
314 return; 315 return;
315 316
316 context->ResetPermission(requesting_origin.GetOrigin(), 317 context->ResetPermission(requesting_origin, embedding_origin);
317 embedding_origin.GetOrigin());
318 } 318 }
319 319
320 PermissionStatus PermissionManager::GetPermissionStatus( 320 PermissionStatus PermissionManager::GetPermissionStatus(
321 PermissionType permission, 321 PermissionType permission,
322 const GURL& requesting_origin, 322 const url::Origin& requesting_origin,
323 const GURL& embedding_origin) { 323 const url::Origin& embedding_origin) {
324 if (IsConstantPermission(permission)) 324 if (IsConstantPermission(permission))
325 return GetPermissionStatusForConstantPermission(permission); 325 return GetPermissionStatusForConstantPermission(permission);
326 326
327 PermissionContextBase* context = PermissionContext::Get(profile_, permission); 327 PermissionContextBase* context = PermissionContext::Get(profile_, permission);
328 if (!context) 328 if (!context)
329 return content::mojom::PermissionStatus::DENIED; 329 return content::mojom::PermissionStatus::DENIED;
330 330
331 return ContentSettingToPermissionStatus(context->GetPermissionStatus( 331 return ContentSettingToPermissionStatus(
332 requesting_origin.GetOrigin(), embedding_origin.GetOrigin())); 332 context->GetPermissionStatus(requesting_origin, embedding_origin));
333 } 333 }
334 334
335 void PermissionManager::RegisterPermissionUsage(PermissionType permission, 335 void PermissionManager::RegisterPermissionUsage(
336 const GURL& requesting_origin, 336 PermissionType permission,
337 const GURL& embedding_origin) { 337 const url::Origin& requesting_origin,
338 const url::Origin& embedding_origin) {
338 // This is required because constant permissions don't have a 339 // This is required because constant permissions don't have a
339 // ContentSettingsType. 340 // ContentSettingsType.
340 if (IsConstantPermission(permission)) 341 if (IsConstantPermission(permission))
341 return; 342 return;
342 343
343 HostContentSettingsMapFactory::GetForProfile(profile_)->UpdateLastUsage( 344 HostContentSettingsMapFactory::GetForProfile(profile_)->UpdateLastUsage(
344 requesting_origin, 345 GURL(requesting_origin.Serialize()), GURL(embedding_origin.Serialize()),
345 embedding_origin,
346 PermissionTypeToContentSetting(permission)); 346 PermissionTypeToContentSetting(permission));
347 } 347 }
348 348
349 int PermissionManager::SubscribePermissionStatusChange( 349 int PermissionManager::SubscribePermissionStatusChange(
350 PermissionType permission, 350 PermissionType permission,
351 const GURL& requesting_origin, 351 const url::Origin& requesting_origin,
352 const GURL& embedding_origin, 352 const url::Origin& embedding_origin,
353 const base::Callback<void(PermissionStatus)>& callback) { 353 const base::Callback<void(PermissionStatus)>& callback) {
354 if (subscriptions_.IsEmpty()) 354 if (subscriptions_.IsEmpty())
355 HostContentSettingsMapFactory::GetForProfile(profile_)->AddObserver(this); 355 HostContentSettingsMapFactory::GetForProfile(profile_)->AddObserver(this);
356 356
357 Subscription* subscription = new Subscription(); 357 Subscription* subscription = new Subscription();
358 subscription->permission = permission; 358 subscription->permission = permission;
359 subscription->requesting_origin = requesting_origin; 359 subscription->requesting_origin = requesting_origin;
360 subscription->embedding_origin = embedding_origin; 360 subscription->embedding_origin = embedding_origin;
361 subscription->callback = callback; 361 subscription->callback = callback;
362 362
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 397
398 for (SubscriptionsMap::iterator iter(&subscriptions_); 398 for (SubscriptionsMap::iterator iter(&subscriptions_);
399 !iter.IsAtEnd(); iter.Advance()) { 399 !iter.IsAtEnd(); iter.Advance()) {
400 Subscription* subscription = iter.GetCurrentValue(); 400 Subscription* subscription = iter.GetCurrentValue();
401 if (PermissionTypeToContentSetting(subscription->permission) != 401 if (PermissionTypeToContentSetting(subscription->permission) !=
402 content_type) { 402 content_type) {
403 continue; 403 continue;
404 } 404 }
405 405
406 if (primary_pattern.IsValid() && 406 if (primary_pattern.IsValid() &&
407 !primary_pattern.Matches(subscription->requesting_origin)) 407 !primary_pattern.Matches(
408 GURL(subscription->requesting_origin.Serialize()))) {
408 continue; 409 continue;
410 }
409 if (secondary_pattern.IsValid() && 411 if (secondary_pattern.IsValid() &&
410 !secondary_pattern.Matches(subscription->embedding_origin)) 412 !secondary_pattern.Matches(
413 GURL(subscription->embedding_origin.Serialize()))) {
411 continue; 414 continue;
415 }
412 416
413 ContentSetting new_value = 417 ContentSetting new_value =
414 PermissionContext::Get(profile_, subscription->permission) 418 PermissionContext::Get(profile_, subscription->permission)
415 ->GetPermissionStatus(subscription->requesting_origin, 419 ->GetPermissionStatus(subscription->requesting_origin,
416 subscription->embedding_origin); 420 subscription->embedding_origin);
417 if (subscription->current_value == new_value) 421 if (subscription->current_value == new_value)
418 continue; 422 continue;
419 423
420 subscription->current_value = new_value; 424 subscription->current_value = new_value;
421 425
422 // Add the callback to |callbacks| which will be run after the loop to 426 // Add the callback to |callbacks| which will be run after the loop to
423 // prevent re-entrance issues. 427 // prevent re-entrance issues.
424 callbacks.push_back( 428 callbacks.push_back(
425 base::Bind(subscription->callback, 429 base::Bind(subscription->callback,
426 ContentSettingToPermissionStatus(new_value))); 430 ContentSettingToPermissionStatus(new_value)));
427 } 431 }
428 432
429 for (const auto& callback : callbacks) 433 for (const auto& callback : callbacks)
430 callback.Run(); 434 callback.Run();
431 } 435 }
OLDNEW
« no previous file with comments | « chrome/browser/permissions/permission_manager.h ('k') | chrome/browser/permissions/permission_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698