| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CHROME_BROWSER_NET_NQE_UI_NETWORK_QUALITY_ESTIMATOR_SERVICE_H_ | 5 #ifndef CHROME_BROWSER_NET_NQE_UI_NETWORK_QUALITY_ESTIMATOR_SERVICE_H_ |
| 6 #define CHROME_BROWSER_NET_NQE_UI_NETWORK_QUALITY_ESTIMATOR_SERVICE_H_ | 6 #define CHROME_BROWSER_NET_NQE_UI_NETWORK_QUALITY_ESTIMATOR_SERVICE_H_ |
| 7 | 7 |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <map> | 10 #include <map> |
| 11 #include <memory> | 11 #include <memory> |
| 12 | 12 |
| 13 #include "base/macros.h" | 13 #include "base/macros.h" |
| 14 #include "base/memory/weak_ptr.h" | 14 #include "base/memory/weak_ptr.h" |
| 15 #include "base/observer_list.h" | 15 #include "base/observer_list.h" |
| 16 #include "base/time/time.h" | 16 #include "base/time/time.h" |
| 17 #include "components/keyed_service/core/keyed_service.h" | 17 #include "components/keyed_service/core/keyed_service.h" |
| 18 #include "net/nqe/cached_network_quality.h" | 18 #include "net/nqe/cached_network_quality.h" |
| 19 #include "net/nqe/effective_connection_type.h" | 19 #include "net/nqe/effective_connection_type.h" |
| 20 #include "net/nqe/network_id.h" | 20 #include "net/nqe/network_id.h" |
| 21 #include "net/nqe/network_quality_estimator.h" | 21 #include "net/nqe/network_quality_estimator.h" |
| 22 | 22 |
| 23 class PrefRegistrySimple; | 23 class PrefRegistrySimple; |
| 24 class Profile; | 24 class Profile; |
| 25 | 25 |
| 26 namespace net { | 26 namespace net { |
| 27 class EffectiveConnectionTypeObserver; |
| 27 class NetworkQualitiesPrefsManager; | 28 class NetworkQualitiesPrefsManager; |
| 29 class RTTAndThroughputEstimatesObserver; |
| 28 } | 30 } |
| 29 | 31 |
| 30 // UI service to determine the current EffectiveConnectionType. | 32 // UI service to determine the current EffectiveConnectionType. |
| 31 class UINetworkQualityEstimatorService | 33 class UINetworkQualityEstimatorService |
| 32 : public KeyedService, | 34 : public KeyedService, |
| 33 public net::NetworkQualityEstimator::NetworkQualityProvider { | 35 public net::NetworkQualityEstimator::NetworkQualityProvider { |
| 34 public: | 36 public: |
| 35 explicit UINetworkQualityEstimatorService(Profile* profile); | 37 explicit UINetworkQualityEstimatorService(Profile* profile); |
| 36 ~UINetworkQualityEstimatorService() override; | 38 ~UINetworkQualityEstimatorService() override; |
| 37 | 39 |
| 38 // NetworkQualityProvider implementation: | 40 // NetworkQualityProvider implementation: |
| 39 // Must be called on the UI thread. | 41 // Must be called on the UI thread. |
| 40 net::EffectiveConnectionType GetEffectiveConnectionType() const override; | 42 net::EffectiveConnectionType GetEffectiveConnectionType() const override; |
| 41 // Must be called on the UI thread. |observer| will be notified on the UI | |
| 42 // thread. |observer| would be notified of the current effective connection | |
| 43 // type in the next message pump. | |
| 44 void AddEffectiveConnectionTypeObserver( | 43 void AddEffectiveConnectionTypeObserver( |
| 45 net::NetworkQualityEstimator::EffectiveConnectionTypeObserver* observer) | 44 net::EffectiveConnectionTypeObserver* observer) override; |
| 46 override; | |
| 47 // Must be called on the UI thread. | |
| 48 void RemoveEffectiveConnectionTypeObserver( | 45 void RemoveEffectiveConnectionTypeObserver( |
| 49 net::NetworkQualityEstimator::EffectiveConnectionTypeObserver* observer) | 46 net::EffectiveConnectionTypeObserver* observer) override; |
| 50 override; | |
| 51 base::Optional<base::TimeDelta> GetHttpRTT() const override; | 47 base::Optional<base::TimeDelta> GetHttpRTT() const override; |
| 52 base::Optional<base::TimeDelta> GetTransportRTT() const override; | 48 base::Optional<base::TimeDelta> GetTransportRTT() const override; |
| 53 base::Optional<int32_t> GetDownstreamThroughputKbps() const override; | 49 base::Optional<int32_t> GetDownstreamThroughputKbps() const override; |
| 54 | |
| 55 // Must be called on the UI thread. |observer| will be notified on the UI | |
| 56 // thread. |observer| would be notified of the changes in the HTTP RTT, | |
| 57 // transport RTT or throughput. |observer| would be notified of the current | |
| 58 // values in the next message pump. | |
| 59 void AddRTTAndThroughputEstimatesObserver( | 50 void AddRTTAndThroughputEstimatesObserver( |
| 60 net::NetworkQualityEstimator::RTTAndThroughputEstimatesObserver* observer) | 51 net::RTTAndThroughputEstimatesObserver* observer) override; |
| 61 override; | |
| 62 | |
| 63 // Removes |observer| from the list of RTT and throughput estimate observers. | |
| 64 // Must be called on the UI thread. | |
| 65 void RemoveRTTAndThroughputEstimatesObserver( | 52 void RemoveRTTAndThroughputEstimatesObserver( |
| 66 net::NetworkQualityEstimator::RTTAndThroughputEstimatesObserver* observer) | 53 net::RTTAndThroughputEstimatesObserver* observer) override; |
| 67 override; | |
| 68 | 54 |
| 69 // Registers the profile-specific network quality estimator prefs. | 55 // Registers the profile-specific network quality estimator prefs. |
| 70 static void RegisterProfilePrefs(PrefRegistrySimple* registry); | 56 static void RegisterProfilePrefs(PrefRegistrySimple* registry); |
| 71 | 57 |
| 72 // Clear the network quality estimator prefs. | 58 // Clear the network quality estimator prefs. |
| 73 void ClearPrefs(); | 59 void ClearPrefs(); |
| 74 | 60 |
| 75 // Tests can manually set EffectiveConnectionType, but browser tests should | 61 // Tests can manually set EffectiveConnectionType, but browser tests should |
| 76 // expect that the EffectiveConnectionType could change. | 62 // expect that the EffectiveConnectionType could change. |
| 77 void SetEffectiveConnectionTypeForTesting(net::EffectiveConnectionType type); | 63 void SetEffectiveConnectionTypeForTesting(net::EffectiveConnectionType type); |
| 78 | 64 |
| 79 // Reads the prefs from the disk, parses them into a map of NetworkIDs and | 65 // Reads the prefs from the disk, parses them into a map of NetworkIDs and |
| 80 // CachedNetworkQualities, and returns the map. | 66 // CachedNetworkQualities, and returns the map. |
| 81 std::map<net::nqe::internal::NetworkID, | 67 std::map<net::nqe::internal::NetworkID, |
| 82 net::nqe::internal::CachedNetworkQuality> | 68 net::nqe::internal::CachedNetworkQuality> |
| 83 ForceReadPrefsForTesting() const; | 69 ForceReadPrefsForTesting() const; |
| 84 | 70 |
| 85 private: | 71 private: |
| 86 class IONetworkQualityObserver; | 72 class IONetworkQualityObserver; |
| 87 | 73 |
| 88 // Notifies |observer| of the current effective connection type if |observer| | 74 // Notifies |observer| of the current effective connection type if |observer| |
| 89 // is still registered as an observer. | 75 // is still registered as an observer. |
| 90 void NotifyEffectiveConnectionTypeObserverIfPresent( | 76 void NotifyEffectiveConnectionTypeObserverIfPresent( |
| 91 net::NetworkQualityEstimator::EffectiveConnectionTypeObserver* observer) | 77 net::EffectiveConnectionTypeObserver* observer) const; |
| 92 const; | |
| 93 | 78 |
| 94 // Notifies |observer| of the current effective connection type if |observer| | 79 // Notifies |observer| of the current effective connection type if |observer| |
| 95 // is still registered as an observer. | 80 // is still registered as an observer. |
| 96 void NotifyRTTAndThroughputObserverIfPresent( | 81 void NotifyRTTAndThroughputObserverIfPresent( |
| 97 net::NetworkQualityEstimator::RTTAndThroughputEstimatesObserver* observer) | 82 net::RTTAndThroughputEstimatesObserver* observer) const; |
| 98 const; | |
| 99 | 83 |
| 100 // KeyedService implementation: | 84 // KeyedService implementation: |
| 101 void Shutdown() override; | 85 void Shutdown() override; |
| 102 | 86 |
| 103 // Called when the EffectiveConnectionType has updated to |type|. | 87 // Called when the EffectiveConnectionType has updated to |type|. |
| 104 // NetworkQualityEstimator::EffectiveConnectionType is an estimate of the | 88 // NetworkQualityEstimator::EffectiveConnectionType is an estimate of the |
| 105 // quality of the network that may differ from the actual network type | 89 // quality of the network that may differ from the actual network type |
| 106 // reported by NetworkchangeNotifier::GetConnectionType. | 90 // reported by NetworkchangeNotifier::GetConnectionType. |
| 107 void EffectiveConnectionTypeChanged(net::EffectiveConnectionType type); | 91 void EffectiveConnectionTypeChanged(net::EffectiveConnectionType type); |
| 108 | 92 |
| 109 // Called when the estimated HTTP RTT, estimated transport RTT or estimated | 93 // Called when the estimated HTTP RTT, estimated transport RTT or estimated |
| 110 // downstream throughput is computed. | 94 // downstream throughput is computed. |
| 111 void RTTOrThroughputComputed(base::TimeDelta http_rtt, | 95 void RTTOrThroughputComputed(base::TimeDelta http_rtt, |
| 112 base::TimeDelta transport_rtt, | 96 base::TimeDelta transport_rtt, |
| 113 int32_t downstream_throughput_kbps); | 97 int32_t downstream_throughput_kbps); |
| 114 | 98 |
| 115 // The current EffectiveConnectionType. | 99 // The current EffectiveConnectionType. |
| 116 net::EffectiveConnectionType type_; | 100 net::EffectiveConnectionType type_; |
| 117 | 101 |
| 118 // Current network quality metrics. | 102 // Current network quality metrics. |
| 119 base::TimeDelta http_rtt_; | 103 base::TimeDelta http_rtt_; |
| 120 base::TimeDelta transport_rtt_; | 104 base::TimeDelta transport_rtt_; |
| 121 int32_t downstream_throughput_kbps_; | 105 int32_t downstream_throughput_kbps_; |
| 122 | 106 |
| 123 // IO thread based observer that is owned by this service. Created on the UI | 107 // IO thread based observer that is owned by this service. Created on the UI |
| 124 // thread, but used and deleted on the IO thread. | 108 // thread, but used and deleted on the IO thread. |
| 125 std::unique_ptr<IONetworkQualityObserver> io_observer_; | 109 std::unique_ptr<IONetworkQualityObserver> io_observer_; |
| 126 | 110 |
| 127 // Observer list for changes in effective connection type. | 111 // Observer list for changes in effective connection type. |
| 128 base::ObserverList< | 112 base::ObserverList<net::EffectiveConnectionTypeObserver> |
| 129 net::NetworkQualityEstimator::EffectiveConnectionTypeObserver> | |
| 130 effective_connection_type_observer_list_; | 113 effective_connection_type_observer_list_; |
| 131 | 114 |
| 132 // Observer list for changes in RTT or throughput values. | 115 // Observer list for changes in RTT or throughput values. |
| 133 base::ObserverList< | 116 base::ObserverList<net::RTTAndThroughputEstimatesObserver> |
| 134 net::NetworkQualityEstimator::RTTAndThroughputEstimatesObserver> | |
| 135 rtt_throughput_observer_list_; | 117 rtt_throughput_observer_list_; |
| 136 | 118 |
| 137 // Prefs manager that is owned by this service. Created on the UI thread, but | 119 // Prefs manager that is owned by this service. Created on the UI thread, but |
| 138 // used and deleted on the IO thread. | 120 // used and deleted on the IO thread. |
| 139 std::unique_ptr<net::NetworkQualitiesPrefsManager> prefs_manager_; | 121 std::unique_ptr<net::NetworkQualitiesPrefsManager> prefs_manager_; |
| 140 | 122 |
| 141 base::WeakPtrFactory<UINetworkQualityEstimatorService> weak_factory_; | 123 base::WeakPtrFactory<UINetworkQualityEstimatorService> weak_factory_; |
| 142 | 124 |
| 143 DISALLOW_COPY_AND_ASSIGN(UINetworkQualityEstimatorService); | 125 DISALLOW_COPY_AND_ASSIGN(UINetworkQualityEstimatorService); |
| 144 }; | 126 }; |
| 145 | 127 |
| 146 #endif // CHROME_BROWSER_NET_NQE_UI_NETWORK_QUALITY_ESTIMATOR_SERVICE_H_ | 128 #endif // CHROME_BROWSER_NET_NQE_UI_NETWORK_QUALITY_ESTIMATOR_SERVICE_H_ |
| OLD | NEW |