Index: chrome/browser/extensions/api/networking_private/networking_private_event_router_chromeos.cc |
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_event_router_chromeos.cc b/chrome/browser/extensions/api/networking_private/networking_private_event_router_chromeos.cc |
index 9984c21c845fd1ca87c422352549e505195e3efd..69ed66db2d2332cbf734eacf88ed9e9a83bde686 100644 |
--- a/chrome/browser/extensions/api/networking_private/networking_private_event_router_chromeos.cc |
+++ b/chrome/browser/extensions/api/networking_private/networking_private_event_router_chromeos.cc |
@@ -6,6 +6,7 @@ |
#include "base/json/json_writer.h" |
#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/chromeos/net/network_portal_detector.h" |
#include "chrome/browser/extensions/api/networking_private/networking_private_api.h" |
#include "chrome/browser/extensions/event_router_forwarder.h" |
#include "chrome/browser/profiles/profile.h" |
@@ -22,6 +23,7 @@ |
#include "third_party/cros_system_api/dbus/service_constants.h" |
using chromeos::NetworkHandler; |
+using chromeos::NetworkPortalDetector; |
using chromeos::NetworkState; |
using chromeos::NetworkStateHandler; |
@@ -29,7 +31,8 @@ namespace extensions { |
class NetworkingPrivateEventRouterImpl |
: public NetworkingPrivateEventRouter, |
- public chromeos::NetworkStateHandlerObserver { |
+ public chromeos::NetworkStateHandlerObserver, |
+ public NetworkPortalDetector::Observer { |
public: |
explicit NetworkingPrivateEventRouterImpl(Profile* profile); |
virtual ~NetworkingPrivateEventRouterImpl(); |
@@ -46,6 +49,11 @@ class NetworkingPrivateEventRouterImpl |
virtual void NetworkListChanged() OVERRIDE; |
virtual void NetworkPropertiesUpdated(const NetworkState* network) OVERRIDE; |
+ // NetworkPortalDetector::Observer overrides: |
+ virtual void OnPortalDetectionCompleted( |
+ const NetworkState* network, |
+ const NetworkPortalDetector::CaptivePortalState& state) OVERRIDE; |
+ |
private: |
// Decide if we should listen for network changes or not. If there are any |
// JavaScript listeners registered for the onNetworkChanged event, then we |
@@ -72,6 +80,8 @@ NetworkingPrivateEventRouterImpl::NetworkingPrivateEventRouterImpl( |
this, api::networking_private::OnNetworksChanged::kEventName); |
event_router->RegisterObserver( |
this, api::networking_private::OnNetworkListChanged::kEventName); |
+ event_router->RegisterObserver( |
+ this, api::networking_private::OnPortalDetectionCompleted::kEventName); |
StartOrStopListeningForNetworkChanges(); |
} |
} |
@@ -114,14 +124,18 @@ void NetworkingPrivateEventRouterImpl::StartOrStopListeningForNetworkChanges() { |
event_router->HasEventListener( |
api::networking_private::OnNetworksChanged::kEventName) || |
event_router->HasEventListener( |
- api::networking_private::OnNetworkListChanged::kEventName); |
+ api::networking_private::OnNetworkListChanged::kEventName) || |
+ event_router->HasEventListener( |
+ api::networking_private::OnPortalDetectionCompleted::kEventName); |
if (should_listen && !listening_) { |
NetworkHandler::Get()->network_state_handler()->AddObserver( |
this, FROM_HERE); |
+ NetworkPortalDetector::Get()->AddObserver(this); |
} else if (!should_listen && listening_) { |
NetworkHandler::Get()->network_state_handler()->RemoveObserver( |
this, FROM_HERE); |
+ NetworkPortalDetector::Get()->RemoveObserver(this); |
} |
listening_ = should_listen; |
} |
@@ -177,6 +191,53 @@ void NetworkingPrivateEventRouterImpl::NetworkPropertiesUpdated( |
event_router->BroadcastEvent(extension_event.Pass()); |
} |
+void NetworkingPrivateEventRouterImpl::OnPortalDetectionCompleted( |
+ const NetworkState* network, |
+ const NetworkPortalDetector::CaptivePortalState& state) { |
+ const std::string path = network ? network->path() : std::string(); |
+ |
+ EventRouter* event_router = ExtensionSystem::Get(profile_)->event_router(); |
+ if (!event_router->HasEventListener( |
+ api::networking_private::OnPortalDetectionCompleted::kEventName)) { |
+ NET_LOG_EVENT("NetworkingPrivate.OnPortalDetectionCompleted: No Listeners", |
+ path); |
+ return; |
+ } |
+ NET_LOG_EVENT("NetworkingPrivate.OnPortalDetectionCompleted", path); |
+ |
+ api::networking_private::CaptivePortalStatus status = |
+ api::networking_private::CAPTIVE_PORTAL_STATUS_UNKNOWN; |
+ switch (state.status) { |
+ case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN: |
+ status = api::networking_private::CAPTIVE_PORTAL_STATUS_UNKNOWN; |
+ break; |
+ case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE: |
+ status = api::networking_private::CAPTIVE_PORTAL_STATUS_OFFLINE; |
+ break; |
+ case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE: |
+ status = api::networking_private::CAPTIVE_PORTAL_STATUS_ONLINE; |
+ break; |
+ case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL: |
+ status = api::networking_private::CAPTIVE_PORTAL_STATUS_PORTAL; |
+ break; |
+ case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED: |
+ status = |
+ api::networking_private::CAPTIVE_PORTAL_STATUS_PROXYAUTHREQUIRED; |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ |
+ scoped_ptr<base::ListValue> args( |
+ api::networking_private::OnPortalDetectionCompleted::Create( |
+ path, status)); |
+ scoped_ptr<Event> extension_event( |
+ new Event(api::networking_private::OnPortalDetectionCompleted::kEventName, |
+ args.Pass())); |
+ event_router->BroadcastEvent(extension_event.Pass()); |
+} |
+ |
NetworkingPrivateEventRouter* NetworkingPrivateEventRouter::Create( |
Profile* profile) { |
return new NetworkingPrivateEventRouterImpl(profile); |