Chromium Code Reviews| Index: content/browser/permissions/permission_service_context.cc |
| diff --git a/content/browser/permissions/permission_service_context.cc b/content/browser/permissions/permission_service_context.cc |
| index a83267a0db7229421d65924cd8e2791cebfcf38a..7235e53ee8bf5e8e95b4e814d251e48bde574063 100644 |
| --- a/content/browser/permissions/permission_service_context.cc |
| +++ b/content/browser/permissions/permission_service_context.cc |
| @@ -7,13 +7,46 @@ |
| #include <utility> |
| #include "content/browser/permissions/permission_service_impl.h" |
| +#include "content/public/browser/browser_context.h" |
| #include "content/public/browser/navigation_details.h" |
| +#include "content/public/browser/permission_manager.h" |
| #include "content/public/browser/render_frame_host.h" |
| #include "content/public/browser/render_process_host.h" |
| #include "content/public/browser/web_contents.h" |
| +using blink::mojom::PermissionObserverPtr; |
| + |
| namespace content { |
| +class PermissionServiceContext::PermissionSubscription { |
| + public: |
| + PermissionSubscription(PermissionServiceContext* context, |
| + PermissionObserverPtr observer) |
| + : context_(context), observer_(std::move(observer)) {} |
| + |
| + ~PermissionSubscription() { |
| + BrowserContext* browser_context = context_->GetBrowserContext(); |
| + DCHECK(browser_context); |
| + if (browser_context->GetPermissionManager()) { |
| + browser_context->GetPermissionManager() |
| + ->UnsubscribePermissionStatusChange(id_); |
| + } |
| + } |
| + |
| + void OnConnectionError() { context_->ObserverHadConnectionError(id_); } |
| + |
| + void OnPermissionStatusChanged(blink::mojom::PermissionStatus status) { |
| + observer_->OnPermissionStatusChange(status); |
| + } |
| + |
| + void set_id(int id) { id_ = id; } |
| + |
| + private: |
| + PermissionServiceContext* context_; |
| + PermissionObserverPtr observer_; |
| + int id_; |
|
mlamouri (slow - plz ping)
2016/12/19 13:37:45
What's `id_` initial value? Please set a value her
Reilly Grant (use Gerrit)
2016/12/19 22:23:59
Done.
|
| +}; |
| + |
| PermissionServiceContext::PermissionServiceContext( |
| RenderFrameHost* render_frame_host) |
| : WebContentsObserver(WebContents::FromRenderFrameHost(render_frame_host)), |
| @@ -33,16 +66,51 @@ PermissionServiceContext::~PermissionServiceContext() { |
| void PermissionServiceContext::CreateService( |
| mojo::InterfaceRequest<blink::mojom::PermissionService> request) { |
| - services_.push_back(new PermissionServiceImpl(this, std::move(request))); |
| + services_.push_back( |
| + base::MakeUnique<PermissionServiceImpl>(this, std::move(request))); |
| +} |
| + |
| +void PermissionServiceContext::CreateSubscription( |
| + PermissionType permission_type, |
| + const url::Origin& origin, |
| + PermissionObserverPtr observer) { |
| + BrowserContext* browser_context = GetBrowserContext(); |
| + DCHECK(browser_context); |
| + if (!browser_context->GetPermissionManager()) |
| + return; |
| + |
| + auto subscription = |
| + base::MakeUnique<PermissionSubscription>(this, std::move(observer)); |
| + GURL requesting_origin(origin.Serialize()); |
| + GURL embedding_origin = GetEmbeddingOrigin(); |
| + int subscription_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(&PermissionSubscription::OnPermissionStatusChanged, |
| + base::Unretained(subscription.get()))); |
| + subscription->set_id(subscription_id); |
| + subscriptions_[subscription_id] = std::move(subscription); |
| } |
| void PermissionServiceContext::ServiceHadConnectionError( |
| PermissionServiceImpl* service) { |
| - auto it = std::find(services_.begin(), services_.end(), service); |
| + auto it = std::find_if( |
| + services_.begin(), services_.end(), |
| + [service](const std::unique_ptr<PermissionServiceImpl>& this_service) { |
| + return service == this_service.get(); |
| + }); |
| DCHECK(it != services_.end()); |
| services_.erase(it); |
| } |
| +void PermissionServiceContext::ObserverHadConnectionError(int subscription_id) { |
| + auto it = subscriptions_.find(subscription_id); |
| + DCHECK(it != subscriptions_.end()); |
| + subscriptions_.erase(it); |
| +} |
| + |
| void PermissionServiceContext::RenderFrameHostChanged( |
| RenderFrameHost* old_host, |
| RenderFrameHost* new_host) { |
| @@ -70,7 +138,7 @@ void PermissionServiceContext::CancelPendingOperations( |
| if (render_frame_host != render_frame_host_) |
| return; |
| - for (auto* service : services_) |
| + for (const auto& service : services_) |
|
mlamouri (slow - plz ping)
2016/12/19 13:37:45
why?
Reilly Grant (use Gerrit)
2016/12/19 22:23:59
services_ changed from a ScopedVector to a std::ve
|
| service->CancelPendingOperations(); |
| } |