Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(665)

Unified Diff: content/browser/permissions/permission_service_context.cc

Issue 2573573002: Switch PermissionStatus events to an observer model. (Closed)
Patch Set: Remove call to registerPreFinalizer(). Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
}

Powered by Google App Engine
This is Rietveld 408576698