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(); |
} |