Index: content/browser/permissions/permission_service_impl.cc |
diff --git a/content/browser/permissions/permission_service_impl.cc b/content/browser/permissions/permission_service_impl.cc |
index 44851b7a597304e0db480de47bd3c4fd66c41a5a..75e8a6cd942f2008e8a579cf8feadd617a5b9d12 100644 |
--- a/content/browser/permissions/permission_service_impl.cc |
+++ b/content/browser/permissions/permission_service_impl.cc |
@@ -17,6 +17,7 @@ |
using blink::mojom::PermissionDescriptorPtr; |
using blink::mojom::PermissionName; |
+using blink::mojom::PermissionObserverPtr; |
using blink::mojom::PermissionStatus; |
namespace content { |
@@ -81,17 +82,6 @@ PermissionServiceImpl::PendingRequest::~PendingRequest() { |
callback.Run(result); |
} |
-PermissionServiceImpl::PendingSubscription::PendingSubscription( |
- PermissionType permission, |
- const url::Origin& origin, |
- const PermissionStatusCallback& callback) |
- : id(-1), permission(permission), origin(origin), callback(callback) {} |
- |
-PermissionServiceImpl::PendingSubscription::~PendingSubscription() { |
- if (!callback.is_null()) |
- callback.Run(PermissionStatus::ASK); |
-} |
- |
PermissionServiceImpl::PermissionServiceImpl( |
PermissionServiceContext* context, |
mojo::InterfaceRequest<blink::mojom::PermissionService> request) |
@@ -226,17 +216,6 @@ void PermissionServiceImpl::CancelPendingOperations() { |
it.GetCurrentValue()->id); |
} |
pending_requests_.Clear(); |
- |
- // Cancel pending subscriptions. |
- for (SubscriptionsMap::Iterator<PendingSubscription> |
- it(&pending_subscriptions_); !it.IsAtEnd(); it.Advance()) { |
- it.GetCurrentValue()->callback.Run(GetPermissionStatusFromType( |
- it.GetCurrentValue()->permission, it.GetCurrentValue()->origin)); |
- it.GetCurrentValue()->callback.Reset(); |
- permission_manager->UnsubscribePermissionStatusChange( |
- it.GetCurrentValue()->id); |
- } |
- pending_subscriptions_.Clear(); |
} |
void PermissionServiceImpl::HasPermission( |
@@ -267,45 +246,24 @@ void PermissionServiceImpl::RevokePermission( |
callback.Run(GetPermissionStatusFromType(permission_type, origin)); |
} |
-void PermissionServiceImpl::GetNextPermissionChange( |
+void PermissionServiceImpl::AddPermissionObserver( |
PermissionDescriptorPtr permission, |
const url::Origin& origin, |
PermissionStatus last_known_status, |
- const PermissionStatusCallback& callback) { |
+ PermissionObserverPtr observer) { |
PermissionStatus current_status = GetPermissionStatus(permission, origin); |
if (current_status != last_known_status) { |
- callback.Run(current_status); |
- return; |
+ observer->OnPermissionStatusChange(current_status); |
+ last_known_status = current_status; |
} |
BrowserContext* browser_context = context_->GetBrowserContext(); |
DCHECK(browser_context); |
- if (!browser_context->GetPermissionManager()) { |
- callback.Run(current_status); |
+ if (!browser_context->GetPermissionManager()) |
return; |
- } |
- |
- PermissionType permission_type = |
- PermissionDescriptorToPermissionType(permission); |
- // We need to pass the id of PendingSubscription in pending_subscriptions_ |
- // to the callback but SubscribePermissionStatusChange() will also return an |
- // id which is different. |
- auto subscription = |
- base::MakeUnique<PendingSubscription>(permission_type, origin, callback); |
- PendingSubscription* subscription_raw = subscription.get(); |
- int pending_subscription_id = |
- pending_subscriptions_.Add(std::move(subscription)); |
- |
- GURL requesting_origin(origin.Serialize()); |
- GURL embedding_origin = context_->GetEmbeddingOrigin(); |
- subscription_raw->id = |
- browser_context->GetPermissionManager()->SubscribePermissionStatusChange( |
- permission_type, requesting_origin, |
- // If the embedding_origin is empty, we,ll use the |origin| instead. |
- embedding_origin.is_empty() ? requesting_origin : embedding_origin, |
- base::Bind(&PermissionServiceImpl::OnPermissionStatusChanged, |
- weak_factory_.GetWeakPtr(), pending_subscription_id)); |
+ context_->CreateSubscription(PermissionDescriptorToPermissionType(permission), |
+ origin, std::move(observer)); |
} |
PermissionStatus PermissionServiceImpl::GetPermissionStatus( |
@@ -346,25 +304,4 @@ void PermissionServiceImpl::ResetPermissionStatus(PermissionType type, |
embedding_origin.is_empty() ? requesting_origin : embedding_origin); |
} |
-void PermissionServiceImpl::OnPermissionStatusChanged( |
- int pending_subscription_id, |
- PermissionStatus status) { |
- PendingSubscription* subscription = |
- pending_subscriptions_.Lookup(pending_subscription_id); |
- |
- BrowserContext* browser_context = context_->GetBrowserContext(); |
- DCHECK(browser_context); |
- if (browser_context->GetPermissionManager()) { |
- browser_context->GetPermissionManager()->UnsubscribePermissionStatusChange( |
- subscription->id); |
- } |
- |
- PermissionStatusCallback callback = subscription->callback; |
- |
- subscription->callback.Reset(); |
- pending_subscriptions_.Remove(pending_subscription_id); |
- |
- callback.Run(status); |
-} |
- |
} // namespace content |