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

Side by Side Diff: content/browser/permissions/permission_service_impl.cc

Issue 2573573002: Switch PermissionStatus events to an observer model. (Closed)
Patch Set: Rebased. Created 3 years, 11 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "content/browser/permissions/permission_service_impl.h" 5 #include "content/browser/permissions/permission_service_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <utility> 10 #include <utility>
11 11
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
14 #include "content/public/browser/browser_context.h" 14 #include "content/public/browser/browser_context.h"
15 #include "content/public/browser/permission_manager.h" 15 #include "content/public/browser/permission_manager.h"
16 #include "content/public/browser/permission_type.h" 16 #include "content/public/browser/permission_type.h"
17 17
18 using blink::mojom::PermissionDescriptorPtr; 18 using blink::mojom::PermissionDescriptorPtr;
19 using blink::mojom::PermissionName; 19 using blink::mojom::PermissionName;
20 using blink::mojom::PermissionObserverPtr;
20 using blink::mojom::PermissionStatus; 21 using blink::mojom::PermissionStatus;
21 22
22 namespace content { 23 namespace content {
23 24
24 namespace { 25 namespace {
25 26
26 PermissionType PermissionDescriptorToPermissionType( 27 PermissionType PermissionDescriptorToPermissionType(
27 const PermissionDescriptorPtr& descriptor) { 28 const PermissionDescriptorPtr& descriptor) {
28 switch (descriptor->name) { 29 switch (descriptor->name) {
29 case PermissionName::GEOLOCATION: 30 case PermissionName::GEOLOCATION:
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 } 75 }
75 76
76 PermissionServiceImpl::PendingRequest::~PendingRequest() { 77 PermissionServiceImpl::PendingRequest::~PendingRequest() {
77 if (callback.is_null()) 78 if (callback.is_null())
78 return; 79 return;
79 80
80 std::vector<PermissionStatus> result(request_count, PermissionStatus::DENIED); 81 std::vector<PermissionStatus> result(request_count, PermissionStatus::DENIED);
81 callback.Run(result); 82 callback.Run(result);
82 } 83 }
83 84
84 PermissionServiceImpl::PendingSubscription::PendingSubscription(
85 PermissionType permission,
86 const url::Origin& origin,
87 const PermissionStatusCallback& callback)
88 : id(-1), permission(permission), origin(origin), callback(callback) {}
89
90 PermissionServiceImpl::PendingSubscription::~PendingSubscription() {
91 if (!callback.is_null())
92 callback.Run(PermissionStatus::ASK);
93 }
94
95 PermissionServiceImpl::PermissionServiceImpl( 85 PermissionServiceImpl::PermissionServiceImpl(
96 PermissionServiceContext* context, 86 PermissionServiceContext* context,
97 mojo::InterfaceRequest<blink::mojom::PermissionService> request) 87 mojo::InterfaceRequest<blink::mojom::PermissionService> request)
98 : context_(context), 88 : context_(context),
99 binding_(this, std::move(request)), 89 binding_(this, std::move(request)),
100 weak_factory_(this) { 90 weak_factory_(this) {
101 binding_.set_connection_error_handler( 91 binding_.set_connection_error_handler(
102 base::Bind(&PermissionServiceImpl::OnConnectionError, 92 base::Bind(&PermissionServiceImpl::OnConnectionError,
103 base::Unretained(this))); 93 base::Unretained(this)));
104 } 94 }
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 if (!permission_manager) 209 if (!permission_manager)
220 return; 210 return;
221 211
222 // Cancel pending requests. 212 // Cancel pending requests.
223 for (RequestsMap::Iterator<PendingRequest> it(&pending_requests_); 213 for (RequestsMap::Iterator<PendingRequest> it(&pending_requests_);
224 !it.IsAtEnd(); it.Advance()) { 214 !it.IsAtEnd(); it.Advance()) {
225 permission_manager->CancelPermissionRequest( 215 permission_manager->CancelPermissionRequest(
226 it.GetCurrentValue()->id); 216 it.GetCurrentValue()->id);
227 } 217 }
228 pending_requests_.Clear(); 218 pending_requests_.Clear();
229
230 // Cancel pending subscriptions.
231 for (SubscriptionsMap::Iterator<PendingSubscription>
232 it(&pending_subscriptions_); !it.IsAtEnd(); it.Advance()) {
233 it.GetCurrentValue()->callback.Run(GetPermissionStatusFromType(
234 it.GetCurrentValue()->permission, it.GetCurrentValue()->origin));
235 it.GetCurrentValue()->callback.Reset();
236 permission_manager->UnsubscribePermissionStatusChange(
237 it.GetCurrentValue()->id);
238 }
239 pending_subscriptions_.Clear();
240 } 219 }
241 220
242 void PermissionServiceImpl::HasPermission( 221 void PermissionServiceImpl::HasPermission(
243 PermissionDescriptorPtr permission, 222 PermissionDescriptorPtr permission,
244 const url::Origin& origin, 223 const url::Origin& origin,
245 const PermissionStatusCallback& callback) { 224 const PermissionStatusCallback& callback) {
246 callback.Run(GetPermissionStatus(permission, origin)); 225 callback.Run(GetPermissionStatus(permission, origin));
247 } 226 }
248 227
249 void PermissionServiceImpl::RevokePermission( 228 void PermissionServiceImpl::RevokePermission(
(...skipping 10 matching lines...) Expand all
260 if (status != PermissionStatus::GRANTED) { 239 if (status != PermissionStatus::GRANTED) {
261 callback.Run(status); 240 callback.Run(status);
262 return; 241 return;
263 } 242 }
264 243
265 ResetPermissionStatus(permission_type, origin); 244 ResetPermissionStatus(permission_type, origin);
266 245
267 callback.Run(GetPermissionStatusFromType(permission_type, origin)); 246 callback.Run(GetPermissionStatusFromType(permission_type, origin));
268 } 247 }
269 248
270 void PermissionServiceImpl::GetNextPermissionChange( 249 void PermissionServiceImpl::AddPermissionObserver(
271 PermissionDescriptorPtr permission, 250 PermissionDescriptorPtr permission,
272 const url::Origin& origin, 251 const url::Origin& origin,
273 PermissionStatus last_known_status, 252 PermissionStatus last_known_status,
274 const PermissionStatusCallback& callback) { 253 PermissionObserverPtr observer) {
275 PermissionStatus current_status = GetPermissionStatus(permission, origin); 254 PermissionStatus current_status = GetPermissionStatus(permission, origin);
276 if (current_status != last_known_status) { 255 if (current_status != last_known_status) {
277 callback.Run(current_status); 256 observer->OnPermissionStatusChange(current_status);
278 return; 257 last_known_status = current_status;
279 } 258 }
280 259
281 BrowserContext* browser_context = context_->GetBrowserContext(); 260 BrowserContext* browser_context = context_->GetBrowserContext();
282 DCHECK(browser_context); 261 DCHECK(browser_context);
283 if (!browser_context->GetPermissionManager()) { 262 if (!browser_context->GetPermissionManager())
284 callback.Run(current_status);
285 return; 263 return;
286 }
287 264
288 PermissionType permission_type = 265 context_->CreateSubscription(PermissionDescriptorToPermissionType(permission),
289 PermissionDescriptorToPermissionType(permission); 266 origin, std::move(observer));
290
291 // We need to pass the id of PendingSubscription in pending_subscriptions_
292 // to the callback but SubscribePermissionStatusChange() will also return an
293 // id which is different.
294 auto subscription =
295 base::MakeUnique<PendingSubscription>(permission_type, origin, callback);
296 PendingSubscription* subscription_raw = subscription.get();
297 int pending_subscription_id =
298 pending_subscriptions_.Add(std::move(subscription));
299
300 GURL requesting_origin(origin.Serialize());
301 GURL embedding_origin = context_->GetEmbeddingOrigin();
302 subscription_raw->id =
303 browser_context->GetPermissionManager()->SubscribePermissionStatusChange(
304 permission_type, requesting_origin,
305 // If the embedding_origin is empty, we,ll use the |origin| instead.
306 embedding_origin.is_empty() ? requesting_origin : embedding_origin,
307 base::Bind(&PermissionServiceImpl::OnPermissionStatusChanged,
308 weak_factory_.GetWeakPtr(), pending_subscription_id));
309 } 267 }
310 268
311 PermissionStatus PermissionServiceImpl::GetPermissionStatus( 269 PermissionStatus PermissionServiceImpl::GetPermissionStatus(
312 const PermissionDescriptorPtr& permission, 270 const PermissionDescriptorPtr& permission,
313 const url::Origin& origin) { 271 const url::Origin& origin) {
314 return GetPermissionStatusFromType( 272 return GetPermissionStatusFromType(
315 PermissionDescriptorToPermissionType(permission), origin); 273 PermissionDescriptorToPermissionType(permission), origin);
316 } 274 }
317 275
318 PermissionStatus PermissionServiceImpl::GetPermissionStatusFromType( 276 PermissionStatus PermissionServiceImpl::GetPermissionStatusFromType(
(...skipping 20 matching lines...) Expand all
339 return; 297 return;
340 298
341 GURL requesting_origin(origin.Serialize()); 299 GURL requesting_origin(origin.Serialize());
342 // If the embedding_origin is empty we'll use |origin| instead. 300 // If the embedding_origin is empty we'll use |origin| instead.
343 GURL embedding_origin = context_->GetEmbeddingOrigin(); 301 GURL embedding_origin = context_->GetEmbeddingOrigin();
344 browser_context->GetPermissionManager()->ResetPermission( 302 browser_context->GetPermissionManager()->ResetPermission(
345 type, requesting_origin, 303 type, requesting_origin,
346 embedding_origin.is_empty() ? requesting_origin : embedding_origin); 304 embedding_origin.is_empty() ? requesting_origin : embedding_origin);
347 } 305 }
348 306
349 void PermissionServiceImpl::OnPermissionStatusChanged(
350 int pending_subscription_id,
351 PermissionStatus status) {
352 PendingSubscription* subscription =
353 pending_subscriptions_.Lookup(pending_subscription_id);
354
355 BrowserContext* browser_context = context_->GetBrowserContext();
356 DCHECK(browser_context);
357 if (browser_context->GetPermissionManager()) {
358 browser_context->GetPermissionManager()->UnsubscribePermissionStatusChange(
359 subscription->id);
360 }
361
362 PermissionStatusCallback callback = subscription->callback;
363
364 subscription->callback.Reset();
365 pending_subscriptions_.Remove(pending_subscription_id);
366
367 callback.Run(status);
368 }
369
370 } // namespace content 307 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/permissions/permission_service_impl.h ('k') | third_party/WebKit/Source/modules/permissions/DEPS » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698