Index: chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc |
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc |
index cd0b3b50f854a30a6757e9831dff5f3ef7e8259a..d4be7ba6e9a0086327d576db0dd8e682d6337db9 100644 |
--- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc |
+++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc |
@@ -9,6 +9,7 @@ |
#include "base/callback.h" |
#include "base/command_line.h" |
#include "base/logging.h" |
+#include "base/metrics/histogram.h" |
#include "base/string16.h" |
#include "base/string_util.h" |
#include "base/stringprintf.h" |
@@ -195,6 +196,69 @@ NetworkPortalDetector::CaptivePortalState GetCaptivePortalState( |
return detector->GetCaptivePortalState(network); |
} |
+void RecordDiscrepancyWithShill( |
+ const Network* network, |
+ const NetworkPortalDetector::CaptivePortalStatus status) { |
+ if (network->online()) { |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "CaptivePortal.OOBE.DiscrepancyWithShill.Online", |
+ status, |
+ NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT); |
+ } else if (network->restricted_pool()) { |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "CaptivePortal.OOBE.DiscrepancyWithShill.RestrictedPool", |
+ status, |
+ NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT); |
+ } else { |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "CaptivePortal.OOBE.DiscrepancyWithShill.Offline", |
+ status, |
+ NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT); |
+ } |
+} |
+ |
+// Record state and descripancies with shill (e.g. shill thinks that |
+// network is online but NetworkPortalDetector claims that it's behind |
+// portal) for the network identified by |service_path|. |
+void RecordNetworkPortalDetectorStats(const std::string& service_path) { |
+ const Network* network = FindNetworkByPath(service_path); |
+ if (!network) |
+ return; |
+ NetworkPortalDetector::CaptivePortalState state = |
+ GetCaptivePortalState(service_path); |
+ if (state.status == NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN) |
+ return; |
+ |
+ UMA_HISTOGRAM_ENUMERATION("CaptivePortal.OOBE.DetectionResult", |
+ state.status, |
+ NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT); |
+ |
+ switch (state.status) { |
+ case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN: |
+ NOTREACHED(); |
+ break; |
+ case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE: |
+ if (network->online() || network->restricted_pool()) |
+ RecordDiscrepancyWithShill(network, state.status); |
+ break; |
+ case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE: |
+ if (!network->online()) |
+ RecordDiscrepancyWithShill(network, state.status); |
+ break; |
+ case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL: |
+ if (!network->restricted_pool()) |
+ RecordDiscrepancyWithShill(network, state.status); |
+ break; |
+ case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED: |
+ if (!network->online()) |
+ RecordDiscrepancyWithShill(network, state.status); |
+ break; |
+ case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT: |
+ NOTREACHED(); |
+ break; |
+ } |
+} |
+ |
} // namespace |
// SigninScreenHandler implementation ------------------------------------------ |
@@ -552,6 +616,11 @@ void SigninScreenHandler::UpdateStateInternal( |
<< "network_id=" << network_id << ", " |
<< "reason=" << reason << ", " |
<< "is_under_captive_portal=" << is_under_captive_portal; |
+ |
+ // Record portal detection stats only if we're going to show or |
+ // change state of the error screen. |
+ RecordNetworkPortalDetectorStats(service_path); |
+ |
if (is_proxy_error) { |
error_screen_actor_->ShowProxyError(); |
} else if (is_under_captive_portal) { |