xref: /aosp_15_r20/external/cronet/components/cronet/host_cache_persistence_manager.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2017 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 "components/cronet/host_cache_persistence_manager.h"
6 
7 #include <memory>
8 
9 #include "base/functional/bind.h"
10 #include "base/values.h"
11 #include "components/prefs/pref_service.h"
12 #include "net/log/net_log.h"
13 
14 namespace cronet {
15 
HostCachePersistenceManager(net::HostCache * cache,PrefService * pref_service,std::string pref_name,base::TimeDelta delay,net::NetLog * net_log)16 HostCachePersistenceManager::HostCachePersistenceManager(
17     net::HostCache* cache,
18     PrefService* pref_service,
19     std::string pref_name,
20     base::TimeDelta delay,
21     net::NetLog* net_log)
22     : cache_(cache),
23       pref_service_(pref_service),
24       pref_name_(pref_name),
25       writing_pref_(false),
26       delay_(delay),
27       net_log_(net::NetLogWithSource::Make(
28           net_log,
29           net::NetLogSourceType::HOST_CACHE_PERSISTENCE_MANAGER)) {
30   DCHECK(cache_);
31   DCHECK(pref_service_);
32 
33   // Get the initial value of the pref if it's already initialized.
34   if (pref_service_->HasPrefPath(pref_name_))
35     ReadFromDisk();
36 
37   registrar_.Init(pref_service_);
38   registrar_.Add(pref_name_,
39                  base::BindRepeating(&HostCachePersistenceManager::ReadFromDisk,
40                                      weak_factory_.GetWeakPtr()));
41   cache_->set_persistence_delegate(this);
42 }
43 
~HostCachePersistenceManager()44 HostCachePersistenceManager::~HostCachePersistenceManager() {
45   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
46 
47   timer_.Stop();
48   registrar_.RemoveAll();
49   cache_->set_persistence_delegate(nullptr);
50 }
51 
ReadFromDisk()52 void HostCachePersistenceManager::ReadFromDisk() {
53   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
54 
55   if (writing_pref_)
56     return;
57 
58   net_log_.BeginEvent(net::NetLogEventType::HOST_CACHE_PREF_READ);
59   const base::Value::List& pref_value = pref_service_->GetList(pref_name_);
60   bool success = cache_->RestoreFromListValue(pref_value);
61   net_log_.AddEntryWithBoolParams(net::NetLogEventType::HOST_CACHE_PREF_READ,
62                                   net::NetLogEventPhase::END, "success",
63                                   success);
64 }
65 
ScheduleWrite()66 void HostCachePersistenceManager::ScheduleWrite() {
67   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
68 
69   if (timer_.IsRunning())
70     return;
71 
72   net_log_.AddEvent(net::NetLogEventType::HOST_CACHE_PERSISTENCE_START_TIMER);
73   timer_.Start(FROM_HERE, delay_,
74                base::BindOnce(&HostCachePersistenceManager::WriteToDisk,
75                               weak_factory_.GetWeakPtr()));
76 }
77 
WriteToDisk()78 void HostCachePersistenceManager::WriteToDisk() {
79   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
80 
81   net_log_.AddEvent(net::NetLogEventType::HOST_CACHE_PREF_WRITE);
82   base::Value::List list;
83   cache_->GetList(list, false, net::HostCache::SerializationType::kRestorable);
84   writing_pref_ = true;
85   pref_service_->SetList(pref_name_, std::move(list));
86   writing_pref_ = false;
87 }
88 
89 }  // namespace cronet
90