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

Unified Diff: extensions/browser/api/networking_private/networking_private_event_router_chromeos.cc

Issue 1283613005: Add networkingPrivate.getThirdPartyVpnProviderList (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@issue_515987_cr_network_list
Patch Set: Rebase Created 5 years, 4 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: extensions/browser/api/networking_private/networking_private_event_router_chromeos.cc
diff --git a/extensions/browser/api/networking_private/networking_private_event_router_chromeos.cc b/extensions/browser/api/networking_private/networking_private_event_router_chromeos.cc
index dbe8073974298c8154c6f06187fd0386dfd74404..325b481baa9e47ab2fb87c854fe953c2cb439023 100644
--- a/extensions/browser/api/networking_private/networking_private_event_router_chromeos.cc
+++ b/extensions/browser/api/networking_private/networking_private_event_router_chromeos.cc
@@ -17,8 +17,13 @@
#include "components/onc/onc_constants.h"
#include "content/public/browser/browser_context.h"
#include "extensions/browser/api/networking_private/networking_private_api.h"
+#include "extensions/browser/api/networking_private/networking_private_delegate.h"
+#include "extensions/browser/api/networking_private/networking_private_delegate_factory.h"
+#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
#include "extensions/common/api/networking_private.h"
+#include "extensions/common/permissions/api_permission.h"
+#include "extensions/common/permissions/permissions_data.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
using chromeos::DeviceState;
@@ -29,8 +34,18 @@ using chromeos::NetworkStateHandler;
namespace extensions {
+namespace {
+
+bool IsVpnProvider(const extensions::Extension* extension) {
+ return extension->permissions_data()->HasAPIPermission(
+ APIPermission::kVpnProvider);
+}
+
+} // namespace
+
class NetworkingPrivateEventRouterImpl
: public NetworkingPrivateEventRouter,
+ public ExtensionRegistryObserver,
public chromeos::NetworkStateHandlerObserver,
public NetworkPortalDetector::Observer {
public:
@@ -45,6 +60,14 @@ class NetworkingPrivateEventRouterImpl
void OnListenerAdded(const EventListenerInfo& details) override;
void OnListenerRemoved(const EventListenerInfo& details) override;
+ // ExtensionRegistryObserver
+ void OnExtensionLoaded(content::BrowserContext* browser_context,
+ const Extension* extension) override;
+ void OnExtensionUnloaded(content::BrowserContext* browser_context,
+ const Extension* extension,
+ UnloadedExtensionInfo::Reason reason) override;
+ void OnShutdown(ExtensionRegistry* registry) override;
+
// NetworkStateHandlerObserver overrides:
void NetworkListChanged() override;
void DeviceListChanged() override;
@@ -63,6 +86,9 @@ class NetworkingPrivateEventRouterImpl
// Otherwise, we want to unregister and not be listening to network changes.
void StartOrStopListeningForNetworkChanges();
+ // Called when the list of VPN Providers may have changed.
+ void VpnProviderListChanged();
+
content::BrowserContext* context_;
bool listening_;
@@ -88,10 +114,12 @@ NetworkingPrivateEventRouterImpl::NetworkingPrivateEventRouterImpl(
this, api::networking_private::OnPortalDetectionCompleted::kEventName);
StartOrStopListeningForNetworkChanges();
}
+ ExtensionRegistry::Get(context_)->AddObserver(this);
}
NetworkingPrivateEventRouterImpl::~NetworkingPrivateEventRouterImpl() {
DCHECK(!listening_);
+ ExtensionRegistry::Get(context_)->RemoveObserver(this);
}
void NetworkingPrivateEventRouterImpl::Shutdown() {
@@ -148,6 +176,25 @@ void NetworkingPrivateEventRouterImpl::StartOrStopListeningForNetworkChanges() {
listening_ = should_listen;
}
+void NetworkingPrivateEventRouterImpl::OnExtensionLoaded(
+ content::BrowserContext* browser_context,
+ const Extension* extension) {
+ if (IsVpnProvider(extension))
+ VpnProviderListChanged();
+}
+
+void NetworkingPrivateEventRouterImpl::OnExtensionUnloaded(
+ content::BrowserContext* browser_context,
+ const Extension* extension,
+ UnloadedExtensionInfo::Reason reason) {
+ if (IsVpnProvider(extension))
+ VpnProviderListChanged();
+}
+
+void NetworkingPrivateEventRouterImpl::OnShutdown(ExtensionRegistry* registry) {
+ registry->RemoveObserver(this);
+}
+
void NetworkingPrivateEventRouterImpl::NetworkListChanged() {
EventRouter* event_router = EventRouter::Get(context_);
if (!event_router->HasEventListener(
@@ -270,6 +317,27 @@ void NetworkingPrivateEventRouterImpl::OnPortalDetectionCompleted(
event_router->BroadcastEvent(extension_event.Pass());
}
+void NetworkingPrivateEventRouterImpl::VpnProviderListChanged() {
+ EventRouter* event_router = EventRouter::Get(context_);
+ if (!event_router->HasEventListener(
+ api::networking_private::OnThirdPartyVPNProvidersChanged::
+ kEventName)) {
+ return;
+ }
+
+ scoped_ptr<base::ListValue> vpn_provider_list =
+ NetworkingPrivateDelegateFactory::GetForBrowserContext(context_)
+ ->GetThirdPartyVpnProviderList();
+ scoped_ptr<base::ListValue> args(new base::ListValue);
+ args->Append(vpn_provider_list.Pass());
+
+ scoped_ptr<Event> extension_event(new Event(
+ events::NETWORKING_PRIVATE_ON_THIRD_PARTY_VPN_PROVIDERS_CHANGED,
+ api::networking_private::OnThirdPartyVPNProvidersChanged::kEventName,
+ args.Pass()));
+ event_router->BroadcastEvent(extension_event.Pass());
+}
+
NetworkingPrivateEventRouter* NetworkingPrivateEventRouter::Create(
content::BrowserContext* context) {
return new NetworkingPrivateEventRouterImpl(context);

Powered by Google App Engine
This is Rietveld 408576698