| 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_;
|
| +};
|
| +
|
| 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_)
|
| service->CancelPendingOperations();
|
| }
|
|
|
|
|