OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |