| // Copyright 2012 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef NET_BASE_NETWORK_CHANGE_NOTIFIER_PASSIVE_H_ |
| #define NET_BASE_NETWORK_CHANGE_NOTIFIER_PASSIVE_H_ |
| |
| #include "base/gtest_prod_util.h" |
| #include "base/sequence_checker.h" |
| #include "base/synchronization/lock.h" |
| #include "base/threading/thread.h" |
| #include "base/threading/thread_checker.h" |
| #include "net/base/net_export.h" |
| #include "net/base/network_change_notifier.h" |
| |
| #if BUILDFLAG(IS_LINUX) |
| #include "net/base/address_map_cache_linux.h" |
| #endif |
| |
| namespace net { |
| |
| // A NetworkChangeNotifier that needs to be told about network changes by some |
| // other object. This is useful on platforms like ChromeOS, Lacros, and Android |
| // where only objects running in the browser process can listen for network |
| // state changes, but other processes want to add observers for network state. |
| // It's also useful on Linux where listening for network state changes in a |
| // sandboxed process requires loosening the sandbox policy too much. |
| class NET_EXPORT NetworkChangeNotifierPassive : public NetworkChangeNotifier { |
| public: |
| NetworkChangeNotifierPassive( |
| NetworkChangeNotifier::ConnectionType initial_connection_type, |
| NetworkChangeNotifier::ConnectionSubtype initial_connection_subtype); |
| NetworkChangeNotifierPassive(const NetworkChangeNotifierPassive&) = delete; |
| NetworkChangeNotifierPassive& operator=(const NetworkChangeNotifierPassive&) = |
| delete; |
| ~NetworkChangeNotifierPassive() override; |
| |
| // These methods are used to notify this object that a network property has |
| // changed. These must be called from the thread that owns this object. |
| void OnDNSChanged(); |
| void OnIPAddressChanged(); |
| void OnConnectionChanged( |
| NetworkChangeNotifier::ConnectionType connection_type); |
| void OnConnectionSubtypeChanged( |
| NetworkChangeNotifier::ConnectionType connection_type, |
| NetworkChangeNotifier::ConnectionSubtype connection_subtype); |
| |
| protected: |
| // NetworkChangeNotifier overrides. |
| NetworkChangeNotifier::ConnectionType GetCurrentConnectionType() |
| const override; |
| void GetCurrentMaxBandwidthAndConnectionType( |
| double* max_bandwidth_mbps, |
| ConnectionType* connection_type) const override; |
| #if BUILDFLAG(IS_LINUX) |
| AddressMapOwnerLinux* GetAddressMapOwnerInternal() override; |
| #endif |
| |
| private: |
| friend class NetworkChangeNotifierPassiveTest; |
| |
| // For testing purposes, allows specifying a SystemDnsConfigChangeNotifier. |
| // If |system_dns_config_notifier| is nullptr, NetworkChangeNotifier create a |
| // global one. |
| NetworkChangeNotifierPassive( |
| NetworkChangeNotifier::ConnectionType initial_connection_type, |
| NetworkChangeNotifier::ConnectionSubtype initial_connection_subtype, |
| SystemDnsConfigChangeNotifier* system_dns_config_notifier); |
| |
| // Calculates parameters used for network change notifier online/offline |
| // signals. |
| static NetworkChangeNotifier::NetworkChangeCalculatorParams |
| NetworkChangeCalculatorParamsPassive(); |
| |
| THREAD_CHECKER(thread_checker_); |
| |
| #if BUILDFLAG(IS_LINUX) |
| AddressMapCacheLinux address_map_cache_; |
| #endif |
| |
| mutable base::Lock lock_; |
| NetworkChangeNotifier::ConnectionType |
| connection_type_; // Guarded by |lock_|. |
| double max_bandwidth_mbps_; // Guarded by |lock_|. |
| }; |
| |
| } // namespace net |
| |
| #endif // NET_BASE_NETWORK_CHANGE_NOTIFIER_PASSIVE_H_ |