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

Unified Diff: content/public/browser/pepper_vpn_provider_service_helper.cc

Issue 1988613005: ppapi: PPB_VpnProvider: Implement Service Helper (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@vpn-permission
Patch Set: Created 4 years, 7 months 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/public/browser/pepper_vpn_provider_service_helper.cc
diff --git a/content/public/browser/pepper_vpn_provider_service_helper.cc b/content/public/browser/pepper_vpn_provider_service_helper.cc
new file mode 100644
index 0000000000000000000000000000000000000000..a6099e07f711f9e2f8a0e71fe978112855168bf7
--- /dev/null
+++ b/content/public/browser/pepper_vpn_provider_service_helper.cc
@@ -0,0 +1,147 @@
+
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/public/browser/pepper_vpn_provider_service_helper.h"
+
+#include "base/memory/singleton.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/render_process_host.h"
+
+namespace content {
+
+VpnMessageFilterDelegate::~VpnMessageFilterDelegate() {}
+
+VpnServiceDelegate::~VpnServiceDelegate() {}
+
+VpnProviderServiceHelper::VpnProviderServiceHelper() : weak_factory_(this) {}
+
+VpnProviderServiceHelper::~VpnProviderServiceHelper() {}
+
+// static
+VpnProviderServiceHelper* VpnProviderServiceHelper::GetInstance() {
+ return base::Singleton<VpnProviderServiceHelper>::get();
+}
+
+void VpnProviderServiceHelper::OnPacketReceivedIO(
+ const std::string& extension_id,
+ const std::vector<char>& data) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+
+ if (extension_to_host_map_.find(extension_id) ==
+ extension_to_host_map_.end()) {
+ NOTREACHED();
+ return;
+ }
+
+ extension_to_host_map_[extension_id]->SendOnPacketReceived(data);
+}
+
+void VpnProviderServiceHelper::OnUnbindIO(const std::string& extension_id) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+
+ if (extension_to_host_map_.find(extension_id) ==
+ extension_to_host_map_.end()) {
+ NOTREACHED();
+ return;
+ }
+
+ extension_to_host_map_[extension_id]->SendOnUnbind();
+}
+
+void VpnProviderServiceHelper::RegisterDelegate(
+ const std::string& extension_id,
+ std::unique_ptr<VpnMessageFilterDelegate> delegate) {
+ extension_to_host_map_[extension_id] = std::move(delegate);
+}
+
+void VpnProviderServiceHelper::RegisterDelegate(
+ content::BrowserContext* context,
+ std::unique_ptr<VpnServiceDelegate> delegate) {
+ context_to_service_map_[context] = std::move(delegate);
+}
+
+void VpnProviderServiceHelper::Bind(const std::string& extension_id,
+ const std::string& configuration_id,
+ const std::string& configuration_name,
+ int render_process_id,
+ const SuccessCallback& success,
+ const FailureCallback& failure) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+ content::RenderProcessHost* render_process_host =
+ content::RenderProcessHost::FromID(render_process_id);
+ if (render_process_host == NULL) {
+ NOTREACHED();
+ return;
+ }
+ content::BrowserContext* context = render_process_host->GetBrowserContext();
+ if (context == NULL) {
+ NOTREACHED();
+ return;
+ }
+ if (context_to_service_map_.find(context) == context_to_service_map_.end()) {
+ NOTREACHED();
+ return;
+ }
+ if (extension_to_host_map_.find(extension_id) ==
+ extension_to_host_map_.end()) {
+ NOTREACHED();
+ return;
+ }
+
+ context_to_service_map_[context]->Bind(extension_id, configuration_id,
+ configuration_name, success, failure);
+}
+
+void VpnProviderServiceHelper::OnUnbind(const std::string& extension_id) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+ content::BrowserThread::PostTask(
+ content::BrowserThread::IO, FROM_HERE,
+ base::Bind(&VpnProviderServiceHelper::OnUnbindIO,
+ weak_factory_.GetWeakPtr(), extension_id));
+}
+
+void VpnProviderServiceHelper::SendPacket(const std::string& extension_id,
+ const std::vector<char>& data,
+ int render_process_id,
+ SuccessCallback success,
+ FailureCallback failure) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+ content::RenderProcessHost* render_process_host =
+ content::RenderProcessHost::FromID(render_process_id);
+ if (render_process_host == NULL) {
+ NOTREACHED();
+ return;
+ }
+
+ content::BrowserContext* context = render_process_host->GetBrowserContext();
+ if (context == NULL) {
+ NOTREACHED();
+ return;
+ }
+
+ if (context_to_service_map_.find(context) == context_to_service_map_.end()) {
+ NOTREACHED();
+ return;
+ }
+
+ context_to_service_map_[context]->SendPacket(extension_id, data, success,
+ failure);
+}
+
+void VpnProviderServiceHelper::OnPacketReceived(const std::string& extension_id,
+ const std::vector<char>& data) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ // TODO(adrian.belgun):
+ // Possile optimization: Handle packets only on UI thread (3)
+ content::BrowserThread::PostTask(
+ content::BrowserThread::IO, FROM_HERE,
+ base::Bind(&VpnProviderServiceHelper::OnPacketReceivedIO,
+ weak_factory_.GetWeakPtr(), extension_id, data));
+}
+
+} // namespace content

Powered by Google App Engine
This is Rietveld 408576698