Index: chrome/browser/metrics/metrics_network_observer.cc |
diff --git a/chrome/browser/metrics/metrics_network_observer.cc b/chrome/browser/metrics/metrics_network_observer.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9d46fe4b8dc927c45c37b5d93377a552c4ba248e |
--- /dev/null |
+++ b/chrome/browser/metrics/metrics_network_observer.cc |
@@ -0,0 +1,64 @@ |
+// Copyright (c) 2012 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 "chrome/browser/metrics/metrics_network_observer.h" |
+ |
+#include "base/compiler_specific.h" |
+#include "base/threading/sequenced_worker_pool.h" |
+#include "content/public/browser/browser_thread.h" |
+ |
+namespace { |
+ |
+void ProbeWifiPhyMode(net::WifiPhyMode* phy_mode) { |
+ *phy_mode = net::GetWifiPhyMode(); |
+} |
+ |
+} // namespace |
+ |
+MetricsNetworkObserver::MetricsNetworkObserver() |
+ : weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
+ connection_type_is_ambiguous_(false), |
+ wifi_phy_mode_is_ambiguous_(false) { |
+ net::NetworkChangeNotifier::AddConnectionTypeObserver(this); |
+ Reset(); |
+} |
+ |
+MetricsNetworkObserver::~MetricsNetworkObserver() { |
+ net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); |
+} |
+ |
+void MetricsNetworkObserver::Reset() { |
+ connection_type_is_ambiguous_ = false; |
+ connection_type_ = net::NetworkChangeNotifier::GetConnectionType(); |
+ wifi_phy_mode_is_ambiguous_ = false; |
+ wifi_phy_mode_ = net::WIFI_PHY_MODE_UNKNOWN; |
+} |
+ |
+void MetricsNetworkObserver::OnConnectionTypeChanged( |
+ net::NetworkChangeNotifier::ConnectionType type) { |
+ if (type == net::NetworkChangeNotifier::CONNECTION_NONE) |
+ return; |
+ if (type != connection_type_ && |
+ connection_type_ != net::NetworkChangeNotifier::CONNECTION_NONE) { |
+ connection_type_is_ambiguous_ = true; |
+ } |
+ connection_type_ = type; |
+ |
+ weak_ptr_factory_.InvalidateWeakPtrs(); |
+ |
+ net::WifiPhyMode* phy_mode = new net::WifiPhyMode(); |
+ content::BrowserThread::GetBlockingPool()->PostTaskAndReply( |
+ FROM_HERE, |
+ base::Bind(&ProbeWifiPhyMode, base::Unretained(phy_mode)), |
+ base::Bind(&MetricsNetworkObserver::OnWifiModeChanged, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ base::Owned(phy_mode))); |
+} |
+ |
+void MetricsNetworkObserver::OnWifiModeChanged(net::WifiPhyMode* mode) { |
+ if (*mode != wifi_phy_mode_) |
+ wifi_phy_mode_is_ambiguous_ = true; |
+ wifi_phy_mode_ = *mode; |
+} |
+ |