network_qualities_pref_delegate.cc 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "services/network/network_qualities_pref_delegate.h"
  5. #include <memory>
  6. #include <string>
  7. #include "base/bind.h"
  8. #include "base/memory/ptr_util.h"
  9. #include "base/memory/raw_ptr.h"
  10. #include "base/metrics/histogram_macros.h"
  11. #include "base/values.h"
  12. #include "components/prefs/pref_registry.h"
  13. #include "components/prefs/pref_registry_simple.h"
  14. #include "components/prefs/pref_service.h"
  15. #include "net/http/http_server_properties.h"
  16. #include "net/nqe/network_quality_estimator.h"
  17. #include "net/nqe/pref_names.h"
  18. namespace {
  19. // PrefDelegateImpl writes the provided dictionary value to the network quality
  20. // estimator prefs on the disk.
  21. class PrefDelegateImpl
  22. : public net::NetworkQualitiesPrefsManager::PrefDelegate {
  23. public:
  24. // |pref_service| is used to read and write prefs from/to the disk.
  25. explicit PrefDelegateImpl(PrefService* pref_service)
  26. : pref_service_(pref_service), path_(net::nqe::kNetworkQualities) {
  27. DCHECK(pref_service_);
  28. }
  29. PrefDelegateImpl(const PrefDelegateImpl&) = delete;
  30. PrefDelegateImpl& operator=(const PrefDelegateImpl&) = delete;
  31. ~PrefDelegateImpl() override {}
  32. void SetDictionaryValue(const base::Value::Dict& dict) override {
  33. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  34. pref_service_->SetDict(path_, dict.Clone());
  35. UMA_HISTOGRAM_EXACT_LINEAR("NQE.Prefs.WriteCount", 1, 2);
  36. }
  37. base::Value::Dict GetDictionaryValue() override {
  38. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  39. UMA_HISTOGRAM_EXACT_LINEAR("NQE.Prefs.ReadCount", 1, 2);
  40. return pref_service_->GetValueDict(path_).Clone();
  41. }
  42. private:
  43. raw_ptr<PrefService> pref_service_;
  44. // |path_| is the location of the network quality estimator prefs.
  45. const std::string path_;
  46. SEQUENCE_CHECKER(sequence_checker_);
  47. };
  48. // Returns true if |pref_service| has been initialized.
  49. bool IsPrefServiceInitialized(PrefService* pref_service) {
  50. return pref_service->GetInitializationStatus() !=
  51. PrefService::INITIALIZATION_STATUS_WAITING;
  52. }
  53. } // namespace
  54. namespace network {
  55. NetworkQualitiesPrefDelegate::NetworkQualitiesPrefDelegate(
  56. PrefService* pref_service,
  57. net::NetworkQualityEstimator* network_quality_estimator)
  58. : prefs_manager_(std::make_unique<PrefDelegateImpl>(pref_service)),
  59. network_quality_estimator_(network_quality_estimator) {
  60. DCHECK(pref_service);
  61. DCHECK(network_quality_estimator_);
  62. if (IsPrefServiceInitialized(pref_service)) {
  63. OnPrefServiceInitialized(true);
  64. } else {
  65. // Register for a callback that will be invoked when |pref_service| is
  66. // initialized.
  67. pref_service->AddPrefInitObserver(
  68. base::BindOnce(&NetworkQualitiesPrefDelegate::OnPrefServiceInitialized,
  69. weak_ptr_factory_.GetWeakPtr()));
  70. }
  71. }
  72. NetworkQualitiesPrefDelegate::~NetworkQualitiesPrefDelegate() {
  73. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  74. }
  75. void NetworkQualitiesPrefDelegate::OnPrefServiceInitialized(bool success) {
  76. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  77. prefs_manager_.InitializeOnNetworkThread(network_quality_estimator_);
  78. }
  79. void NetworkQualitiesPrefDelegate::ClearPrefs() {
  80. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  81. prefs_manager_.ClearPrefs();
  82. }
  83. // static
  84. void NetworkQualitiesPrefDelegate::RegisterPrefs(PrefRegistrySimple* registry) {
  85. registry->RegisterDictionaryPref(net::nqe::kNetworkQualities);
  86. }
  87. std::map<net::nqe::internal::NetworkID,
  88. net::nqe::internal::CachedNetworkQuality>
  89. NetworkQualitiesPrefDelegate::ForceReadPrefsForTesting() const {
  90. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  91. return prefs_manager_.ForceReadPrefsForTesting();
  92. }
  93. } // namespace network