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