• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2012 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/base/network_change_notifier.h"
6 
7 #include <limits>
8 #include <optional>
9 #include <string>
10 #include <unordered_set>
11 #include <utility>
12 
13 #include "base/memory/ref_counted.h"
14 #include "base/metrics/histogram_functions.h"
15 #include "base/metrics/histogram_macros.h"
16 #include "base/no_destructor.h"
17 #include "base/observer_list.h"
18 #include "base/sequence_checker.h"
19 #include "base/strings/string_util.h"
20 #include "base/synchronization/lock.h"
21 #include "base/threading/thread_checker.h"
22 #include "base/timer/timer.h"
23 #include "build/build_config.h"
24 #include "build/chromeos_buildflags.h"
25 #include "net/base/network_change_notifier_factory.h"
26 #include "net/base/network_interfaces.h"
27 #include "net/base/url_util.h"
28 #include "net/dns/dns_config.h"
29 #include "net/dns/dns_config_service.h"
30 #include "net/dns/system_dns_config_change_notifier.h"
31 #include "net/url_request/url_request.h"
32 #include "url/gurl.h"
33 
34 #if BUILDFLAG(IS_WIN)
35 #include "net/base/network_change_notifier_win.h"
36 #elif BUILDFLAG(IS_LINUX)
37 #include "net/base/network_change_notifier_linux.h"
38 #elif BUILDFLAG(IS_APPLE)
39 #include "net/base/network_change_notifier_apple.h"
40 #elif BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
41 #include "net/base/network_change_notifier_passive.h"
42 #elif BUILDFLAG(IS_FUCHSIA)
43 #include "net/base/network_change_notifier_fuchsia.h"
44 #endif
45 
46 namespace net {
47 
48 namespace {
49 
50 // The process-wide singleton notifier.
51 NetworkChangeNotifier* g_network_change_notifier = nullptr;
52 
53 // Class factory singleton.
54 NetworkChangeNotifierFactory* g_network_change_notifier_factory = nullptr;
55 
56 // Lock to protect |g_network_change_notifier| during creation time. Since
57 // creation of the process-wide instance can happen on any thread, this lock is
58 // used to guarantee only one instance is created. Once the global instance is
59 // created, the owner is responsible for destroying it on the same thread. All
60 // the other calls to the NetworkChangeNotifier do not require this lock as
61 // the global instance is only destroyed when the process is getting killed.
NetworkChangeNotifierCreationLock()62 base::Lock& NetworkChangeNotifierCreationLock() {
63   static base::NoDestructor<base::Lock> instance;
64   return *instance;
65 }
66 
67 class MockNetworkChangeNotifier : public NetworkChangeNotifier {
68  public:
MockNetworkChangeNotifier(std::unique_ptr<SystemDnsConfigChangeNotifier> dns_config_notifier)69   explicit MockNetworkChangeNotifier(
70       std::unique_ptr<SystemDnsConfigChangeNotifier> dns_config_notifier)
71       : NetworkChangeNotifier(
72             NetworkChangeCalculatorParams(),
73             dns_config_notifier.get(),
74             // Omit adding observers from the constructor as that would prevent
75             // construction when SingleThreadTaskRunner::CurrentDefaultHandle
76             // isn't set.
77             /* omit_observers_in_constructor_for_testing=*/true),
78         dns_config_notifier_(std::move(dns_config_notifier)) {}
79 
~MockNetworkChangeNotifier()80   ~MockNetworkChangeNotifier() override { StopSystemDnsConfigNotifier(); }
81 
GetCurrentConnectionType() const82   ConnectionType GetCurrentConnectionType() const override {
83     return CONNECTION_UNKNOWN;
84   }
85 
86  private:
87   std::unique_ptr<SystemDnsConfigChangeNotifier> dns_config_notifier_;
88 };
89 
90 }  // namespace
91 
92 // static
93 bool NetworkChangeNotifier::test_notifications_only_ = false;
94 
95 NetworkChangeNotifier::NetworkChangeCalculatorParams::
96     NetworkChangeCalculatorParams() = default;
97 
98 // Calculates NetworkChange signal from IPAddress, ConnectionCost, and
99 // ConnectionType signals.
100 class NetworkChangeNotifier::NetworkChangeCalculator
101     : public ConnectionTypeObserver,
102       public ConnectionCostObserver,
103       public IPAddressObserver {
104  public:
NetworkChangeCalculator(const NetworkChangeCalculatorParams & params)105   explicit NetworkChangeCalculator(const NetworkChangeCalculatorParams& params)
106       : params_(params) {
107     DCHECK(g_network_change_notifier);
108     AddConnectionTypeObserver(this);
109     AddConnectionCostObserver(this);
110     AddIPAddressObserver(this);
111   }
112 
113   NetworkChangeCalculator(const NetworkChangeCalculator&) = delete;
114   NetworkChangeCalculator& operator=(const NetworkChangeCalculator&) = delete;
115 
~NetworkChangeCalculator()116   ~NetworkChangeCalculator() override {
117     DCHECK(thread_checker_.CalledOnValidThread());
118     RemoveConnectionTypeObserver(this);
119     RemoveConnectionCostObserver(this);
120     RemoveIPAddressObserver(this);
121   }
122 
123   // NetworkChangeNotifier::IPAddressObserver implementation.
OnIPAddressChanged()124   void OnIPAddressChanged() override {
125     DCHECK(thread_checker_.CalledOnValidThread());
126     pending_connection_type_ = GetConnectionType();
127     base::TimeDelta delay = last_announced_connection_type_ == CONNECTION_NONE
128         ? params_.ip_address_offline_delay_ : params_.ip_address_online_delay_;
129     // Cancels any previous timer.
130     timer_.Start(FROM_HERE, delay, this, &NetworkChangeCalculator::Notify);
131   }
132 
133   // NetworkChangeNotifier::ConnectionTypeObserver implementation.
OnConnectionTypeChanged(ConnectionType type)134   void OnConnectionTypeChanged(ConnectionType type) override {
135     DCHECK(thread_checker_.CalledOnValidThread());
136     pending_connection_type_ = type;
137     base::TimeDelta delay = last_announced_connection_type_ == CONNECTION_NONE
138         ? params_.connection_type_offline_delay_
139         : params_.connection_type_online_delay_;
140     // Cancels any previous timer.
141     timer_.Start(FROM_HERE, delay, this, &NetworkChangeCalculator::Notify);
142   }
143 
144   // NetworkChangeNotifier::ConnectionCostObserver implementation.
OnConnectionCostChanged(ConnectionCost cost)145   void OnConnectionCostChanged(ConnectionCost cost) override {
146     base::UmaHistogramEnumeration("Net.NetworkChangeNotifier.NewConnectionCost",
147                                   cost, CONNECTION_COST_LAST);
148   }
149 
150  private:
Notify()151   void Notify() {
152     DCHECK(thread_checker_.CalledOnValidThread());
153     // Don't bother signaling about dead connections.
154     if (have_announced_ &&
155         (last_announced_connection_type_ == CONNECTION_NONE) &&
156         (pending_connection_type_ == CONNECTION_NONE)) {
157       return;
158     }
159 
160     UMA_HISTOGRAM_ENUMERATION("Net.NetworkChangeNotifier.NewConnectionType",
161                               pending_connection_type_, CONNECTION_LAST + 1);
162 
163     have_announced_ = true;
164     last_announced_connection_type_ = pending_connection_type_;
165     // Immediately before sending out an online signal, send out an offline
166     // signal to perform any destructive actions before constructive actions.
167     if (pending_connection_type_ != CONNECTION_NONE)
168       NetworkChangeNotifier::NotifyObserversOfNetworkChange(CONNECTION_NONE);
169     NetworkChangeNotifier::NotifyObserversOfNetworkChange(
170         pending_connection_type_);
171   }
172 
173   const NetworkChangeCalculatorParams params_;
174 
175   // Indicates if NotifyObserversOfNetworkChange has been called yet.
176   bool have_announced_ = false;
177   // Last value passed to NotifyObserversOfNetworkChange.
178   ConnectionType last_announced_connection_type_ = CONNECTION_NONE;
179   // Value to pass to NotifyObserversOfNetworkChange when Notify is called.
180   ConnectionType pending_connection_type_ = CONNECTION_NONE;
181   // Used to delay notifications so duplicates can be combined.
182   base::OneShotTimer timer_;
183 
184   base::ThreadChecker thread_checker_;
185 };
186 
187 // Holds the collection of observer lists used by NetworkChangeNotifier.
188 class NetworkChangeNotifier::ObserverList {
189  public:
ObserverList()190   ObserverList()
191       : ip_address_observer_list_(
192             base::MakeRefCounted<base::ObserverListThreadSafe<
193                 NetworkChangeNotifier::IPAddressObserver>>(
194                 base::ObserverListPolicy::EXISTING_ONLY)),
195         connection_type_observer_list_(
196             base::MakeRefCounted<base::ObserverListThreadSafe<
197                 NetworkChangeNotifier::ConnectionTypeObserver>>(
198                 base::ObserverListPolicy::EXISTING_ONLY)),
199         resolver_state_observer_list_(
200             base::MakeRefCounted<base::ObserverListThreadSafe<
201                 NetworkChangeNotifier::DNSObserver>>(
202                 base::ObserverListPolicy::EXISTING_ONLY)),
203         network_change_observer_list_(
204             base::MakeRefCounted<base::ObserverListThreadSafe<
205                 NetworkChangeNotifier::NetworkChangeObserver>>(
206                 base::ObserverListPolicy::EXISTING_ONLY)),
207         max_bandwidth_observer_list_(
208             base::MakeRefCounted<base::ObserverListThreadSafe<
209                 NetworkChangeNotifier::MaxBandwidthObserver>>(
210                 base::ObserverListPolicy::EXISTING_ONLY)),
211         network_observer_list_(
212             base::MakeRefCounted<base::ObserverListThreadSafe<
213                 NetworkChangeNotifier::NetworkObserver>>(
214                 base::ObserverListPolicy::EXISTING_ONLY)),
215         connection_cost_observer_list_(
216             base::MakeRefCounted<base::ObserverListThreadSafe<
217                 NetworkChangeNotifier::ConnectionCostObserver>>(
218                 base::ObserverListPolicy::EXISTING_ONLY)),
219         default_network_active_observer_list_(
220             base::MakeRefCounted<
221                 base::ObserverListThreadSafe<DefaultNetworkActiveObserver>>(
222                 base::ObserverListPolicy::EXISTING_ONLY)) {}
223 
224   ObserverList(const ObserverList&) = delete;
225   ObserverList& operator=(const ObserverList&) = delete;
226   ~ObserverList() = default;
227 
228   const scoped_refptr<
229       base::ObserverListThreadSafe<NetworkChangeNotifier::IPAddressObserver>>
230       ip_address_observer_list_;
231   const scoped_refptr<base::ObserverListThreadSafe<
232       NetworkChangeNotifier::ConnectionTypeObserver>>
233       connection_type_observer_list_;
234   const scoped_refptr<
235       base::ObserverListThreadSafe<NetworkChangeNotifier::DNSObserver>>
236       resolver_state_observer_list_;
237   const scoped_refptr<base::ObserverListThreadSafe<
238       NetworkChangeNotifier::NetworkChangeObserver>>
239       network_change_observer_list_;
240   const scoped_refptr<
241       base::ObserverListThreadSafe<NetworkChangeNotifier::MaxBandwidthObserver>>
242       max_bandwidth_observer_list_;
243   const scoped_refptr<
244       base::ObserverListThreadSafe<NetworkChangeNotifier::NetworkObserver>>
245       network_observer_list_;
246   const scoped_refptr<base::ObserverListThreadSafe<
247       NetworkChangeNotifier::ConnectionCostObserver>>
248       connection_cost_observer_list_;
249   const scoped_refptr<
250       base::ObserverListThreadSafe<DefaultNetworkActiveObserver>>
251       default_network_active_observer_list_;
252 };
253 
254 class NetworkChangeNotifier::SystemDnsConfigObserver
255     : public SystemDnsConfigChangeNotifier::Observer {
256  public:
257   virtual ~SystemDnsConfigObserver() = default;
258 
OnSystemDnsConfigChanged(std::optional<DnsConfig> config)259   void OnSystemDnsConfigChanged(std::optional<DnsConfig> config) override {
260     NotifyObserversOfDNSChange();
261   }
262 };
263 
ClearGlobalPointer()264 void NetworkChangeNotifier::ClearGlobalPointer() {
265   if (!cleared_global_pointer_) {
266     cleared_global_pointer_ = true;
267     DCHECK_EQ(this, g_network_change_notifier);
268     g_network_change_notifier = nullptr;
269   }
270 }
271 
~NetworkChangeNotifier()272 NetworkChangeNotifier::~NetworkChangeNotifier() {
273   network_change_calculator_.reset();
274   ClearGlobalPointer();
275   StopSystemDnsConfigNotifier();
276 }
277 
278 // static
GetFactory()279 NetworkChangeNotifierFactory* NetworkChangeNotifier::GetFactory() {
280   return g_network_change_notifier_factory;
281 }
282 
283 // static
SetFactory(NetworkChangeNotifierFactory * factory)284 void NetworkChangeNotifier::SetFactory(
285     NetworkChangeNotifierFactory* factory) {
286   CHECK(!g_network_change_notifier_factory);
287   g_network_change_notifier_factory = factory;
288 }
289 
290 // static
CreateIfNeeded(NetworkChangeNotifier::ConnectionType initial_type,NetworkChangeNotifier::ConnectionSubtype initial_subtype)291 std::unique_ptr<NetworkChangeNotifier> NetworkChangeNotifier::CreateIfNeeded(
292     NetworkChangeNotifier::ConnectionType initial_type,
293     NetworkChangeNotifier::ConnectionSubtype initial_subtype) {
294   {
295     base::AutoLock auto_lock(NetworkChangeNotifierCreationLock());
296     if (g_network_change_notifier)
297       return nullptr;
298   }
299 
300   if (g_network_change_notifier_factory) {
301     return g_network_change_notifier_factory->CreateInstanceWithInitialTypes(
302         initial_type, initial_subtype);
303   }
304 
305 #if BUILDFLAG(IS_WIN)
306   std::unique_ptr<NetworkChangeNotifierWin> network_change_notifier =
307       std::make_unique<NetworkChangeNotifierWin>();
308   network_change_notifier->WatchForAddressChange();
309   return network_change_notifier;
310 #elif BUILDFLAG(IS_ANDROID)
311   // Fallback to use NetworkChangeNotifierPassive if
312   // NetworkChangeNotifierFactory is not set. Currently used for tests and when
313   // running network service in a separate process.
314   return std::make_unique<NetworkChangeNotifierPassive>(initial_type,
315                                                         initial_subtype);
316 #elif BUILDFLAG(IS_CHROMEOS)
317   return std::make_unique<NetworkChangeNotifierPassive>(initial_type,
318                                                         initial_subtype);
319 #elif BUILDFLAG(IS_LINUX)
320   return std::make_unique<NetworkChangeNotifierLinux>(
321       std::unordered_set<std::string>());
322 #elif BUILDFLAG(IS_APPLE)
323   return std::make_unique<NetworkChangeNotifierApple>();
324 #elif BUILDFLAG(IS_FUCHSIA)
325   return std::make_unique<NetworkChangeNotifierFuchsia>(
326       /*require_wlan=*/false);
327 #else
328   NOTIMPLEMENTED();
329   return nullptr;
330 #endif
331 }
332 
333 // static
334 NetworkChangeNotifier::ConnectionCost
GetConnectionCost()335 NetworkChangeNotifier::GetConnectionCost() {
336   return g_network_change_notifier
337              ? g_network_change_notifier->GetCurrentConnectionCost()
338              : CONNECTION_COST_UNKNOWN;
339 }
340 
341 // static
342 NetworkChangeNotifier::ConnectionType
GetConnectionType()343 NetworkChangeNotifier::GetConnectionType() {
344   return g_network_change_notifier ?
345       g_network_change_notifier->GetCurrentConnectionType() :
346       CONNECTION_UNKNOWN;
347 }
348 
349 // static
350 NetworkChangeNotifier::ConnectionSubtype
GetConnectionSubtype()351 NetworkChangeNotifier::GetConnectionSubtype() {
352   return g_network_change_notifier
353              ? g_network_change_notifier->GetCurrentConnectionSubtype()
354              : SUBTYPE_UNKNOWN;
355 }
356 
357 // static
GetMaxBandwidthAndConnectionType(double * max_bandwidth_mbps,ConnectionType * connection_type)358 void NetworkChangeNotifier::GetMaxBandwidthAndConnectionType(
359     double* max_bandwidth_mbps,
360     ConnectionType* connection_type) {
361   if (!g_network_change_notifier) {
362     *connection_type = CONNECTION_UNKNOWN;
363     *max_bandwidth_mbps =
364         GetMaxBandwidthMbpsForConnectionSubtype(SUBTYPE_UNKNOWN);
365     return;
366   }
367 
368   g_network_change_notifier->GetCurrentMaxBandwidthAndConnectionType(
369       max_bandwidth_mbps, connection_type);
370 }
371 
372 // static
GetMaxBandwidthMbpsForConnectionSubtype(ConnectionSubtype subtype)373 double NetworkChangeNotifier::GetMaxBandwidthMbpsForConnectionSubtype(
374     ConnectionSubtype subtype) {
375   switch (subtype) {
376     case SUBTYPE_GSM:
377       return 0.01;
378     case SUBTYPE_IDEN:
379       return 0.064;
380     case SUBTYPE_CDMA:
381       return 0.115;
382     case SUBTYPE_1XRTT:
383       return 0.153;
384     case SUBTYPE_GPRS:
385       return 0.237;
386     case SUBTYPE_EDGE:
387       return 0.384;
388     case SUBTYPE_UMTS:
389       return 2.0;
390     case SUBTYPE_EVDO_REV_0:
391       return 2.46;
392     case SUBTYPE_EVDO_REV_A:
393       return 3.1;
394     case SUBTYPE_HSPA:
395       return 3.6;
396     case SUBTYPE_EVDO_REV_B:
397       return 14.7;
398     case SUBTYPE_HSDPA:
399       return 14.3;
400     case SUBTYPE_HSUPA:
401       return 14.4;
402     case SUBTYPE_EHRPD:
403       return 21.0;
404     case SUBTYPE_HSPAP:
405       return 42.0;
406     case SUBTYPE_LTE:
407       return 100.0;
408     case SUBTYPE_LTE_ADVANCED:
409       return 100.0;
410     case SUBTYPE_BLUETOOTH_1_2:
411       return 1.0;
412     case SUBTYPE_BLUETOOTH_2_1:
413       return 3.0;
414     case SUBTYPE_BLUETOOTH_3_0:
415       return 24.0;
416     case SUBTYPE_BLUETOOTH_4_0:
417       return 1.0;
418     case SUBTYPE_ETHERNET:
419       return 10.0;
420     case SUBTYPE_FAST_ETHERNET:
421       return 100.0;
422     case SUBTYPE_GIGABIT_ETHERNET:
423       return 1000.0;
424     case SUBTYPE_10_GIGABIT_ETHERNET:
425       return 10000.0;
426     case SUBTYPE_WIFI_B:
427       return 11.0;
428     case SUBTYPE_WIFI_G:
429       return 54.0;
430     case SUBTYPE_WIFI_N:
431       return 600.0;
432     case SUBTYPE_WIFI_AC:
433       return 1300.0;
434     case SUBTYPE_WIFI_AD:
435       return 7000.0;
436     case SUBTYPE_UNKNOWN:
437       return std::numeric_limits<double>::infinity();
438     case SUBTYPE_NONE:
439       return 0.0;
440     case SUBTYPE_OTHER:
441       return std::numeric_limits<double>::infinity();
442   }
443   NOTREACHED();
444 }
445 
446 // static
AreNetworkHandlesSupported()447 bool NetworkChangeNotifier::AreNetworkHandlesSupported() {
448   if (g_network_change_notifier) {
449     return g_network_change_notifier->AreNetworkHandlesCurrentlySupported();
450   }
451   return false;
452 }
453 
454 // static
GetConnectedNetworks(NetworkList * network_list)455 void NetworkChangeNotifier::GetConnectedNetworks(NetworkList* network_list) {
456   DCHECK(AreNetworkHandlesSupported());
457   if (g_network_change_notifier) {
458     g_network_change_notifier->GetCurrentConnectedNetworks(network_list);
459   } else {
460     network_list->clear();
461   }
462 }
463 
464 // static
465 NetworkChangeNotifier::ConnectionType
GetNetworkConnectionType(handles::NetworkHandle network)466 NetworkChangeNotifier::GetNetworkConnectionType(
467     handles::NetworkHandle network) {
468   DCHECK(AreNetworkHandlesSupported());
469   return g_network_change_notifier
470              ? g_network_change_notifier->GetCurrentNetworkConnectionType(
471                    network)
472              : CONNECTION_UNKNOWN;
473 }
474 
475 // static
GetDefaultNetwork()476 handles::NetworkHandle NetworkChangeNotifier::GetDefaultNetwork() {
477   DCHECK(AreNetworkHandlesSupported());
478   return g_network_change_notifier
479              ? g_network_change_notifier->GetCurrentDefaultNetwork()
480              : handles::kInvalidNetworkHandle;
481 }
482 
483 // static
484 SystemDnsConfigChangeNotifier*
GetSystemDnsConfigNotifier()485 NetworkChangeNotifier::GetSystemDnsConfigNotifier() {
486   if (g_network_change_notifier)
487     return g_network_change_notifier->GetCurrentSystemDnsConfigNotifier();
488   return nullptr;
489 }
490 
491 // static
IsDefaultNetworkActive()492 bool NetworkChangeNotifier::IsDefaultNetworkActive() {
493   if (g_network_change_notifier)
494     return g_network_change_notifier->IsDefaultNetworkActiveInternal();
495   // Assume true as a "default" to avoid batching indefinitely.
496   return true;
497 }
498 
499 // static
ConnectionTypeToString(ConnectionType type)500 base::cstring_view NetworkChangeNotifier::ConnectionTypeToString(
501     ConnectionType type) {
502   static constexpr auto kConnectionTypeNames =
503       std::to_array<base::cstring_view>({
504           "CONNECTION_UNKNOWN",
505           "CONNECTION_ETHERNET",
506           "CONNECTION_WIFI",
507           "CONNECTION_2G",
508           "CONNECTION_3G",
509           "CONNECTION_4G",
510           "CONNECTION_NONE",
511           "CONNECTION_BLUETOOTH",
512           "CONNECTION_5G",
513       });
514   static_assert(std::size(kConnectionTypeNames) ==
515                     NetworkChangeNotifier::CONNECTION_LAST + 1,
516                 "ConnectionType name count should match");
517   if (type < CONNECTION_UNKNOWN || type > CONNECTION_LAST) {
518     NOTREACHED();
519   }
520   return kConnectionTypeNames[type];
521 }
522 
523 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
524 // static
GetAddressMapOwner()525 AddressMapOwnerLinux* NetworkChangeNotifier::GetAddressMapOwner() {
526   return g_network_change_notifier
527              ? g_network_change_notifier->GetAddressMapOwnerInternal()
528              : nullptr;
529 }
530 #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
531 
532 #if BUILDFLAG(IS_FUCHSIA)
533 // static
534 const internal::NetworkInterfaceCache*
GetNetworkInterfaceCache()535 NetworkChangeNotifier::GetNetworkInterfaceCache() {
536   return g_network_change_notifier
537              ? g_network_change_notifier->GetNetworkInterfaceCacheInternal()
538              : nullptr;
539 }
540 #endif  // BUILDFLAG(IS_FUCHSIA)
541 
542 // static
IsOffline()543 bool NetworkChangeNotifier::IsOffline() {
544   return GetConnectionType() == CONNECTION_NONE;
545 }
546 
547 // static
IsConnectionCellular(ConnectionType type)548 bool NetworkChangeNotifier::IsConnectionCellular(ConnectionType type) {
549   bool is_cellular = false;
550   switch (type) {
551     case CONNECTION_2G:
552     case CONNECTION_3G:
553     case CONNECTION_4G:
554     case CONNECTION_5G:
555       is_cellular =  true;
556       break;
557     case CONNECTION_UNKNOWN:
558     case CONNECTION_ETHERNET:
559     case CONNECTION_WIFI:
560     case CONNECTION_NONE:
561     case CONNECTION_BLUETOOTH:
562       is_cellular = false;
563       break;
564   }
565   return is_cellular;
566 }
567 
568 // static
569 NetworkChangeNotifier::ConnectionType
ConnectionTypeFromInterfaces()570 NetworkChangeNotifier::ConnectionTypeFromInterfaces() {
571   NetworkInterfaceList interfaces;
572   if (!GetNetworkList(&interfaces, EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES))
573     return CONNECTION_UNKNOWN;
574   return ConnectionTypeFromInterfaceList(interfaces);
575 }
576 
577 // static
578 NetworkChangeNotifier::ConnectionType
ConnectionTypeFromInterfaceList(const NetworkInterfaceList & interfaces)579 NetworkChangeNotifier::ConnectionTypeFromInterfaceList(
580     const NetworkInterfaceList& interfaces) {
581   bool first = true;
582   ConnectionType result = CONNECTION_NONE;
583   for (const auto& network_interface : interfaces) {
584 #if BUILDFLAG(IS_WIN)
585     if (network_interface.friendly_name == "Teredo Tunneling Pseudo-Interface")
586       continue;
587 #endif
588 #if BUILDFLAG(IS_APPLE)
589     // Ignore link-local addresses as they aren't globally routable.
590     // Mac assigns these to disconnected interfaces like tunnel interfaces
591     // ("utun"), airdrop interfaces ("awdl"), and ethernet ports ("en").
592     if (network_interface.address.IsLinkLocal())
593       continue;
594 #endif
595 
596     // Remove VMware network interfaces as they're internal and should not be
597     // used to determine the network connection type.
598     if (base::ToLowerASCII(network_interface.friendly_name).find("vmnet") !=
599         std::string::npos) {
600       continue;
601     }
602     if (first) {
603       first = false;
604       result = network_interface.type;
605     } else if (result != network_interface.type) {
606       return CONNECTION_UNKNOWN;
607     }
608   }
609   return result;
610 }
611 
612 // static
613 std::unique_ptr<NetworkChangeNotifier>
CreateMockIfNeeded()614 NetworkChangeNotifier::CreateMockIfNeeded() {
615   {
616     base::AutoLock auto_lock(NetworkChangeNotifierCreationLock());
617     if (g_network_change_notifier)
618       return nullptr;
619   }
620   // Use an empty noop SystemDnsConfigChangeNotifier to disable actual system
621   // DNS configuration notifications.
622   return std::make_unique<MockNetworkChangeNotifier>(
623       std::make_unique<SystemDnsConfigChangeNotifier>(
624           nullptr /* task_runner */, nullptr /* dns_config_service */));
625 }
626 
627 NetworkChangeNotifier::IPAddressObserver::IPAddressObserver() = default;
628 NetworkChangeNotifier::IPAddressObserver::~IPAddressObserver() = default;
629 
630 NetworkChangeNotifier::ConnectionTypeObserver::ConnectionTypeObserver() =
631     default;
632 NetworkChangeNotifier::ConnectionTypeObserver::~ConnectionTypeObserver() =
633     default;
634 
635 NetworkChangeNotifier::DNSObserver::DNSObserver() = default;
636 NetworkChangeNotifier::DNSObserver::~DNSObserver() = default;
637 
638 NetworkChangeNotifier::NetworkChangeObserver::NetworkChangeObserver() = default;
639 NetworkChangeNotifier::NetworkChangeObserver::~NetworkChangeObserver() =
640     default;
641 
642 NetworkChangeNotifier::MaxBandwidthObserver::MaxBandwidthObserver() = default;
643 NetworkChangeNotifier::MaxBandwidthObserver::~MaxBandwidthObserver() = default;
644 
645 NetworkChangeNotifier::NetworkObserver::NetworkObserver() = default;
646 NetworkChangeNotifier::NetworkObserver::~NetworkObserver() = default;
647 
648 NetworkChangeNotifier::ConnectionCostObserver::ConnectionCostObserver() =
649     default;
650 NetworkChangeNotifier::ConnectionCostObserver::~ConnectionCostObserver() =
651     default;
652 
653 NetworkChangeNotifier::DefaultNetworkActiveObserver::
654     DefaultNetworkActiveObserver() = default;
655 NetworkChangeNotifier::DefaultNetworkActiveObserver::
656     ~DefaultNetworkActiveObserver() = default;
657 
AddIPAddressObserver(IPAddressObserver * observer)658 void NetworkChangeNotifier::AddIPAddressObserver(IPAddressObserver* observer) {
659   DCHECK(!observer->observer_list_);
660   observer->observer_list_ = GetObserverList().ip_address_observer_list_;
661   observer->observer_list_->AddObserver(observer);
662 }
663 
AddConnectionTypeObserver(ConnectionTypeObserver * observer)664 void NetworkChangeNotifier::AddConnectionTypeObserver(
665     ConnectionTypeObserver* observer) {
666   DCHECK(!observer->observer_list_);
667   observer->observer_list_ = GetObserverList().connection_type_observer_list_;
668   observer->observer_list_->AddObserver(observer);
669 }
670 
AddDNSObserver(DNSObserver * observer)671 void NetworkChangeNotifier::AddDNSObserver(DNSObserver* observer) {
672   DCHECK(!observer->observer_list_);
673   observer->observer_list_ = GetObserverList().resolver_state_observer_list_;
674   observer->observer_list_->AddObserver(observer);
675 }
676 
AddNetworkChangeObserver(NetworkChangeObserver * observer)677 void NetworkChangeNotifier::AddNetworkChangeObserver(
678     NetworkChangeObserver* observer) {
679   DCHECK(!observer->observer_list_);
680   observer->observer_list_ = GetObserverList().network_change_observer_list_;
681   observer->observer_list_->AddObserver(observer);
682 }
683 
AddMaxBandwidthObserver(MaxBandwidthObserver * observer)684 void NetworkChangeNotifier::AddMaxBandwidthObserver(
685     MaxBandwidthObserver* observer) {
686   DCHECK(!observer->observer_list_);
687   observer->observer_list_ = GetObserverList().max_bandwidth_observer_list_;
688   observer->observer_list_->AddObserver(observer);
689 }
690 
AddNetworkObserver(NetworkObserver * observer)691 void NetworkChangeNotifier::AddNetworkObserver(NetworkObserver* observer) {
692   base::AutoLock auto_lock(NetworkChangeNotifierCreationLock());
693   DCHECK(AreNetworkHandlesSupported());
694   DCHECK(!observer->observer_list_);
695   observer->observer_list_ = GetObserverList().network_observer_list_;
696   observer->observer_list_->AddObserver(observer);
697 }
698 
AddConnectionCostObserver(ConnectionCostObserver * observer)699 void NetworkChangeNotifier::AddConnectionCostObserver(
700     ConnectionCostObserver* observer) {
701   DCHECK(!observer->observer_list_);
702   observer->observer_list_ = GetObserverList().connection_cost_observer_list_;
703   observer->observer_list_->AddObserver(observer);
704 }
705 
AddDefaultNetworkActiveObserver(DefaultNetworkActiveObserver * observer)706 void NetworkChangeNotifier::AddDefaultNetworkActiveObserver(
707     DefaultNetworkActiveObserver* observer) {
708   DCHECK(!observer->observer_list_);
709   observer->observer_list_ =
710       GetObserverList().default_network_active_observer_list_;
711   observer->observer_list_->AddObserver(observer);
712   base::AutoLock auto_lock(NetworkChangeNotifierCreationLock());
713   // Currently we lose DefaultNetworkActiveObserverAdded notifications for
714   // observers added prior to NCN creation. This should be a non-issue as
715   // currently only Cronet listens to this and its observers are always added
716   // after NCN creation.
717   if (g_network_change_notifier) {
718     g_network_change_notifier->DefaultNetworkActiveObserverAdded();
719   }
720 }
721 
RemoveIPAddressObserver(IPAddressObserver * observer)722 void NetworkChangeNotifier::RemoveIPAddressObserver(
723     IPAddressObserver* observer) {
724   if (observer->observer_list_) {
725     observer->observer_list_->RemoveObserver(observer);
726     observer->observer_list_.reset();
727   }
728 }
729 
RemoveConnectionTypeObserver(ConnectionTypeObserver * observer)730 void NetworkChangeNotifier::RemoveConnectionTypeObserver(
731     ConnectionTypeObserver* observer) {
732   if (observer->observer_list_) {
733     observer->observer_list_->RemoveObserver(observer);
734     observer->observer_list_.reset();
735   }
736 }
737 
RemoveDNSObserver(DNSObserver * observer)738 void NetworkChangeNotifier::RemoveDNSObserver(DNSObserver* observer) {
739   if (observer->observer_list_) {
740     observer->observer_list_->RemoveObserver(observer);
741     observer->observer_list_.reset();
742   }
743 }
744 
RemoveNetworkChangeObserver(NetworkChangeObserver * observer)745 void NetworkChangeNotifier::RemoveNetworkChangeObserver(
746     NetworkChangeObserver* observer) {
747   if (observer->observer_list_) {
748     observer->observer_list_->RemoveObserver(observer);
749     observer->observer_list_.reset();
750   }
751 }
752 
RemoveMaxBandwidthObserver(MaxBandwidthObserver * observer)753 void NetworkChangeNotifier::RemoveMaxBandwidthObserver(
754     MaxBandwidthObserver* observer) {
755   if (observer->observer_list_) {
756     observer->observer_list_->RemoveObserver(observer);
757     observer->observer_list_.reset();
758   }
759 }
760 
RemoveNetworkObserver(NetworkObserver * observer)761 void NetworkChangeNotifier::RemoveNetworkObserver(NetworkObserver* observer) {
762   if (observer->observer_list_) {
763     observer->observer_list_->RemoveObserver(observer);
764     observer->observer_list_.reset();
765   }
766 }
767 
RemoveConnectionCostObserver(ConnectionCostObserver * observer)768 void NetworkChangeNotifier::RemoveConnectionCostObserver(
769     ConnectionCostObserver* observer) {
770   if (observer->observer_list_) {
771     observer->observer_list_->RemoveObserver(observer);
772     observer->observer_list_.reset();
773   }
774 }
775 
RemoveDefaultNetworkActiveObserver(DefaultNetworkActiveObserver * observer)776 void NetworkChangeNotifier::RemoveDefaultNetworkActiveObserver(
777     DefaultNetworkActiveObserver* observer) {
778   if (observer->observer_list_) {
779     observer->observer_list_->RemoveObserver(observer);
780     observer->observer_list_.reset();
781     g_network_change_notifier->DefaultNetworkActiveObserverRemoved();
782   }
783 }
784 
TriggerNonSystemDnsChange()785 void NetworkChangeNotifier::TriggerNonSystemDnsChange() {
786   NetworkChangeNotifier::NotifyObserversOfDNSChange();
787 }
788 
789 // static
NotifyObserversOfIPAddressChangeForTests()790 void NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests() {
791   if (g_network_change_notifier)
792     g_network_change_notifier->NotifyObserversOfIPAddressChangeImpl();
793 }
794 
795 // static
NotifyObserversOfConnectionTypeChangeForTests(ConnectionType type)796 void NetworkChangeNotifier::NotifyObserversOfConnectionTypeChangeForTests(
797     ConnectionType type) {
798   if (g_network_change_notifier)
799     g_network_change_notifier->NotifyObserversOfConnectionTypeChangeImpl(type);
800 }
801 
802 // static
NotifyObserversOfDNSChangeForTests()803 void NetworkChangeNotifier::NotifyObserversOfDNSChangeForTests() {
804   if (g_network_change_notifier)
805     g_network_change_notifier->NotifyObserversOfDNSChangeImpl();
806 }
807 
808 // static
NotifyObserversOfNetworkChangeForTests(ConnectionType type)809 void NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
810     ConnectionType type) {
811   if (g_network_change_notifier)
812     g_network_change_notifier->NotifyObserversOfNetworkChangeImpl(type);
813 }
814 
815 // static
NotifyObserversOfMaxBandwidthChangeForTests(double max_bandwidth_mbps,ConnectionType type)816 void NetworkChangeNotifier::NotifyObserversOfMaxBandwidthChangeForTests(
817     double max_bandwidth_mbps,
818     ConnectionType type) {
819   if (g_network_change_notifier) {
820     g_network_change_notifier->NotifyObserversOfMaxBandwidthChangeImpl(
821         max_bandwidth_mbps, type);
822   }
823 }
824 
825 // static
NotifyObserversOfConnectionCostChangeForTests(ConnectionCost cost)826 void NetworkChangeNotifier::NotifyObserversOfConnectionCostChangeForTests(
827     ConnectionCost cost) {
828   if (g_network_change_notifier)
829     g_network_change_notifier->NotifyObserversOfConnectionCostChangeImpl(cost);
830 }
831 
832 // static
NotifyObserversOfDefaultNetworkActiveForTests()833 void NetworkChangeNotifier::NotifyObserversOfDefaultNetworkActiveForTests() {
834   if (g_network_change_notifier)
835     g_network_change_notifier->NotifyObserversOfDefaultNetworkActiveImpl();
836 }
837 
838 // static
SetTestNotificationsOnly(bool test_only)839 void NetworkChangeNotifier::SetTestNotificationsOnly(bool test_only) {
840   DCHECK(!g_network_change_notifier);
841   NetworkChangeNotifier::test_notifications_only_ = test_only;
842 }
843 
NetworkChangeNotifier(const NetworkChangeCalculatorParams & params,SystemDnsConfigChangeNotifier * system_dns_config_notifier,bool omit_observers_in_constructor_for_testing)844 NetworkChangeNotifier::NetworkChangeNotifier(
845     const NetworkChangeCalculatorParams& params
846     /*= NetworkChangeCalculatorParams()*/,
847     SystemDnsConfigChangeNotifier* system_dns_config_notifier /*= nullptr */,
848     bool omit_observers_in_constructor_for_testing /*= false */)
849     : system_dns_config_notifier_(system_dns_config_notifier),
850       system_dns_config_observer_(std::make_unique<SystemDnsConfigObserver>()) {
851   {
852     base::AutoLock auto_lock(NetworkChangeNotifierCreationLock());
853     if (!system_dns_config_notifier_) {
854       static base::NoDestructor<SystemDnsConfigChangeNotifier> singleton{};
855       system_dns_config_notifier_ = singleton.get();
856     }
857 
858     DCHECK(!g_network_change_notifier);
859     g_network_change_notifier = this;
860 
861     system_dns_config_notifier_->AddObserver(system_dns_config_observer_.get());
862   }
863   if (!omit_observers_in_constructor_for_testing) {
864     network_change_calculator_ =
865         std::make_unique<NetworkChangeCalculator>(params);
866   }
867 }
868 
869 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
GetAddressMapOwnerInternal()870 AddressMapOwnerLinux* NetworkChangeNotifier::GetAddressMapOwnerInternal() {
871   return nullptr;
872 }
873 #endif
874 
875 #if BUILDFLAG(IS_FUCHSIA)
876 const internal::NetworkInterfaceCache*
GetNetworkInterfaceCacheInternal() const877 NetworkChangeNotifier::GetNetworkInterfaceCacheInternal() const {
878   return nullptr;
879 }
880 #endif
881 
882 NetworkChangeNotifier::ConnectionCost
GetCurrentConnectionCost()883 NetworkChangeNotifier::GetCurrentConnectionCost() {
884   // This is the default non-platform specific implementation and assumes that
885   // cellular connectivity is metered and non-cellular is not. The function can
886   // be specialized on each platform specific notifier implementation.
887   return IsConnectionCellular(GetCurrentConnectionType())
888              ? CONNECTION_COST_METERED
889              : CONNECTION_COST_UNMETERED;
890 }
891 
892 NetworkChangeNotifier::ConnectionSubtype
GetCurrentConnectionSubtype() const893 NetworkChangeNotifier::GetCurrentConnectionSubtype() const {
894   return SUBTYPE_UNKNOWN;
895 }
896 
GetCurrentMaxBandwidthAndConnectionType(double * max_bandwidth_mbps,ConnectionType * connection_type) const897 void NetworkChangeNotifier::GetCurrentMaxBandwidthAndConnectionType(
898     double* max_bandwidth_mbps,
899     ConnectionType* connection_type) const {
900   // This default implementation conforms to the NetInfo V3 specification but
901   // should be overridden to provide specific bandwidth data based on the
902   // platform.
903   *connection_type = GetCurrentConnectionType();
904   *max_bandwidth_mbps =
905       *connection_type == CONNECTION_NONE
906           ? GetMaxBandwidthMbpsForConnectionSubtype(SUBTYPE_NONE)
907           : GetMaxBandwidthMbpsForConnectionSubtype(SUBTYPE_UNKNOWN);
908 }
909 
AreNetworkHandlesCurrentlySupported() const910 bool NetworkChangeNotifier::AreNetworkHandlesCurrentlySupported() const {
911   return false;
912 }
913 
GetCurrentConnectedNetworks(NetworkList * network_list) const914 void NetworkChangeNotifier::GetCurrentConnectedNetworks(
915     NetworkList* network_list) const {
916   network_list->clear();
917 }
918 
919 NetworkChangeNotifier::ConnectionType
GetCurrentNetworkConnectionType(handles::NetworkHandle network) const920 NetworkChangeNotifier::GetCurrentNetworkConnectionType(
921     handles::NetworkHandle network) const {
922   return CONNECTION_UNKNOWN;
923 }
924 
GetCurrentDefaultNetwork() const925 handles::NetworkHandle NetworkChangeNotifier::GetCurrentDefaultNetwork() const {
926   return handles::kInvalidNetworkHandle;
927 }
928 
929 SystemDnsConfigChangeNotifier*
GetCurrentSystemDnsConfigNotifier()930 NetworkChangeNotifier::GetCurrentSystemDnsConfigNotifier() {
931   DCHECK(system_dns_config_notifier_);
932   return system_dns_config_notifier_;
933 }
934 
IsDefaultNetworkActiveInternal()935 bool NetworkChangeNotifier::IsDefaultNetworkActiveInternal() {
936   return true;
937 }
938 
939 // static
NotifyObserversOfIPAddressChange()940 void NetworkChangeNotifier::NotifyObserversOfIPAddressChange() {
941   if (g_network_change_notifier &&
942       !NetworkChangeNotifier::test_notifications_only_) {
943     g_network_change_notifier->NotifyObserversOfIPAddressChangeImpl();
944   }
945 }
946 
947 // static
NotifyObserversOfConnectionTypeChange()948 void NetworkChangeNotifier::NotifyObserversOfConnectionTypeChange() {
949   if (g_network_change_notifier &&
950       !NetworkChangeNotifier::test_notifications_only_) {
951     g_network_change_notifier->NotifyObserversOfConnectionTypeChangeImpl(
952         GetConnectionType());
953   }
954 }
955 
956 // static
NotifyObserversOfNetworkChange(ConnectionType type)957 void NetworkChangeNotifier::NotifyObserversOfNetworkChange(
958     ConnectionType type) {
959   if (g_network_change_notifier &&
960       !NetworkChangeNotifier::test_notifications_only_) {
961     g_network_change_notifier->NotifyObserversOfNetworkChangeImpl(type);
962   }
963 }
964 
965 // static
NotifyObserversOfMaxBandwidthChange(double max_bandwidth_mbps,ConnectionType type)966 void NetworkChangeNotifier::NotifyObserversOfMaxBandwidthChange(
967     double max_bandwidth_mbps,
968     ConnectionType type) {
969   if (g_network_change_notifier &&
970       !NetworkChangeNotifier::test_notifications_only_) {
971     g_network_change_notifier->NotifyObserversOfMaxBandwidthChangeImpl(
972         max_bandwidth_mbps, type);
973   }
974 }
975 
976 // static
NotifyObserversOfDNSChange()977 void NetworkChangeNotifier::NotifyObserversOfDNSChange() {
978   if (g_network_change_notifier &&
979       !NetworkChangeNotifier::test_notifications_only_) {
980     g_network_change_notifier->NotifyObserversOfDNSChangeImpl();
981   }
982 }
983 
984 // static
NotifyObserversOfSpecificNetworkChange(NetworkChangeType type,handles::NetworkHandle network)985 void NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
986     NetworkChangeType type,
987     handles::NetworkHandle network) {
988   if (g_network_change_notifier &&
989       !NetworkChangeNotifier::test_notifications_only_) {
990     g_network_change_notifier->NotifyObserversOfSpecificNetworkChangeImpl(
991         type, network);
992   }
993 }
994 
995 // static
NotifyObserversOfConnectionCostChange()996 void NetworkChangeNotifier::NotifyObserversOfConnectionCostChange() {
997   if (g_network_change_notifier &&
998       !NetworkChangeNotifier::test_notifications_only_) {
999     g_network_change_notifier->NotifyObserversOfConnectionCostChangeImpl(
1000         GetConnectionCost());
1001   }
1002 }
1003 
1004 // static
NotifyObserversOfDefaultNetworkActive()1005 void NetworkChangeNotifier::NotifyObserversOfDefaultNetworkActive() {
1006   if (g_network_change_notifier &&
1007       !NetworkChangeNotifier::test_notifications_only_) {
1008     g_network_change_notifier->NotifyObserversOfDefaultNetworkActiveImpl();
1009   }
1010 }
1011 
StopSystemDnsConfigNotifier()1012 void NetworkChangeNotifier::StopSystemDnsConfigNotifier() {
1013   if (!system_dns_config_notifier_)
1014     return;
1015 
1016   system_dns_config_notifier_->RemoveObserver(
1017       system_dns_config_observer_.get());
1018   system_dns_config_observer_ = nullptr;
1019   system_dns_config_notifier_ = nullptr;
1020 }
1021 
NotifyObserversOfIPAddressChangeImpl()1022 void NetworkChangeNotifier::NotifyObserversOfIPAddressChangeImpl() {
1023   GetObserverList().ip_address_observer_list_->Notify(
1024       FROM_HERE, &IPAddressObserver::OnIPAddressChanged);
1025 }
1026 
NotifyObserversOfConnectionTypeChangeImpl(ConnectionType type)1027 void NetworkChangeNotifier::NotifyObserversOfConnectionTypeChangeImpl(
1028     ConnectionType type) {
1029   GetObserverList().connection_type_observer_list_->Notify(
1030       FROM_HERE, &ConnectionTypeObserver::OnConnectionTypeChanged, type);
1031 }
1032 
NotifyObserversOfNetworkChangeImpl(ConnectionType type)1033 void NetworkChangeNotifier::NotifyObserversOfNetworkChangeImpl(
1034     ConnectionType type) {
1035   GetObserverList().network_change_observer_list_->Notify(
1036       FROM_HERE, &NetworkChangeObserver::OnNetworkChanged, type);
1037 }
1038 
NotifyObserversOfDNSChangeImpl()1039 void NetworkChangeNotifier::NotifyObserversOfDNSChangeImpl() {
1040   GetObserverList().resolver_state_observer_list_->Notify(
1041       FROM_HERE, &DNSObserver::OnDNSChanged);
1042 }
1043 
NotifyObserversOfMaxBandwidthChangeImpl(double max_bandwidth_mbps,ConnectionType type)1044 void NetworkChangeNotifier::NotifyObserversOfMaxBandwidthChangeImpl(
1045     double max_bandwidth_mbps,
1046     ConnectionType type) {
1047   GetObserverList().max_bandwidth_observer_list_->Notify(
1048       FROM_HERE, &MaxBandwidthObserver::OnMaxBandwidthChanged,
1049       max_bandwidth_mbps, type);
1050 }
1051 
NotifyObserversOfSpecificNetworkChangeImpl(NetworkChangeType type,handles::NetworkHandle network)1052 void NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChangeImpl(
1053     NetworkChangeType type,
1054     handles::NetworkHandle network) {
1055   switch (type) {
1056     case NetworkChangeType::kConnected:
1057       GetObserverList().network_observer_list_->Notify(
1058           FROM_HERE, &NetworkObserver::OnNetworkConnected, network);
1059       break;
1060     case NetworkChangeType::kDisconnected:
1061       GetObserverList().network_observer_list_->Notify(
1062           FROM_HERE, &NetworkObserver::OnNetworkDisconnected, network);
1063       break;
1064     case NetworkChangeType::kSoonToDisconnect:
1065       GetObserverList().network_observer_list_->Notify(
1066           FROM_HERE, &NetworkObserver::OnNetworkSoonToDisconnect, network);
1067       break;
1068     case NetworkChangeType::kMadeDefault:
1069       GetObserverList().network_observer_list_->Notify(
1070           FROM_HERE, &NetworkObserver::OnNetworkMadeDefault, network);
1071       break;
1072   }
1073 }
1074 
NotifyObserversOfConnectionCostChangeImpl(ConnectionCost cost)1075 void NetworkChangeNotifier::NotifyObserversOfConnectionCostChangeImpl(
1076     ConnectionCost cost) {
1077   GetObserverList().connection_cost_observer_list_->Notify(
1078       FROM_HERE, &ConnectionCostObserver::OnConnectionCostChanged, cost);
1079 }
1080 
NotifyObserversOfDefaultNetworkActiveImpl()1081 void NetworkChangeNotifier::NotifyObserversOfDefaultNetworkActiveImpl() {
1082   GetObserverList().default_network_active_observer_list_->Notify(
1083       FROM_HERE, &DefaultNetworkActiveObserver::OnDefaultNetworkActive);
1084 }
1085 
DisableForTest()1086 NetworkChangeNotifier::DisableForTest::DisableForTest()
1087     : network_change_notifier_(g_network_change_notifier) {
1088   g_network_change_notifier = nullptr;
1089 }
1090 
~DisableForTest()1091 NetworkChangeNotifier::DisableForTest::~DisableForTest() {
1092   g_network_change_notifier = network_change_notifier_;
1093 }
1094 
1095 // static
GetObserverList()1096 NetworkChangeNotifier::ObserverList& NetworkChangeNotifier::GetObserverList() {
1097   static base::NoDestructor<NetworkChangeNotifier::ObserverList> observers;
1098   return *observers;
1099 }
1100 
1101 }  // namespace net
1102