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

Unified Diff: net/base/network_change_notifier.cc

Issue 992733002: Remove //net (except for Android test stuff) and sdch (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 9 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
« no previous file with comments | « net/base/network_change_notifier.h ('k') | net/base/network_change_notifier_factory.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/network_change_notifier.cc
diff --git a/net/base/network_change_notifier.cc b/net/base/network_change_notifier.cc
deleted file mode 100644
index 3ec6369fc47019b1e0933d0938c7e0d40d8edfe8..0000000000000000000000000000000000000000
--- a/net/base/network_change_notifier.cc
+++ /dev/null
@@ -1,990 +0,0 @@
-// 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 "net/base/network_change_notifier.h"
-
-#include <limits>
-
-#include "base/metrics/histogram.h"
-#include "base/synchronization/lock.h"
-#include "base/threading/thread_checker.h"
-#include "build/build_config.h"
-#include "net/base/net_util.h"
-#include "net/base/network_change_notifier_factory.h"
-#include "net/dns/dns_config_service.h"
-#include "net/url_request/url_request.h"
-#include "url/gurl.h"
-
-#if defined(OS_ANDROID)
-#include "base/metrics/sparse_histogram.h"
-#include "base/strings/string_number_conversions.h"
-#include "net/android/network_library.h"
-#endif
-
-#if defined(OS_WIN)
-#include "net/base/network_change_notifier_win.h"
-#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
-#include "net/base/network_change_notifier_linux.h"
-#elif defined(OS_MACOSX)
-#include "net/base/network_change_notifier_mac.h"
-#endif
-
-namespace net {
-
-namespace {
-
-// The actual singleton notifier. The class contract forbids usage of the API
-// in ways that would require us to place locks around access to this object.
-// (The prohibition on global non-POD objects makes it tricky to do such a thing
-// anyway.)
-NetworkChangeNotifier* g_network_change_notifier = NULL;
-
-// Class factory singleton.
-NetworkChangeNotifierFactory* g_network_change_notifier_factory = NULL;
-
-class MockNetworkChangeNotifier : public NetworkChangeNotifier {
- public:
- ConnectionType GetCurrentConnectionType() const override {
- return CONNECTION_UNKNOWN;
- }
-};
-
-} // namespace
-
-// The main observer class that records UMAs for network events.
-class HistogramWatcher
- : public NetworkChangeNotifier::ConnectionTypeObserver,
- public NetworkChangeNotifier::IPAddressObserver,
- public NetworkChangeNotifier::DNSObserver,
- public NetworkChangeNotifier::NetworkChangeObserver {
- public:
- HistogramWatcher()
- : last_ip_address_change_(base::TimeTicks::Now()),
- last_connection_change_(base::TimeTicks::Now()),
- last_dns_change_(base::TimeTicks::Now()),
- last_network_change_(base::TimeTicks::Now()),
- last_connection_type_(NetworkChangeNotifier::CONNECTION_UNKNOWN),
- offline_packets_received_(0),
- bytes_read_since_last_connection_change_(0),
- peak_kbps_since_last_connection_change_(0) {}
-
- // Registers our three Observer implementations. This is called from the
- // network thread so that our Observer implementations are also called
- // from the network thread. This avoids multi-threaded race conditions
- // because the only other interface, |NotifyDataReceived| is also
- // only called from the network thread.
- void Init() {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(g_network_change_notifier);
- NetworkChangeNotifier::AddConnectionTypeObserver(this);
- NetworkChangeNotifier::AddIPAddressObserver(this);
- NetworkChangeNotifier::AddDNSObserver(this);
- NetworkChangeNotifier::AddNetworkChangeObserver(this);
- }
-
- ~HistogramWatcher() override {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(g_network_change_notifier);
- NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
- NetworkChangeNotifier::RemoveIPAddressObserver(this);
- NetworkChangeNotifier::RemoveDNSObserver(this);
- NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
- }
-
- // NetworkChangeNotifier::IPAddressObserver implementation.
- void OnIPAddressChanged() override {
- DCHECK(thread_checker_.CalledOnValidThread());
- UMA_HISTOGRAM_MEDIUM_TIMES("NCN.IPAddressChange",
- SinceLast(&last_ip_address_change_));
- UMA_HISTOGRAM_MEDIUM_TIMES(
- "NCN.ConnectionTypeChangeToIPAddressChange",
- last_ip_address_change_ - last_connection_change_);
- }
-
- // NetworkChangeNotifier::ConnectionTypeObserver implementation.
- void OnConnectionTypeChanged(
- NetworkChangeNotifier::ConnectionType type) override {
- DCHECK(thread_checker_.CalledOnValidThread());
- base::TimeTicks now = base::TimeTicks::Now();
- int32 kilobytes_read = bytes_read_since_last_connection_change_ / 1000;
- base::TimeDelta state_duration = SinceLast(&last_connection_change_);
- if (bytes_read_since_last_connection_change_) {
- switch (last_connection_type_) {
- case NetworkChangeNotifier::CONNECTION_UNKNOWN:
- UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOnUnknown",
- first_byte_after_connection_change_);
- UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOnUnknown",
- fastest_RTT_since_last_connection_change_);
- break;
- case NetworkChangeNotifier::CONNECTION_ETHERNET:
- UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOnEthernet",
- first_byte_after_connection_change_);
- UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOnEthernet",
- fastest_RTT_since_last_connection_change_);
- break;
- case NetworkChangeNotifier::CONNECTION_WIFI:
- UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOnWifi",
- first_byte_after_connection_change_);
- UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOnWifi",
- fastest_RTT_since_last_connection_change_);
- break;
- case NetworkChangeNotifier::CONNECTION_2G:
- UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOn2G",
- first_byte_after_connection_change_);
- UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOn2G",
- fastest_RTT_since_last_connection_change_);
- break;
- case NetworkChangeNotifier::CONNECTION_3G:
- UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOn3G",
- first_byte_after_connection_change_);
- UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOn3G",
- fastest_RTT_since_last_connection_change_);
- break;
- case NetworkChangeNotifier::CONNECTION_4G:
- UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOn4G",
- first_byte_after_connection_change_);
- UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOn4G",
- fastest_RTT_since_last_connection_change_);
- break;
- case NetworkChangeNotifier::CONNECTION_NONE:
- UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOnNone",
- first_byte_after_connection_change_);
- UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOnNone",
- fastest_RTT_since_last_connection_change_);
- break;
- case NetworkChangeNotifier::CONNECTION_BLUETOOTH:
- UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOnBluetooth",
- first_byte_after_connection_change_);
- UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOnBluetooth",
- fastest_RTT_since_last_connection_change_);
- }
- }
- if (peak_kbps_since_last_connection_change_) {
- switch (last_connection_type_) {
- case NetworkChangeNotifier::CONNECTION_UNKNOWN:
- UMA_HISTOGRAM_COUNTS("NCN.CM.PeakKbpsOnUnknown",
- peak_kbps_since_last_connection_change_);
- break;
- case NetworkChangeNotifier::CONNECTION_ETHERNET:
- UMA_HISTOGRAM_COUNTS("NCN.CM.PeakKbpsOnEthernet",
- peak_kbps_since_last_connection_change_);
- break;
- case NetworkChangeNotifier::CONNECTION_WIFI:
- UMA_HISTOGRAM_COUNTS("NCN.CM.PeakKbpsOnWifi",
- peak_kbps_since_last_connection_change_);
- break;
- case NetworkChangeNotifier::CONNECTION_2G:
- UMA_HISTOGRAM_COUNTS("NCN.CM.PeakKbpsOn2G",
- peak_kbps_since_last_connection_change_);
- break;
- case NetworkChangeNotifier::CONNECTION_3G:
- UMA_HISTOGRAM_COUNTS("NCN.CM.PeakKbpsOn3G",
- peak_kbps_since_last_connection_change_);
- break;
- case NetworkChangeNotifier::CONNECTION_4G:
- UMA_HISTOGRAM_COUNTS("NCN.CM.PeakKbpsOn4G",
- peak_kbps_since_last_connection_change_);
- break;
- case NetworkChangeNotifier::CONNECTION_NONE:
- UMA_HISTOGRAM_COUNTS("NCN.CM.PeakKbpsOnNone",
- peak_kbps_since_last_connection_change_);
- break;
- case NetworkChangeNotifier::CONNECTION_BLUETOOTH:
- UMA_HISTOGRAM_COUNTS("NCN.CM.PeakKbpsOnBluetooth",
- peak_kbps_since_last_connection_change_);
- break;
- }
- }
- switch (last_connection_type_) {
- case NetworkChangeNotifier::CONNECTION_UNKNOWN:
- UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOnUnknown", state_duration);
- UMA_HISTOGRAM_COUNTS("NCN.CM.KBTransferedOnUnknown", kilobytes_read);
- break;
- case NetworkChangeNotifier::CONNECTION_ETHERNET:
- UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOnEthernet", state_duration);
- UMA_HISTOGRAM_COUNTS("NCN.CM.KBTransferedOnEthernet", kilobytes_read);
- break;
- case NetworkChangeNotifier::CONNECTION_WIFI:
- UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOnWifi", state_duration);
- UMA_HISTOGRAM_COUNTS("NCN.CM.KBTransferedOnWifi", kilobytes_read);
- break;
- case NetworkChangeNotifier::CONNECTION_2G:
- UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOn2G", state_duration);
- UMA_HISTOGRAM_COUNTS("NCN.CM.KBTransferedOn2G", kilobytes_read);
- break;
- case NetworkChangeNotifier::CONNECTION_3G:
- UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOn3G", state_duration);
- UMA_HISTOGRAM_COUNTS("NCN.CM.KBTransferedOn3G", kilobytes_read);
- break;
- case NetworkChangeNotifier::CONNECTION_4G:
- UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOn4G", state_duration);
- UMA_HISTOGRAM_COUNTS("NCN.CM.KBTransferedOn4G", kilobytes_read);
- break;
- case NetworkChangeNotifier::CONNECTION_NONE:
- UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOnNone", state_duration);
- UMA_HISTOGRAM_COUNTS("NCN.CM.KBTransferedOnNone", kilobytes_read);
- break;
- case NetworkChangeNotifier::CONNECTION_BLUETOOTH:
- UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOnBluetooth", state_duration);
- UMA_HISTOGRAM_COUNTS("NCN.CM.KBTransferedOnBluetooth", kilobytes_read);
- break;
- }
-
- if (type != NetworkChangeNotifier::CONNECTION_NONE) {
- UMA_HISTOGRAM_MEDIUM_TIMES("NCN.OnlineChange", state_duration);
-
- if (offline_packets_received_) {
- if ((now - last_offline_packet_received_) <
- base::TimeDelta::FromSeconds(5)) {
- // We can compare this sum with the sum of NCN.OfflineDataRecv.
- UMA_HISTOGRAM_COUNTS_10000(
- "NCN.OfflineDataRecvAny5sBeforeOnline",
- offline_packets_received_);
- }
-
- UMA_HISTOGRAM_MEDIUM_TIMES("NCN.OfflineDataRecvUntilOnline",
- now - last_offline_packet_received_);
- }
- } else {
- UMA_HISTOGRAM_MEDIUM_TIMES("NCN.OfflineChange", state_duration);
- }
-
- NetworkChangeNotifier::LogOperatorCodeHistogram(type);
-
- UMA_HISTOGRAM_MEDIUM_TIMES(
- "NCN.IPAddressChangeToConnectionTypeChange",
- now - last_ip_address_change_);
-
- offline_packets_received_ = 0;
- bytes_read_since_last_connection_change_ = 0;
- peak_kbps_since_last_connection_change_ = 0;
- last_connection_type_ = type;
- polling_interval_ = base::TimeDelta::FromSeconds(1);
- }
-
- // NetworkChangeNotifier::DNSObserver implementation.
- void OnDNSChanged() override {
- DCHECK(thread_checker_.CalledOnValidThread());
- UMA_HISTOGRAM_MEDIUM_TIMES("NCN.DNSConfigChange",
- SinceLast(&last_dns_change_));
- }
-
- // NetworkChangeNotifier::NetworkChangeObserver implementation.
- void OnNetworkChanged(NetworkChangeNotifier::ConnectionType type) override {
- DCHECK(thread_checker_.CalledOnValidThread());
- if (type != NetworkChangeNotifier::CONNECTION_NONE) {
- UMA_HISTOGRAM_MEDIUM_TIMES("NCN.NetworkOnlineChange",
- SinceLast(&last_network_change_));
- } else {
- UMA_HISTOGRAM_MEDIUM_TIMES("NCN.NetworkOfflineChange",
- SinceLast(&last_network_change_));
- }
- }
-
- // Record histogram data whenever we receive a packet. Should only be called
- // from the network thread.
- void NotifyDataReceived(const URLRequest& request, int bytes_read) {
- DCHECK(thread_checker_.CalledOnValidThread());
- if (IsLocalhost(request.url().host()) ||
- !request.url().SchemeIsHTTPOrHTTPS()) {
- return;
- }
-
- base::TimeTicks now = base::TimeTicks::Now();
- base::TimeDelta request_duration = now - request.creation_time();
- if (bytes_read_since_last_connection_change_ == 0) {
- first_byte_after_connection_change_ = now - last_connection_change_;
- fastest_RTT_since_last_connection_change_ = request_duration;
- }
- bytes_read_since_last_connection_change_ += bytes_read;
- if (request_duration < fastest_RTT_since_last_connection_change_)
- fastest_RTT_since_last_connection_change_ = request_duration;
- // Ignore tiny transfers which will not produce accurate rates.
- // Ignore zero duration transfers which might cause divide by zero.
- if (bytes_read > 10000 &&
- request_duration > base::TimeDelta::FromMilliseconds(1) &&
- request.creation_time() > last_connection_change_) {
- int32 kbps = static_cast<int32>(
- bytes_read * 8 / request_duration.InMilliseconds());
- if (kbps > peak_kbps_since_last_connection_change_)
- peak_kbps_since_last_connection_change_ = kbps;
- }
-
- if (last_connection_type_ != NetworkChangeNotifier::CONNECTION_NONE)
- return;
-
- UMA_HISTOGRAM_MEDIUM_TIMES("NCN.OfflineDataRecv",
- now - last_connection_change_);
- offline_packets_received_++;
- last_offline_packet_received_ = now;
-
- if ((now - last_polled_connection_) > polling_interval_) {
- polling_interval_ *= 2;
- last_polled_connection_ = now;
- last_polled_connection_type_ =
- NetworkChangeNotifier::GetConnectionType();
- }
- if (last_polled_connection_type_ ==
- NetworkChangeNotifier::CONNECTION_NONE) {
- UMA_HISTOGRAM_MEDIUM_TIMES("NCN.PollingOfflineDataRecv",
- now - last_connection_change_);
- }
- }
-
- private:
- static base::TimeDelta SinceLast(base::TimeTicks *last_time) {
- base::TimeTicks current_time = base::TimeTicks::Now();
- base::TimeDelta delta = current_time - *last_time;
- *last_time = current_time;
- return delta;
- }
-
- base::TimeTicks last_ip_address_change_;
- base::TimeTicks last_connection_change_;
- base::TimeTicks last_dns_change_;
- base::TimeTicks last_network_change_;
- base::TimeTicks last_offline_packet_received_;
- base::TimeTicks last_polled_connection_;
- // |polling_interval_| is initialized by |OnConnectionTypeChanged| on our
- // first transition to offline and on subsequent transitions. Once offline,
- // |polling_interval_| doubles as offline data is received and we poll
- // with |NetworkChangeNotifier::GetConnectionType| to verify the connection
- // state.
- base::TimeDelta polling_interval_;
- // |last_connection_type_| is the last value passed to
- // |OnConnectionTypeChanged|.
- NetworkChangeNotifier::ConnectionType last_connection_type_;
- // |last_polled_connection_type_| is last result from calling
- // |NetworkChangeNotifier::GetConnectionType| in |NotifyDataReceived|.
- NetworkChangeNotifier::ConnectionType last_polled_connection_type_;
- // Count of how many times NotifyDataReceived() has been called while the
- // NetworkChangeNotifier thought network connection was offline.
- int32 offline_packets_received_;
- // Number of bytes of network data received since last connectivity change.
- int32 bytes_read_since_last_connection_change_;
- // Fastest round-trip-time (RTT) since last connectivity change. RTT measured
- // from URLRequest creation until first byte received.
- base::TimeDelta fastest_RTT_since_last_connection_change_;
- // Time between connectivity change and first network data byte received.
- base::TimeDelta first_byte_after_connection_change_;
- // Rough measurement of peak KB/s witnessed since last connectivity change.
- // The accuracy is decreased by ignoring these factors:
- // 1) Multiple URLRequests can occur concurrently.
- // 2) NotifyDataReceived() may be called repeatedly for one URLRequest.
- // 3) The transfer time includes at least one RTT while no bytes are read.
- // Erring on the conservative side is hopefully offset by taking the maximum.
- int32 peak_kbps_since_last_connection_change_;
-
- base::ThreadChecker thread_checker_;
-
- DISALLOW_COPY_AND_ASSIGN(HistogramWatcher);
-};
-
-// NetworkState is thread safe.
-class NetworkChangeNotifier::NetworkState {
- public:
- NetworkState() {}
- ~NetworkState() {}
-
- void GetDnsConfig(DnsConfig* config) const {
- base::AutoLock lock(lock_);
- *config = dns_config_;
- }
-
- void SetDnsConfig(const DnsConfig& dns_config) {
- base::AutoLock lock(lock_);
- dns_config_ = dns_config;
- }
-
- private:
- mutable base::Lock lock_;
- DnsConfig dns_config_;
-};
-
-NetworkChangeNotifier::NetworkChangeCalculatorParams::
- NetworkChangeCalculatorParams() {
-}
-
-// Calculates NetworkChange signal from IPAddress and ConnectionType signals.
-class NetworkChangeNotifier::NetworkChangeCalculator
- : public ConnectionTypeObserver,
- public IPAddressObserver {
- public:
- NetworkChangeCalculator(const NetworkChangeCalculatorParams& params)
- : params_(params),
- have_announced_(false),
- last_announced_connection_type_(CONNECTION_NONE),
- pending_connection_type_(CONNECTION_NONE) {}
-
- void Init() {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(g_network_change_notifier);
- AddConnectionTypeObserver(this);
- AddIPAddressObserver(this);
- }
-
- ~NetworkChangeCalculator() override {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(g_network_change_notifier);
- RemoveConnectionTypeObserver(this);
- RemoveIPAddressObserver(this);
- }
-
- // NetworkChangeNotifier::IPAddressObserver implementation.
- void OnIPAddressChanged() override {
- DCHECK(thread_checker_.CalledOnValidThread());
- base::TimeDelta delay = last_announced_connection_type_ == CONNECTION_NONE
- ? params_.ip_address_offline_delay_ : params_.ip_address_online_delay_;
- // Cancels any previous timer.
- timer_.Start(FROM_HERE, delay, this, &NetworkChangeCalculator::Notify);
- }
-
- // NetworkChangeNotifier::ConnectionTypeObserver implementation.
- void OnConnectionTypeChanged(ConnectionType type) override {
- DCHECK(thread_checker_.CalledOnValidThread());
- pending_connection_type_ = type;
- base::TimeDelta delay = last_announced_connection_type_ == CONNECTION_NONE
- ? params_.connection_type_offline_delay_
- : params_.connection_type_online_delay_;
- // Cancels any previous timer.
- timer_.Start(FROM_HERE, delay, this, &NetworkChangeCalculator::Notify);
- }
-
- private:
- void Notify() {
- DCHECK(thread_checker_.CalledOnValidThread());
- // Don't bother signaling about dead connections.
- if (have_announced_ &&
- (last_announced_connection_type_ == CONNECTION_NONE) &&
- (pending_connection_type_ == CONNECTION_NONE)) {
- return;
- }
- have_announced_ = true;
- last_announced_connection_type_ = pending_connection_type_;
- // Immediately before sending out an online signal, send out an offline
- // signal to perform any destructive actions before constructive actions.
- if (pending_connection_type_ != CONNECTION_NONE)
- NetworkChangeNotifier::NotifyObserversOfNetworkChange(CONNECTION_NONE);
- NetworkChangeNotifier::NotifyObserversOfNetworkChange(
- pending_connection_type_);
- }
-
- const NetworkChangeCalculatorParams params_;
-
- // Indicates if NotifyObserversOfNetworkChange has been called yet.
- bool have_announced_;
- // Last value passed to NotifyObserversOfNetworkChange.
- ConnectionType last_announced_connection_type_;
- // Value to pass to NotifyObserversOfNetworkChange when Notify is called.
- ConnectionType pending_connection_type_;
- // Used to delay notifications so duplicates can be combined.
- base::OneShotTimer<NetworkChangeCalculator> timer_;
-
- base::ThreadChecker thread_checker_;
-
- DISALLOW_COPY_AND_ASSIGN(NetworkChangeCalculator);
-};
-
-NetworkChangeNotifier::~NetworkChangeNotifier() {
- network_change_calculator_.reset();
- DCHECK_EQ(this, g_network_change_notifier);
- g_network_change_notifier = NULL;
-}
-
-// static
-void NetworkChangeNotifier::SetFactory(
- NetworkChangeNotifierFactory* factory) {
- CHECK(!g_network_change_notifier_factory);
- g_network_change_notifier_factory = factory;
-}
-
-// static
-NetworkChangeNotifier* NetworkChangeNotifier::Create() {
- if (g_network_change_notifier_factory)
- return g_network_change_notifier_factory->CreateInstance();
-
-#if defined(OS_WIN)
- NetworkChangeNotifierWin* network_change_notifier =
- new NetworkChangeNotifierWin();
- network_change_notifier->WatchForAddressChange();
- return network_change_notifier;
-#elif defined(OS_CHROMEOS) || defined(OS_ANDROID)
- // ChromeOS and Android builds MUST use their own class factory.
-#if !defined(OS_CHROMEOS)
- // TODO(oshima): ash_shell do not have access to chromeos'es
- // notifier yet. Re-enable this when chromeos'es notifier moved to
- // chromeos root directory. crbug.com/119298.
- CHECK(false);
-#endif
- return NULL;
-#elif defined(OS_LINUX)
- return NetworkChangeNotifierLinux::Create();
-#elif defined(OS_MACOSX)
- return new NetworkChangeNotifierMac();
-#else
- NOTIMPLEMENTED();
- return NULL;
-#endif
-}
-
-// static
-NetworkChangeNotifier::ConnectionType
-NetworkChangeNotifier::GetConnectionType() {
- return g_network_change_notifier ?
- g_network_change_notifier->GetCurrentConnectionType() :
- CONNECTION_UNKNOWN;
-}
-
-// static
-double NetworkChangeNotifier::GetMaxBandwidth() {
- return g_network_change_notifier ?
- g_network_change_notifier->GetCurrentMaxBandwidth() :
- std::numeric_limits<double>::infinity();
-}
-
-// static
-void NetworkChangeNotifier::GetDnsConfig(DnsConfig* config) {
- if (!g_network_change_notifier) {
- *config = DnsConfig();
- } else {
- g_network_change_notifier->network_state_->GetDnsConfig(config);
- }
-}
-
-// static
-const char* NetworkChangeNotifier::ConnectionTypeToString(
- ConnectionType type) {
- static const char* const kConnectionTypeNames[] = {
- "CONNECTION_UNKNOWN",
- "CONNECTION_ETHERNET",
- "CONNECTION_WIFI",
- "CONNECTION_2G",
- "CONNECTION_3G",
- "CONNECTION_4G",
- "CONNECTION_NONE",
- "CONNECTION_BLUETOOTH"
- };
- static_assert(arraysize(kConnectionTypeNames) ==
- NetworkChangeNotifier::CONNECTION_LAST + 1,
- "ConnectionType name count should match");
- if (type < CONNECTION_UNKNOWN || type > CONNECTION_LAST) {
- NOTREACHED();
- return "CONNECTION_INVALID";
- }
- return kConnectionTypeNames[type];
-}
-
-// static
-void NetworkChangeNotifier::NotifyDataReceived(const URLRequest& request,
- int bytes_read) {
- if (!g_network_change_notifier ||
- !g_network_change_notifier->histogram_watcher_) {
- return;
- }
- g_network_change_notifier->histogram_watcher_->NotifyDataReceived(request,
- bytes_read);
-}
-
-// static
-void NetworkChangeNotifier::InitHistogramWatcher() {
- if (!g_network_change_notifier)
- return;
- g_network_change_notifier->histogram_watcher_.reset(new HistogramWatcher());
- g_network_change_notifier->histogram_watcher_->Init();
-}
-
-// static
-void NetworkChangeNotifier::ShutdownHistogramWatcher() {
- if (!g_network_change_notifier)
- return;
- g_network_change_notifier->histogram_watcher_.reset();
-}
-
-// static
-void NetworkChangeNotifier::LogOperatorCodeHistogram(ConnectionType type) {
-#if defined(OS_ANDROID)
- // On a connection type change to 2/3/4G, log the network operator MCC/MNC.
- // Log zero in other cases.
- unsigned mcc_mnc = 0;
- if (type == NetworkChangeNotifier::CONNECTION_2G ||
- type == NetworkChangeNotifier::CONNECTION_3G ||
- type == NetworkChangeNotifier::CONNECTION_4G) {
- // Log zero if not perfectly converted.
- if (!base::StringToUint(
- net::android::GetTelephonyNetworkOperator(), &mcc_mnc)) {
- mcc_mnc = 0;
- }
- }
- UMA_HISTOGRAM_SPARSE_SLOWLY("NCN.NetworkOperatorMCCMNC", mcc_mnc);
-#endif
-}
-
-#if defined(OS_LINUX)
-// static
-const internal::AddressTrackerLinux*
-NetworkChangeNotifier::GetAddressTracker() {
- return g_network_change_notifier ?
- g_network_change_notifier->GetAddressTrackerInternal() : NULL;
-}
-#endif
-
-// static
-bool NetworkChangeNotifier::IsOffline() {
- return GetConnectionType() == CONNECTION_NONE;
-}
-
-// static
-bool NetworkChangeNotifier::IsConnectionCellular(ConnectionType type) {
- bool is_cellular = false;
- switch (type) {
- case CONNECTION_2G:
- case CONNECTION_3G:
- case CONNECTION_4G:
- is_cellular = true;
- break;
- case CONNECTION_UNKNOWN:
- case CONNECTION_ETHERNET:
- case CONNECTION_WIFI:
- case CONNECTION_NONE:
- case CONNECTION_BLUETOOTH:
- is_cellular = false;
- break;
- }
- return is_cellular;
-}
-
-// static
-NetworkChangeNotifier::ConnectionType
-NetworkChangeNotifier::ConnectionTypeFromInterfaceList(
- const NetworkInterfaceList& interfaces) {
- bool first = true;
- ConnectionType result = CONNECTION_NONE;
- for (size_t i = 0; i < interfaces.size(); ++i) {
-#if defined(OS_WIN)
- if (interfaces[i].friendly_name == "Teredo Tunneling Pseudo-Interface")
- continue;
-#endif
- if (first) {
- first = false;
- result = interfaces[i].type;
- } else if (result != interfaces[i].type) {
- return CONNECTION_UNKNOWN;
- }
- }
- return result;
-}
-
-// static
-NetworkChangeNotifier* NetworkChangeNotifier::CreateMock() {
- return new MockNetworkChangeNotifier();
-}
-
-void NetworkChangeNotifier::AddIPAddressObserver(IPAddressObserver* observer) {
- if (g_network_change_notifier)
- g_network_change_notifier->ip_address_observer_list_->AddObserver(observer);
-}
-
-void NetworkChangeNotifier::AddConnectionTypeObserver(
- ConnectionTypeObserver* observer) {
- if (g_network_change_notifier) {
- g_network_change_notifier->connection_type_observer_list_->AddObserver(
- observer);
- }
-}
-
-void NetworkChangeNotifier::AddDNSObserver(DNSObserver* observer) {
- if (g_network_change_notifier) {
- g_network_change_notifier->resolver_state_observer_list_->AddObserver(
- observer);
- }
-}
-
-void NetworkChangeNotifier::AddNetworkChangeObserver(
- NetworkChangeObserver* observer) {
- if (g_network_change_notifier) {
- g_network_change_notifier->network_change_observer_list_->AddObserver(
- observer);
- }
-}
-
-void NetworkChangeNotifier::AddMaxBandwidthObserver(
- MaxBandwidthObserver* observer) {
- if (g_network_change_notifier) {
- g_network_change_notifier->max_bandwidth_observer_list_->AddObserver(
- observer);
- }
-}
-
-void NetworkChangeNotifier::RemoveIPAddressObserver(
- IPAddressObserver* observer) {
- if (g_network_change_notifier) {
- g_network_change_notifier->ip_address_observer_list_->RemoveObserver(
- observer);
- }
-}
-
-void NetworkChangeNotifier::RemoveConnectionTypeObserver(
- ConnectionTypeObserver* observer) {
- if (g_network_change_notifier) {
- g_network_change_notifier->connection_type_observer_list_->RemoveObserver(
- observer);
- }
-}
-
-void NetworkChangeNotifier::RemoveDNSObserver(DNSObserver* observer) {
- if (g_network_change_notifier) {
- g_network_change_notifier->resolver_state_observer_list_->RemoveObserver(
- observer);
- }
-}
-
-void NetworkChangeNotifier::RemoveNetworkChangeObserver(
- NetworkChangeObserver* observer) {
- if (g_network_change_notifier) {
- g_network_change_notifier->network_change_observer_list_->RemoveObserver(
- observer);
- }
-}
-
-void NetworkChangeNotifier::RemoveMaxBandwidthObserver(
- MaxBandwidthObserver* observer) {
- if (g_network_change_notifier) {
- g_network_change_notifier->max_bandwidth_observer_list_->RemoveObserver(
- observer);
- }
-}
-
-// static
-void NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests() {
- if (g_network_change_notifier)
- g_network_change_notifier->NotifyObserversOfIPAddressChangeImpl();
-}
-
-// static
-void NetworkChangeNotifier::NotifyObserversOfConnectionTypeChangeForTests(
- ConnectionType type) {
- if (g_network_change_notifier)
- g_network_change_notifier->NotifyObserversOfConnectionTypeChangeImpl(type);
-}
-
-// static
-void NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
- ConnectionType type) {
- if (g_network_change_notifier)
- g_network_change_notifier->NotifyObserversOfNetworkChangeImpl(type);
-}
-
-// static
-void NetworkChangeNotifier::SetTestNotificationsOnly(bool test_only) {
- if (g_network_change_notifier)
- g_network_change_notifier->test_notifications_only_ = test_only;
-}
-
-NetworkChangeNotifier::NetworkChangeNotifier(
- const NetworkChangeCalculatorParams& params
- /*= NetworkChangeCalculatorParams()*/)
- : ip_address_observer_list_(new ObserverListThreadSafe<IPAddressObserver>(
- ObserverListBase<IPAddressObserver>::NOTIFY_EXISTING_ONLY)),
- connection_type_observer_list_(
- new ObserverListThreadSafe<ConnectionTypeObserver>(
- ObserverListBase<ConnectionTypeObserver>::NOTIFY_EXISTING_ONLY)),
- resolver_state_observer_list_(new ObserverListThreadSafe<DNSObserver>(
- ObserverListBase<DNSObserver>::NOTIFY_EXISTING_ONLY)),
- network_change_observer_list_(
- new ObserverListThreadSafe<NetworkChangeObserver>(
- ObserverListBase<NetworkChangeObserver>::NOTIFY_EXISTING_ONLY)),
- max_bandwidth_observer_list_(
- new ObserverListThreadSafe<MaxBandwidthObserver>(
- ObserverListBase<MaxBandwidthObserver>::NOTIFY_EXISTING_ONLY)),
- network_state_(new NetworkState()),
- network_change_calculator_(new NetworkChangeCalculator(params)),
- test_notifications_only_(false) {
- DCHECK(!g_network_change_notifier);
- g_network_change_notifier = this;
- network_change_calculator_->Init();
-}
-
-#if defined(OS_LINUX)
-const internal::AddressTrackerLinux*
-NetworkChangeNotifier::GetAddressTrackerInternal() const {
- return NULL;
-}
-#endif
-
-double NetworkChangeNotifier::GetCurrentMaxBandwidth() const {
- // This default implementation conforms to the NetInfo V3 specification but
- // should be overridden to provide specific bandwidth data based on the
- // platform.
- if (GetCurrentConnectionType() == CONNECTION_NONE)
- return 0.0;
- return std::numeric_limits<double>::infinity();
-}
-
-// static
-double NetworkChangeNotifier::GetMaxBandwidthForConnectionSubtype(
- ConnectionSubtype subtype) {
- switch (subtype) {
- case SUBTYPE_GSM:
- return 0.01;
- case SUBTYPE_IDEN:
- return 0.064;
- case SUBTYPE_CDMA:
- return 0.115;
- case SUBTYPE_1XRTT:
- return 0.153;
- case SUBTYPE_GPRS:
- return 0.237;
- case SUBTYPE_EDGE:
- return 0.384;
- case SUBTYPE_UMTS:
- return 2.0;
- case SUBTYPE_EVDO_REV_0:
- return 2.46;
- case SUBTYPE_EVDO_REV_A:
- return 3.1;
- case SUBTYPE_HSPA:
- return 3.6;
- case SUBTYPE_EVDO_REV_B:
- return 14.7;
- case SUBTYPE_HSDPA:
- return 14.3;
- case SUBTYPE_HSUPA:
- return 14.4;
- case SUBTYPE_EHRPD:
- return 21.0;
- case SUBTYPE_HSPAP:
- return 42.0;
- case SUBTYPE_LTE:
- return 100.0;
- case SUBTYPE_LTE_ADVANCED:
- return 100.0;
- case SUBTYPE_BLUETOOTH_1_2:
- return 1.0;
- case SUBTYPE_BLUETOOTH_2_1:
- return 3.0;
- case SUBTYPE_BLUETOOTH_3_0:
- return 24.0;
- case SUBTYPE_BLUETOOTH_4_0:
- return 1.0;
- case SUBTYPE_ETHERNET:
- return 10.0;
- case SUBTYPE_FAST_ETHERNET:
- return 100.0;
- case SUBTYPE_GIGABIT_ETHERNET:
- return 1000.0;
- case SUBTYPE_10_GIGABIT_ETHERNET:
- return 10000.0;
- case SUBTYPE_WIFI_B:
- return 11.0;
- case SUBTYPE_WIFI_G:
- return 54.0;
- case SUBTYPE_WIFI_N:
- return 600.0;
- case SUBTYPE_WIFI_AC:
- return 1300.0;
- case SUBTYPE_WIFI_AD:
- return 7000.0;
- case SUBTYPE_UNKNOWN:
- return std::numeric_limits<double>::infinity();
- case SUBTYPE_NONE:
- return 0.0;
- case SUBTYPE_OTHER:
- return std::numeric_limits<double>::infinity();
- }
- NOTREACHED();
- return std::numeric_limits<double>::infinity();
-}
-
-// static
-void NetworkChangeNotifier::NotifyObserversOfIPAddressChange() {
- if (g_network_change_notifier &&
- !g_network_change_notifier->test_notifications_only_) {
- g_network_change_notifier->NotifyObserversOfIPAddressChangeImpl();
- }
-}
-
-// static
-void NetworkChangeNotifier::NotifyObserversOfConnectionTypeChange() {
- if (g_network_change_notifier &&
- !g_network_change_notifier->test_notifications_only_) {
- g_network_change_notifier->NotifyObserversOfConnectionTypeChangeImpl(
- GetConnectionType());
- }
-}
-
-// static
-void NetworkChangeNotifier::NotifyObserversOfNetworkChange(
- ConnectionType type) {
- if (g_network_change_notifier &&
- !g_network_change_notifier->test_notifications_only_) {
- g_network_change_notifier->NotifyObserversOfNetworkChangeImpl(type);
- }
-}
-
-// static
-void NetworkChangeNotifier::NotifyObserversOfMaxBandwidthChange(
- double max_bandwidth_mbps) {
- if (g_network_change_notifier &&
- !g_network_change_notifier->test_notifications_only_) {
- g_network_change_notifier->NotifyObserversOfMaxBandwidthChangeImpl(
- max_bandwidth_mbps);
- }
-}
-
-// static
-void NetworkChangeNotifier::NotifyObserversOfDNSChange() {
- if (g_network_change_notifier &&
- !g_network_change_notifier->test_notifications_only_) {
- g_network_change_notifier->NotifyObserversOfDNSChangeImpl();
- }
-}
-
-// static
-void NetworkChangeNotifier::SetDnsConfig(const DnsConfig& config) {
- if (!g_network_change_notifier)
- return;
- g_network_change_notifier->network_state_->SetDnsConfig(config);
- NotifyObserversOfDNSChange();
-}
-
-void NetworkChangeNotifier::NotifyObserversOfIPAddressChangeImpl() {
- ip_address_observer_list_->Notify(FROM_HERE,
- &IPAddressObserver::OnIPAddressChanged);
-}
-
-void NetworkChangeNotifier::NotifyObserversOfConnectionTypeChangeImpl(
- ConnectionType type) {
- connection_type_observer_list_->Notify(
- FROM_HERE, &ConnectionTypeObserver::OnConnectionTypeChanged, type);
-}
-
-void NetworkChangeNotifier::NotifyObserversOfNetworkChangeImpl(
- ConnectionType type) {
- network_change_observer_list_->Notify(
- FROM_HERE, &NetworkChangeObserver::OnNetworkChanged, type);
-}
-
-void NetworkChangeNotifier::NotifyObserversOfDNSChangeImpl() {
- resolver_state_observer_list_->Notify(FROM_HERE, &DNSObserver::OnDNSChanged);
-}
-
-void NetworkChangeNotifier::NotifyObserversOfMaxBandwidthChangeImpl(
- double max_bandwidth_mbps) {
- max_bandwidth_observer_list_->Notify(
- FROM_HERE, &MaxBandwidthObserver::OnMaxBandwidthChanged,
- max_bandwidth_mbps);
-}
-
-NetworkChangeNotifier::DisableForTest::DisableForTest()
- : network_change_notifier_(g_network_change_notifier) {
- DCHECK(g_network_change_notifier);
- g_network_change_notifier = NULL;
-}
-
-NetworkChangeNotifier::DisableForTest::~DisableForTest() {
- DCHECK(!g_network_change_notifier);
- g_network_change_notifier = network_change_notifier_;
-}
-
-} // namespace net
« no previous file with comments | « net/base/network_change_notifier.h ('k') | net/base/network_change_notifier_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698