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