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