xref: /aosp_15_r20/external/cronet/net/disk_cache/disk_cache.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include <utility>
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include "base/barrier_closure.h"
8*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/files/file_util.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/metrics/field_trial.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/task/bind_post_task.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/task/sequenced_task_runner.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/task/single_thread_task_runner.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/task/thread_pool/thread_pool_instance.h"
18*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
19*6777b538SAndroid Build Coastguard Worker #include "net/base/cache_type.h"
20*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
21*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/backend_cleanup_tracker.h"
22*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/blockfile/backend_impl.h"
23*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/cache_util.h"
24*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/disk_cache.h"
25*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/memory/mem_backend_impl.h"
26*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/simple/simple_backend_impl.h"
27*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/simple/simple_file_enumerator.h"
28*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/simple/simple_util.h"
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker namespace {
31*6777b538SAndroid Build Coastguard Worker 
32*6777b538SAndroid Build Coastguard Worker using FileEnumerator = disk_cache::BackendFileOperations::FileEnumerator;
33*6777b538SAndroid Build Coastguard Worker using ApplicationStatusListenerGetter =
34*6777b538SAndroid Build Coastguard Worker     disk_cache::ApplicationStatusListenerGetter;
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker // Builds an instance of the backend depending on platform, type, experiments
37*6777b538SAndroid Build Coastguard Worker // etc. Takes care of the retry state. This object will self-destroy when
38*6777b538SAndroid Build Coastguard Worker // finished.
39*6777b538SAndroid Build Coastguard Worker class CacheCreator {
40*6777b538SAndroid Build Coastguard Worker  public:
41*6777b538SAndroid Build Coastguard Worker   CacheCreator(const base::FilePath& path,
42*6777b538SAndroid Build Coastguard Worker                disk_cache::ResetHandling reset_handling,
43*6777b538SAndroid Build Coastguard Worker                int64_t max_bytes,
44*6777b538SAndroid Build Coastguard Worker                net::CacheType type,
45*6777b538SAndroid Build Coastguard Worker                net::BackendType backend_type,
46*6777b538SAndroid Build Coastguard Worker                scoped_refptr<disk_cache::BackendFileOperationsFactory>
47*6777b538SAndroid Build Coastguard Worker                    file_operations_factory,
48*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
49*6777b538SAndroid Build Coastguard Worker                ApplicationStatusListenerGetter app_status_listener_getter,
50*6777b538SAndroid Build Coastguard Worker #endif
51*6777b538SAndroid Build Coastguard Worker                net::NetLog* net_log,
52*6777b538SAndroid Build Coastguard Worker                base::OnceClosure post_cleanup_callback,
53*6777b538SAndroid Build Coastguard Worker                disk_cache::BackendResultCallback callback);
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker   CacheCreator(const CacheCreator&) = delete;
56*6777b538SAndroid Build Coastguard Worker   CacheCreator& operator=(const CacheCreator&) = delete;
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker   // Wait for any previous backends for given path to finish clean up and then
59*6777b538SAndroid Build Coastguard Worker   // attempt to create a new one. This will never succeed synchronously, though
60*6777b538SAndroid Build Coastguard Worker   // it may fail synchronously.
61*6777b538SAndroid Build Coastguard Worker   net::Error TryCreateCleanupTrackerAndRun();
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker   // Creates the backend, the cleanup context for it having been already
64*6777b538SAndroid Build Coastguard Worker   // established... or purposefully left as null. This will never succeed
65*6777b538SAndroid Build Coastguard Worker   // synchronously, though it may fail synchronously.
66*6777b538SAndroid Build Coastguard Worker   net::Error Run();
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker  private:
69*6777b538SAndroid Build Coastguard Worker   ~CacheCreator();
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker   void DoCallback(int result);
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker   void OnIOComplete(int result);
74*6777b538SAndroid Build Coastguard Worker   void OnCacheCleanupComplete(int original_error, bool cleanup_result);
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker   const base::FilePath path_;
77*6777b538SAndroid Build Coastguard Worker   disk_cache::ResetHandling reset_handling_;
78*6777b538SAndroid Build Coastguard Worker   bool retry_ = false;
79*6777b538SAndroid Build Coastguard Worker   int64_t max_bytes_;
80*6777b538SAndroid Build Coastguard Worker   net::CacheType type_;
81*6777b538SAndroid Build Coastguard Worker   net::BackendType backend_type_;
82*6777b538SAndroid Build Coastguard Worker   scoped_refptr<disk_cache::BackendFileOperationsFactory>
83*6777b538SAndroid Build Coastguard Worker       file_operations_factory_;
84*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<disk_cache::BackendFileOperations> file_operations_;
85*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
86*6777b538SAndroid Build Coastguard Worker   ApplicationStatusListenerGetter app_status_listener_getter_;
87*6777b538SAndroid Build Coastguard Worker #endif
88*6777b538SAndroid Build Coastguard Worker   base::OnceClosure post_cleanup_callback_;
89*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResultCallback callback_;
90*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<disk_cache::Backend> created_cache_;
91*6777b538SAndroid Build Coastguard Worker   raw_ptr<net::NetLog> net_log_;
92*6777b538SAndroid Build Coastguard Worker   scoped_refptr<disk_cache::BackendCleanupTracker> cleanup_tracker_;
93*6777b538SAndroid Build Coastguard Worker };
94*6777b538SAndroid Build Coastguard Worker 
CacheCreator(const base::FilePath & path,disk_cache::ResetHandling reset_handling,int64_t max_bytes,net::CacheType type,net::BackendType backend_type,scoped_refptr<disk_cache::BackendFileOperationsFactory> file_operations,ApplicationStatusListenerGetter app_status_listener_getter,net::NetLog * net_log,base::OnceClosure post_cleanup_callback,disk_cache::BackendResultCallback callback)95*6777b538SAndroid Build Coastguard Worker CacheCreator::CacheCreator(
96*6777b538SAndroid Build Coastguard Worker     const base::FilePath& path,
97*6777b538SAndroid Build Coastguard Worker     disk_cache::ResetHandling reset_handling,
98*6777b538SAndroid Build Coastguard Worker     int64_t max_bytes,
99*6777b538SAndroid Build Coastguard Worker     net::CacheType type,
100*6777b538SAndroid Build Coastguard Worker     net::BackendType backend_type,
101*6777b538SAndroid Build Coastguard Worker     scoped_refptr<disk_cache::BackendFileOperationsFactory> file_operations,
102*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
103*6777b538SAndroid Build Coastguard Worker     ApplicationStatusListenerGetter app_status_listener_getter,
104*6777b538SAndroid Build Coastguard Worker #endif
105*6777b538SAndroid Build Coastguard Worker     net::NetLog* net_log,
106*6777b538SAndroid Build Coastguard Worker     base::OnceClosure post_cleanup_callback,
107*6777b538SAndroid Build Coastguard Worker     disk_cache::BackendResultCallback callback)
108*6777b538SAndroid Build Coastguard Worker     : path_(path),
109*6777b538SAndroid Build Coastguard Worker       reset_handling_(reset_handling),
110*6777b538SAndroid Build Coastguard Worker       max_bytes_(max_bytes),
111*6777b538SAndroid Build Coastguard Worker       type_(type),
112*6777b538SAndroid Build Coastguard Worker       backend_type_(backend_type),
113*6777b538SAndroid Build Coastguard Worker       file_operations_factory_(std::move(file_operations)),
114*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
115*6777b538SAndroid Build Coastguard Worker       app_status_listener_getter_(std::move(app_status_listener_getter)),
116*6777b538SAndroid Build Coastguard Worker #endif
117*6777b538SAndroid Build Coastguard Worker       post_cleanup_callback_(std::move(post_cleanup_callback)),
118*6777b538SAndroid Build Coastguard Worker       callback_(std::move(callback)),
119*6777b538SAndroid Build Coastguard Worker       net_log_(net_log) {
120*6777b538SAndroid Build Coastguard Worker }
121*6777b538SAndroid Build Coastguard Worker 
122*6777b538SAndroid Build Coastguard Worker CacheCreator::~CacheCreator() = default;
123*6777b538SAndroid Build Coastguard Worker 
Run()124*6777b538SAndroid Build Coastguard Worker net::Error CacheCreator::Run() {
125*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
126*6777b538SAndroid Build Coastguard Worker   static const bool kSimpleBackendIsDefault = true;
127*6777b538SAndroid Build Coastguard Worker #else
128*6777b538SAndroid Build Coastguard Worker   static const bool kSimpleBackendIsDefault = false;
129*6777b538SAndroid Build Coastguard Worker #endif
130*6777b538SAndroid Build Coastguard Worker   if (!retry_ && reset_handling_ == disk_cache::ResetHandling::kReset) {
131*6777b538SAndroid Build Coastguard Worker     // Pretend that we failed to create a cache, so that we can handle `kReset`
132*6777b538SAndroid Build Coastguard Worker     // and `kResetOnError` in a unified way, in CacheCreator::OnIOComplete.
133*6777b538SAndroid Build Coastguard Worker     base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
134*6777b538SAndroid Build Coastguard Worker         FROM_HERE, base::BindOnce(&CacheCreator::OnIOComplete,
135*6777b538SAndroid Build Coastguard Worker                                   base::Unretained(this), net::ERR_FAILED));
136*6777b538SAndroid Build Coastguard Worker     return net::ERR_IO_PENDING;
137*6777b538SAndroid Build Coastguard Worker   }
138*6777b538SAndroid Build Coastguard Worker   if (backend_type_ == net::CACHE_BACKEND_SIMPLE ||
139*6777b538SAndroid Build Coastguard Worker       (backend_type_ == net::CACHE_BACKEND_DEFAULT &&
140*6777b538SAndroid Build Coastguard Worker        kSimpleBackendIsDefault)) {
141*6777b538SAndroid Build Coastguard Worker     auto cache = std::make_unique<disk_cache::SimpleBackendImpl>(
142*6777b538SAndroid Build Coastguard Worker         file_operations_factory_, path_, cleanup_tracker_.get(),
143*6777b538SAndroid Build Coastguard Worker         /* file_tracker = */ nullptr, max_bytes_, type_, net_log_);
144*6777b538SAndroid Build Coastguard Worker     disk_cache::SimpleBackendImpl* simple_cache = cache.get();
145*6777b538SAndroid Build Coastguard Worker     created_cache_ = std::move(cache);
146*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
147*6777b538SAndroid Build Coastguard Worker     if (app_status_listener_getter_) {
148*6777b538SAndroid Build Coastguard Worker       simple_cache->set_app_status_listener_getter(app_status_listener_getter_);
149*6777b538SAndroid Build Coastguard Worker     }
150*6777b538SAndroid Build Coastguard Worker #endif
151*6777b538SAndroid Build Coastguard Worker     simple_cache->Init(
152*6777b538SAndroid Build Coastguard Worker         base::BindOnce(&CacheCreator::OnIOComplete, base::Unretained(this)));
153*6777b538SAndroid Build Coastguard Worker     return net::ERR_IO_PENDING;
154*6777b538SAndroid Build Coastguard Worker   }
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker // Avoid references to blockfile functions on Android to reduce binary size.
157*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
158*6777b538SAndroid Build Coastguard Worker   return net::ERR_FAILED;
159*6777b538SAndroid Build Coastguard Worker #else
160*6777b538SAndroid Build Coastguard Worker   auto cache = std::make_unique<disk_cache::BackendImpl>(
161*6777b538SAndroid Build Coastguard Worker       path_, cleanup_tracker_.get(),
162*6777b538SAndroid Build Coastguard Worker       /*cache_thread = */ nullptr, type_, net_log_);
163*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendImpl* new_cache = cache.get();
164*6777b538SAndroid Build Coastguard Worker   created_cache_ = std::move(cache);
165*6777b538SAndroid Build Coastguard Worker   new_cache->SetMaxSize(max_bytes_);
166*6777b538SAndroid Build Coastguard Worker   new_cache->Init(
167*6777b538SAndroid Build Coastguard Worker       base::BindOnce(&CacheCreator::OnIOComplete, base::Unretained(this)));
168*6777b538SAndroid Build Coastguard Worker   return net::ERR_IO_PENDING;
169*6777b538SAndroid Build Coastguard Worker #endif
170*6777b538SAndroid Build Coastguard Worker }
171*6777b538SAndroid Build Coastguard Worker 
TryCreateCleanupTrackerAndRun()172*6777b538SAndroid Build Coastguard Worker net::Error CacheCreator::TryCreateCleanupTrackerAndRun() {
173*6777b538SAndroid Build Coastguard Worker   // Before creating a cache Backend, a BackendCleanupTracker object is needed
174*6777b538SAndroid Build Coastguard Worker   // so there is a place to keep track of outstanding I/O even after the backend
175*6777b538SAndroid Build Coastguard Worker   // object itself is destroyed, so that further use of the directory
176*6777b538SAndroid Build Coastguard Worker   // doesn't race with those outstanding disk I/O ops.
177*6777b538SAndroid Build Coastguard Worker 
178*6777b538SAndroid Build Coastguard Worker   // This method's purpose it to grab exlusive ownership of a fresh
179*6777b538SAndroid Build Coastguard Worker   // BackendCleanupTracker for the cache path, and then move on to Run(),
180*6777b538SAndroid Build Coastguard Worker   // which will take care of creating the actual cache backend. It's possible
181*6777b538SAndroid Build Coastguard Worker   // that something else is currently making use of the directory, in which
182*6777b538SAndroid Build Coastguard Worker   // case BackendCleanupTracker::TryCreate will fail, but will just have
183*6777b538SAndroid Build Coastguard Worker   // TryCreateCleanupTrackerAndRun run again at an opportune time to make
184*6777b538SAndroid Build Coastguard Worker   // another attempt.
185*6777b538SAndroid Build Coastguard Worker 
186*6777b538SAndroid Build Coastguard Worker   // The resulting BackendCleanupTracker is stored into a scoped_refptr member
187*6777b538SAndroid Build Coastguard Worker   // so that it's kept alive while |this| CacheCreator exists , so that in the
188*6777b538SAndroid Build Coastguard Worker   // case Run() needs to retry Backend creation the same BackendCleanupTracker
189*6777b538SAndroid Build Coastguard Worker   // is used for both attempts, and |post_cleanup_callback_| gets called after
190*6777b538SAndroid Build Coastguard Worker   // the second try, not the first one.
191*6777b538SAndroid Build Coastguard Worker   cleanup_tracker_ = disk_cache::BackendCleanupTracker::TryCreate(
192*6777b538SAndroid Build Coastguard Worker       path_, base::BindOnce(base::IgnoreResult(
193*6777b538SAndroid Build Coastguard Worker                                 &CacheCreator::TryCreateCleanupTrackerAndRun),
194*6777b538SAndroid Build Coastguard Worker                             base::Unretained(this)));
195*6777b538SAndroid Build Coastguard Worker   if (!cleanup_tracker_)
196*6777b538SAndroid Build Coastguard Worker     return net::ERR_IO_PENDING;
197*6777b538SAndroid Build Coastguard Worker   if (!post_cleanup_callback_.is_null())
198*6777b538SAndroid Build Coastguard Worker     cleanup_tracker_->AddPostCleanupCallback(std::move(post_cleanup_callback_));
199*6777b538SAndroid Build Coastguard Worker   return Run();
200*6777b538SAndroid Build Coastguard Worker }
201*6777b538SAndroid Build Coastguard Worker 
DoCallback(int net_error)202*6777b538SAndroid Build Coastguard Worker void CacheCreator::DoCallback(int net_error) {
203*6777b538SAndroid Build Coastguard Worker   DCHECK_NE(net::ERR_IO_PENDING, net_error);
204*6777b538SAndroid Build Coastguard Worker   disk_cache::BackendResult result;
205*6777b538SAndroid Build Coastguard Worker   if (net_error == net::OK) {
206*6777b538SAndroid Build Coastguard Worker     result = disk_cache::BackendResult::Make(std::move(created_cache_));
207*6777b538SAndroid Build Coastguard Worker   } else {
208*6777b538SAndroid Build Coastguard Worker     LOG(ERROR) << "Unable to create cache";
209*6777b538SAndroid Build Coastguard Worker     result = disk_cache::BackendResult::MakeError(
210*6777b538SAndroid Build Coastguard Worker         static_cast<net::Error>(net_error));
211*6777b538SAndroid Build Coastguard Worker     created_cache_.reset();
212*6777b538SAndroid Build Coastguard Worker   }
213*6777b538SAndroid Build Coastguard Worker   std::move(callback_).Run(std::move(result));
214*6777b538SAndroid Build Coastguard Worker   delete this;
215*6777b538SAndroid Build Coastguard Worker }
216*6777b538SAndroid Build Coastguard Worker 
217*6777b538SAndroid Build Coastguard Worker // If the initialization of the cache fails, and |reset_handling| isn't set to
218*6777b538SAndroid Build Coastguard Worker // kNeverReset, we will discard the whole cache and create a new one.
OnIOComplete(int result)219*6777b538SAndroid Build Coastguard Worker void CacheCreator::OnIOComplete(int result) {
220*6777b538SAndroid Build Coastguard Worker   DCHECK_NE(result, net::ERR_IO_PENDING);
221*6777b538SAndroid Build Coastguard Worker   if (result == net::OK ||
222*6777b538SAndroid Build Coastguard Worker       reset_handling_ == disk_cache::ResetHandling::kNeverReset || retry_) {
223*6777b538SAndroid Build Coastguard Worker     return DoCallback(result);
224*6777b538SAndroid Build Coastguard Worker   }
225*6777b538SAndroid Build Coastguard Worker 
226*6777b538SAndroid Build Coastguard Worker   // We are supposed to try again, so delete the object and all files and do so.
227*6777b538SAndroid Build Coastguard Worker   retry_ = true;
228*6777b538SAndroid Build Coastguard Worker   created_cache_.reset();
229*6777b538SAndroid Build Coastguard Worker 
230*6777b538SAndroid Build Coastguard Worker   if (!file_operations_) {
231*6777b538SAndroid Build Coastguard Worker     if (file_operations_factory_) {
232*6777b538SAndroid Build Coastguard Worker       file_operations_ = file_operations_factory_->Create(
233*6777b538SAndroid Build Coastguard Worker           base::SequencedTaskRunner::GetCurrentDefault());
234*6777b538SAndroid Build Coastguard Worker     } else {
235*6777b538SAndroid Build Coastguard Worker       file_operations_ = std::make_unique<disk_cache::TrivialFileOperations>();
236*6777b538SAndroid Build Coastguard Worker     }
237*6777b538SAndroid Build Coastguard Worker   }
238*6777b538SAndroid Build Coastguard Worker   file_operations_->CleanupDirectory(
239*6777b538SAndroid Build Coastguard Worker       path_, base::BindOnce(&CacheCreator::OnCacheCleanupComplete,
240*6777b538SAndroid Build Coastguard Worker                             base::Unretained(this), result));
241*6777b538SAndroid Build Coastguard Worker }
242*6777b538SAndroid Build Coastguard Worker 
OnCacheCleanupComplete(int original_result,bool cleanup_result)243*6777b538SAndroid Build Coastguard Worker void CacheCreator::OnCacheCleanupComplete(int original_result,
244*6777b538SAndroid Build Coastguard Worker                                           bool cleanup_result) {
245*6777b538SAndroid Build Coastguard Worker   if (!cleanup_result) {
246*6777b538SAndroid Build Coastguard Worker     // Cleaning up the cache directory fails, so this operation should be
247*6777b538SAndroid Build Coastguard Worker     // considered failed.
248*6777b538SAndroid Build Coastguard Worker     DCHECK_NE(original_result, net::OK);
249*6777b538SAndroid Build Coastguard Worker     DCHECK_NE(original_result, net::ERR_IO_PENDING);
250*6777b538SAndroid Build Coastguard Worker     DoCallback(original_result);
251*6777b538SAndroid Build Coastguard Worker     return;
252*6777b538SAndroid Build Coastguard Worker   }
253*6777b538SAndroid Build Coastguard Worker 
254*6777b538SAndroid Build Coastguard Worker   // The worker thread may be deleting files, but the original folder
255*6777b538SAndroid Build Coastguard Worker   // is not there anymore... let's create a new set of files.
256*6777b538SAndroid Build Coastguard Worker   int rv = Run();
257*6777b538SAndroid Build Coastguard Worker   DCHECK_EQ(net::ERR_IO_PENDING, rv);
258*6777b538SAndroid Build Coastguard Worker }
259*6777b538SAndroid Build Coastguard Worker 
260*6777b538SAndroid Build Coastguard Worker class TrivialFileEnumerator final : public FileEnumerator {
261*6777b538SAndroid Build Coastguard Worker  public:
262*6777b538SAndroid Build Coastguard Worker   using FileEnumerationEntry =
263*6777b538SAndroid Build Coastguard Worker       disk_cache::BackendFileOperations::FileEnumerationEntry;
264*6777b538SAndroid Build Coastguard Worker 
TrivialFileEnumerator(const base::FilePath & path)265*6777b538SAndroid Build Coastguard Worker   explicit TrivialFileEnumerator(const base::FilePath& path)
266*6777b538SAndroid Build Coastguard Worker       : enumerator_(path) {}
267*6777b538SAndroid Build Coastguard Worker   ~TrivialFileEnumerator() override = default;
268*6777b538SAndroid Build Coastguard Worker 
Next()269*6777b538SAndroid Build Coastguard Worker   std::optional<FileEnumerationEntry> Next() override {
270*6777b538SAndroid Build Coastguard Worker     return enumerator_.Next();
271*6777b538SAndroid Build Coastguard Worker   }
HasError() const272*6777b538SAndroid Build Coastguard Worker   bool HasError() const override { return enumerator_.HasError(); }
273*6777b538SAndroid Build Coastguard Worker 
274*6777b538SAndroid Build Coastguard Worker  private:
275*6777b538SAndroid Build Coastguard Worker   disk_cache::SimpleFileEnumerator enumerator_;
276*6777b538SAndroid Build Coastguard Worker };
277*6777b538SAndroid Build Coastguard Worker 
278*6777b538SAndroid Build Coastguard Worker class UnboundTrivialFileOperations
279*6777b538SAndroid Build Coastguard Worker     : public disk_cache::UnboundBackendFileOperations {
280*6777b538SAndroid Build Coastguard Worker  public:
Bind(scoped_refptr<base::SequencedTaskRunner> task_runner)281*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<disk_cache::BackendFileOperations> Bind(
282*6777b538SAndroid Build Coastguard Worker       scoped_refptr<base::SequencedTaskRunner> task_runner) override {
283*6777b538SAndroid Build Coastguard Worker     return std::make_unique<disk_cache::TrivialFileOperations>();
284*6777b538SAndroid Build Coastguard Worker   }
285*6777b538SAndroid Build Coastguard Worker };
286*6777b538SAndroid Build Coastguard Worker 
287*6777b538SAndroid Build Coastguard Worker }  // namespace
288*6777b538SAndroid Build Coastguard Worker 
289*6777b538SAndroid Build Coastguard Worker namespace disk_cache {
290*6777b538SAndroid Build Coastguard Worker 
291*6777b538SAndroid Build Coastguard Worker BackendResult::BackendResult() = default;
292*6777b538SAndroid Build Coastguard Worker BackendResult::~BackendResult() = default;
293*6777b538SAndroid Build Coastguard Worker BackendResult::BackendResult(BackendResult&&) = default;
294*6777b538SAndroid Build Coastguard Worker BackendResult& BackendResult::operator=(BackendResult&&) = default;
295*6777b538SAndroid Build Coastguard Worker 
296*6777b538SAndroid Build Coastguard Worker // static
MakeError(net::Error error_in)297*6777b538SAndroid Build Coastguard Worker BackendResult BackendResult::MakeError(net::Error error_in) {
298*6777b538SAndroid Build Coastguard Worker   DCHECK_NE(error_in, net::OK);
299*6777b538SAndroid Build Coastguard Worker   BackendResult result;
300*6777b538SAndroid Build Coastguard Worker   result.net_error = error_in;
301*6777b538SAndroid Build Coastguard Worker   return result;
302*6777b538SAndroid Build Coastguard Worker }
303*6777b538SAndroid Build Coastguard Worker 
304*6777b538SAndroid Build Coastguard Worker // static
Make(std::unique_ptr<Backend> backend_in)305*6777b538SAndroid Build Coastguard Worker BackendResult BackendResult::Make(std::unique_ptr<Backend> backend_in) {
306*6777b538SAndroid Build Coastguard Worker   DCHECK(backend_in);
307*6777b538SAndroid Build Coastguard Worker   BackendResult result;
308*6777b538SAndroid Build Coastguard Worker   result.net_error = net::OK;
309*6777b538SAndroid Build Coastguard Worker   result.backend = std::move(backend_in);
310*6777b538SAndroid Build Coastguard Worker   return result;
311*6777b538SAndroid Build Coastguard Worker }
312*6777b538SAndroid Build Coastguard Worker 
CreateCacheBackendImpl(net::CacheType type,net::BackendType backend_type,scoped_refptr<BackendFileOperationsFactory> file_operations,const base::FilePath & path,int64_t max_bytes,ResetHandling reset_handling,ApplicationStatusListenerGetter app_status_listener_getter,net::NetLog * net_log,base::OnceClosure post_cleanup_callback,BackendResultCallback callback)313*6777b538SAndroid Build Coastguard Worker BackendResult CreateCacheBackendImpl(
314*6777b538SAndroid Build Coastguard Worker     net::CacheType type,
315*6777b538SAndroid Build Coastguard Worker     net::BackendType backend_type,
316*6777b538SAndroid Build Coastguard Worker     scoped_refptr<BackendFileOperationsFactory> file_operations,
317*6777b538SAndroid Build Coastguard Worker     const base::FilePath& path,
318*6777b538SAndroid Build Coastguard Worker     int64_t max_bytes,
319*6777b538SAndroid Build Coastguard Worker     ResetHandling reset_handling,
320*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
321*6777b538SAndroid Build Coastguard Worker     ApplicationStatusListenerGetter app_status_listener_getter,
322*6777b538SAndroid Build Coastguard Worker #endif
323*6777b538SAndroid Build Coastguard Worker     net::NetLog* net_log,
324*6777b538SAndroid Build Coastguard Worker     base::OnceClosure post_cleanup_callback,
325*6777b538SAndroid Build Coastguard Worker     BackendResultCallback callback) {
326*6777b538SAndroid Build Coastguard Worker   DCHECK(!callback.is_null());
327*6777b538SAndroid Build Coastguard Worker 
328*6777b538SAndroid Build Coastguard Worker   if (type == net::MEMORY_CACHE) {
329*6777b538SAndroid Build Coastguard Worker     std::unique_ptr<MemBackendImpl> mem_backend_impl =
330*6777b538SAndroid Build Coastguard Worker         disk_cache::MemBackendImpl::CreateBackend(max_bytes, net_log);
331*6777b538SAndroid Build Coastguard Worker     if (mem_backend_impl) {
332*6777b538SAndroid Build Coastguard Worker       mem_backend_impl->SetPostCleanupCallback(
333*6777b538SAndroid Build Coastguard Worker           std::move(post_cleanup_callback));
334*6777b538SAndroid Build Coastguard Worker       return BackendResult::Make(std::move(mem_backend_impl));
335*6777b538SAndroid Build Coastguard Worker     } else {
336*6777b538SAndroid Build Coastguard Worker       if (!post_cleanup_callback.is_null())
337*6777b538SAndroid Build Coastguard Worker         base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
338*6777b538SAndroid Build Coastguard Worker             FROM_HERE, std::move(post_cleanup_callback));
339*6777b538SAndroid Build Coastguard Worker       return BackendResult::MakeError(net::ERR_FAILED);
340*6777b538SAndroid Build Coastguard Worker     }
341*6777b538SAndroid Build Coastguard Worker   }
342*6777b538SAndroid Build Coastguard Worker 
343*6777b538SAndroid Build Coastguard Worker   bool had_post_cleanup_callback = !post_cleanup_callback.is_null();
344*6777b538SAndroid Build Coastguard Worker   CacheCreator* creator = new CacheCreator(
345*6777b538SAndroid Build Coastguard Worker       path, reset_handling, max_bytes, type, backend_type,
346*6777b538SAndroid Build Coastguard Worker       std::move(file_operations),
347*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
348*6777b538SAndroid Build Coastguard Worker       std::move(app_status_listener_getter),
349*6777b538SAndroid Build Coastguard Worker #endif
350*6777b538SAndroid Build Coastguard Worker       net_log, std::move(post_cleanup_callback), std::move(callback));
351*6777b538SAndroid Build Coastguard Worker   if (type == net::DISK_CACHE) {
352*6777b538SAndroid Build Coastguard Worker     DCHECK(!had_post_cleanup_callback);
353*6777b538SAndroid Build Coastguard Worker     return BackendResult::MakeError(creator->Run());
354*6777b538SAndroid Build Coastguard Worker   }
355*6777b538SAndroid Build Coastguard Worker 
356*6777b538SAndroid Build Coastguard Worker   return BackendResult::MakeError(creator->TryCreateCleanupTrackerAndRun());
357*6777b538SAndroid Build Coastguard Worker }
358*6777b538SAndroid Build Coastguard Worker 
CreateCacheBackend(net::CacheType type,net::BackendType backend_type,scoped_refptr<BackendFileOperationsFactory> file_operations,const base::FilePath & path,int64_t max_bytes,ResetHandling reset_handling,net::NetLog * net_log,BackendResultCallback callback)359*6777b538SAndroid Build Coastguard Worker BackendResult CreateCacheBackend(
360*6777b538SAndroid Build Coastguard Worker     net::CacheType type,
361*6777b538SAndroid Build Coastguard Worker     net::BackendType backend_type,
362*6777b538SAndroid Build Coastguard Worker     scoped_refptr<BackendFileOperationsFactory> file_operations,
363*6777b538SAndroid Build Coastguard Worker     const base::FilePath& path,
364*6777b538SAndroid Build Coastguard Worker     int64_t max_bytes,
365*6777b538SAndroid Build Coastguard Worker     ResetHandling reset_handling,
366*6777b538SAndroid Build Coastguard Worker     net::NetLog* net_log,
367*6777b538SAndroid Build Coastguard Worker     BackendResultCallback callback) {
368*6777b538SAndroid Build Coastguard Worker   return CreateCacheBackendImpl(type, backend_type, std::move(file_operations),
369*6777b538SAndroid Build Coastguard Worker                                 path, max_bytes, reset_handling,
370*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
371*6777b538SAndroid Build Coastguard Worker                                 ApplicationStatusListenerGetter(),
372*6777b538SAndroid Build Coastguard Worker #endif
373*6777b538SAndroid Build Coastguard Worker                                 net_log, base::OnceClosure(),
374*6777b538SAndroid Build Coastguard Worker                                 std::move(callback));
375*6777b538SAndroid Build Coastguard Worker }
376*6777b538SAndroid Build Coastguard Worker 
377*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
378*6777b538SAndroid Build Coastguard Worker NET_EXPORT BackendResult
CreateCacheBackend(net::CacheType type,net::BackendType backend_type,scoped_refptr<BackendFileOperationsFactory> file_operations,const base::FilePath & path,int64_t max_bytes,ResetHandling reset_handling,net::NetLog * net_log,BackendResultCallback callback,ApplicationStatusListenerGetter app_status_listener_getter)379*6777b538SAndroid Build Coastguard Worker CreateCacheBackend(net::CacheType type,
380*6777b538SAndroid Build Coastguard Worker                    net::BackendType backend_type,
381*6777b538SAndroid Build Coastguard Worker                    scoped_refptr<BackendFileOperationsFactory> file_operations,
382*6777b538SAndroid Build Coastguard Worker                    const base::FilePath& path,
383*6777b538SAndroid Build Coastguard Worker                    int64_t max_bytes,
384*6777b538SAndroid Build Coastguard Worker                    ResetHandling reset_handling,
385*6777b538SAndroid Build Coastguard Worker                    net::NetLog* net_log,
386*6777b538SAndroid Build Coastguard Worker                    BackendResultCallback callback,
387*6777b538SAndroid Build Coastguard Worker                    ApplicationStatusListenerGetter app_status_listener_getter) {
388*6777b538SAndroid Build Coastguard Worker   return CreateCacheBackendImpl(type, backend_type, std::move(file_operations),
389*6777b538SAndroid Build Coastguard Worker                                 path, max_bytes, reset_handling,
390*6777b538SAndroid Build Coastguard Worker                                 std::move(app_status_listener_getter), net_log,
391*6777b538SAndroid Build Coastguard Worker                                 base::OnceClosure(), std::move(callback));
392*6777b538SAndroid Build Coastguard Worker }
393*6777b538SAndroid Build Coastguard Worker #endif
394*6777b538SAndroid Build Coastguard Worker 
CreateCacheBackend(net::CacheType type,net::BackendType backend_type,scoped_refptr<BackendFileOperationsFactory> file_operations,const base::FilePath & path,int64_t max_bytes,ResetHandling reset_handling,net::NetLog * net_log,base::OnceClosure post_cleanup_callback,BackendResultCallback callback)395*6777b538SAndroid Build Coastguard Worker BackendResult CreateCacheBackend(
396*6777b538SAndroid Build Coastguard Worker     net::CacheType type,
397*6777b538SAndroid Build Coastguard Worker     net::BackendType backend_type,
398*6777b538SAndroid Build Coastguard Worker     scoped_refptr<BackendFileOperationsFactory> file_operations,
399*6777b538SAndroid Build Coastguard Worker     const base::FilePath& path,
400*6777b538SAndroid Build Coastguard Worker     int64_t max_bytes,
401*6777b538SAndroid Build Coastguard Worker     ResetHandling reset_handling,
402*6777b538SAndroid Build Coastguard Worker     net::NetLog* net_log,
403*6777b538SAndroid Build Coastguard Worker     base::OnceClosure post_cleanup_callback,
404*6777b538SAndroid Build Coastguard Worker     BackendResultCallback callback) {
405*6777b538SAndroid Build Coastguard Worker   return CreateCacheBackendImpl(type, backend_type, std::move(file_operations),
406*6777b538SAndroid Build Coastguard Worker                                 path, max_bytes, reset_handling,
407*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
408*6777b538SAndroid Build Coastguard Worker                                 ApplicationStatusListenerGetter(),
409*6777b538SAndroid Build Coastguard Worker #endif
410*6777b538SAndroid Build Coastguard Worker                                 net_log, std::move(post_cleanup_callback),
411*6777b538SAndroid Build Coastguard Worker                                 std::move(callback));
412*6777b538SAndroid Build Coastguard Worker }
413*6777b538SAndroid Build Coastguard Worker 
FlushCacheThreadForTesting()414*6777b538SAndroid Build Coastguard Worker void FlushCacheThreadForTesting() {
415*6777b538SAndroid Build Coastguard Worker   // For simple backend.
416*6777b538SAndroid Build Coastguard Worker   base::ThreadPoolInstance::Get()->FlushForTesting();
417*6777b538SAndroid Build Coastguard Worker 
418*6777b538SAndroid Build Coastguard Worker   // Block backend.
419*6777b538SAndroid Build Coastguard Worker   BackendImpl::FlushForTesting();
420*6777b538SAndroid Build Coastguard Worker }
421*6777b538SAndroid Build Coastguard Worker 
FlushCacheThreadAsynchronouslyForTesting(base::OnceClosure callback)422*6777b538SAndroid Build Coastguard Worker void FlushCacheThreadAsynchronouslyForTesting(base::OnceClosure callback) {
423*6777b538SAndroid Build Coastguard Worker   auto repeating_callback = base::BarrierClosure(2, std::move(callback));
424*6777b538SAndroid Build Coastguard Worker 
425*6777b538SAndroid Build Coastguard Worker   // For simple backend.
426*6777b538SAndroid Build Coastguard Worker   base::ThreadPoolInstance::Get()->FlushAsyncForTesting(  // IN-TEST
427*6777b538SAndroid Build Coastguard Worker       base::BindPostTaskToCurrentDefault(repeating_callback));
428*6777b538SAndroid Build Coastguard Worker 
429*6777b538SAndroid Build Coastguard Worker   // Block backend.
430*6777b538SAndroid Build Coastguard Worker   BackendImpl::FlushAsynchronouslyForTesting(repeating_callback);
431*6777b538SAndroid Build Coastguard Worker }
432*6777b538SAndroid Build Coastguard Worker 
CalculateSizeOfEntriesBetween(base::Time initial_time,base::Time end_time,Int64CompletionOnceCallback callback)433*6777b538SAndroid Build Coastguard Worker int64_t Backend::CalculateSizeOfEntriesBetween(
434*6777b538SAndroid Build Coastguard Worker     base::Time initial_time,
435*6777b538SAndroid Build Coastguard Worker     base::Time end_time,
436*6777b538SAndroid Build Coastguard Worker     Int64CompletionOnceCallback callback) {
437*6777b538SAndroid Build Coastguard Worker   return net::ERR_NOT_IMPLEMENTED;
438*6777b538SAndroid Build Coastguard Worker }
439*6777b538SAndroid Build Coastguard Worker 
GetEntryInMemoryData(const std::string & key)440*6777b538SAndroid Build Coastguard Worker uint8_t Backend::GetEntryInMemoryData(const std::string& key) {
441*6777b538SAndroid Build Coastguard Worker   return 0;
442*6777b538SAndroid Build Coastguard Worker }
443*6777b538SAndroid Build Coastguard Worker 
SetEntryInMemoryData(const std::string & key,uint8_t data)444*6777b538SAndroid Build Coastguard Worker void Backend::SetEntryInMemoryData(const std::string& key, uint8_t data) {}
445*6777b538SAndroid Build Coastguard Worker 
446*6777b538SAndroid Build Coastguard Worker EntryResult::EntryResult() = default;
447*6777b538SAndroid Build Coastguard Worker EntryResult::~EntryResult() = default;
448*6777b538SAndroid Build Coastguard Worker 
EntryResult(EntryResult && other)449*6777b538SAndroid Build Coastguard Worker EntryResult::EntryResult(EntryResult&& other) {
450*6777b538SAndroid Build Coastguard Worker   net_error_ = other.net_error_;
451*6777b538SAndroid Build Coastguard Worker   entry_ = std::move(other.entry_);
452*6777b538SAndroid Build Coastguard Worker   opened_ = other.opened_;
453*6777b538SAndroid Build Coastguard Worker 
454*6777b538SAndroid Build Coastguard Worker   other.net_error_ = net::ERR_FAILED;
455*6777b538SAndroid Build Coastguard Worker   other.opened_ = false;
456*6777b538SAndroid Build Coastguard Worker }
457*6777b538SAndroid Build Coastguard Worker 
operator =(EntryResult && other)458*6777b538SAndroid Build Coastguard Worker EntryResult& EntryResult::operator=(EntryResult&& other) {
459*6777b538SAndroid Build Coastguard Worker   net_error_ = other.net_error_;
460*6777b538SAndroid Build Coastguard Worker   entry_ = std::move(other.entry_);
461*6777b538SAndroid Build Coastguard Worker   opened_ = other.opened_;
462*6777b538SAndroid Build Coastguard Worker 
463*6777b538SAndroid Build Coastguard Worker   other.net_error_ = net::ERR_FAILED;
464*6777b538SAndroid Build Coastguard Worker   other.opened_ = false;
465*6777b538SAndroid Build Coastguard Worker   return *this;
466*6777b538SAndroid Build Coastguard Worker }
467*6777b538SAndroid Build Coastguard Worker 
468*6777b538SAndroid Build Coastguard Worker // static
MakeOpened(Entry * new_entry)469*6777b538SAndroid Build Coastguard Worker EntryResult EntryResult::MakeOpened(Entry* new_entry) {
470*6777b538SAndroid Build Coastguard Worker   DCHECK(new_entry);
471*6777b538SAndroid Build Coastguard Worker 
472*6777b538SAndroid Build Coastguard Worker   EntryResult result;
473*6777b538SAndroid Build Coastguard Worker   result.net_error_ = net::OK;
474*6777b538SAndroid Build Coastguard Worker   result.entry_.reset(new_entry);
475*6777b538SAndroid Build Coastguard Worker   result.opened_ = true;
476*6777b538SAndroid Build Coastguard Worker   return result;
477*6777b538SAndroid Build Coastguard Worker }
478*6777b538SAndroid Build Coastguard Worker 
479*6777b538SAndroid Build Coastguard Worker // static
MakeCreated(Entry * new_entry)480*6777b538SAndroid Build Coastguard Worker EntryResult EntryResult::MakeCreated(Entry* new_entry) {
481*6777b538SAndroid Build Coastguard Worker   DCHECK(new_entry);
482*6777b538SAndroid Build Coastguard Worker 
483*6777b538SAndroid Build Coastguard Worker   EntryResult result;
484*6777b538SAndroid Build Coastguard Worker   result.net_error_ = net::OK;
485*6777b538SAndroid Build Coastguard Worker   result.entry_.reset(new_entry);
486*6777b538SAndroid Build Coastguard Worker   result.opened_ = false;
487*6777b538SAndroid Build Coastguard Worker   return result;
488*6777b538SAndroid Build Coastguard Worker }
489*6777b538SAndroid Build Coastguard Worker 
490*6777b538SAndroid Build Coastguard Worker // static
MakeError(net::Error status)491*6777b538SAndroid Build Coastguard Worker EntryResult EntryResult::MakeError(net::Error status) {
492*6777b538SAndroid Build Coastguard Worker   DCHECK_NE(status, net::OK);
493*6777b538SAndroid Build Coastguard Worker 
494*6777b538SAndroid Build Coastguard Worker   EntryResult result;
495*6777b538SAndroid Build Coastguard Worker   result.net_error_ = status;
496*6777b538SAndroid Build Coastguard Worker   return result;
497*6777b538SAndroid Build Coastguard Worker }
498*6777b538SAndroid Build Coastguard Worker 
ReleaseEntry()499*6777b538SAndroid Build Coastguard Worker Entry* EntryResult::ReleaseEntry() {
500*6777b538SAndroid Build Coastguard Worker   Entry* ret = entry_.release();
501*6777b538SAndroid Build Coastguard Worker   net_error_ = net::ERR_FAILED;
502*6777b538SAndroid Build Coastguard Worker   opened_ = false;
503*6777b538SAndroid Build Coastguard Worker   return ret;
504*6777b538SAndroid Build Coastguard Worker }
505*6777b538SAndroid Build Coastguard Worker 
TrivialFileOperations()506*6777b538SAndroid Build Coastguard Worker TrivialFileOperations::TrivialFileOperations() {
507*6777b538SAndroid Build Coastguard Worker   DETACH_FROM_SEQUENCE(sequence_checker_);
508*6777b538SAndroid Build Coastguard Worker }
509*6777b538SAndroid Build Coastguard Worker 
~TrivialFileOperations()510*6777b538SAndroid Build Coastguard Worker TrivialFileOperations::~TrivialFileOperations() {
511*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
512*6777b538SAndroid Build Coastguard Worker }
513*6777b538SAndroid Build Coastguard Worker 
CreateDirectory(const base::FilePath & path)514*6777b538SAndroid Build Coastguard Worker bool TrivialFileOperations::CreateDirectory(const base::FilePath& path) {
515*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
516*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
517*6777b538SAndroid Build Coastguard Worker   DCHECK(bound_);
518*6777b538SAndroid Build Coastguard Worker #endif
519*6777b538SAndroid Build Coastguard Worker 
520*6777b538SAndroid Build Coastguard Worker   // This is needed for some unittests.
521*6777b538SAndroid Build Coastguard Worker   if (path.empty()) {
522*6777b538SAndroid Build Coastguard Worker     return false;
523*6777b538SAndroid Build Coastguard Worker   }
524*6777b538SAndroid Build Coastguard Worker 
525*6777b538SAndroid Build Coastguard Worker   DCHECK(path.IsAbsolute());
526*6777b538SAndroid Build Coastguard Worker 
527*6777b538SAndroid Build Coastguard Worker   bool result = base::CreateDirectory(path);
528*6777b538SAndroid Build Coastguard Worker   return result;
529*6777b538SAndroid Build Coastguard Worker }
530*6777b538SAndroid Build Coastguard Worker 
PathExists(const base::FilePath & path)531*6777b538SAndroid Build Coastguard Worker bool TrivialFileOperations::PathExists(const base::FilePath& path) {
532*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
533*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
534*6777b538SAndroid Build Coastguard Worker   DCHECK(bound_);
535*6777b538SAndroid Build Coastguard Worker #endif
536*6777b538SAndroid Build Coastguard Worker 
537*6777b538SAndroid Build Coastguard Worker   // This is needed for some unittests.
538*6777b538SAndroid Build Coastguard Worker   if (path.empty()) {
539*6777b538SAndroid Build Coastguard Worker     return false;
540*6777b538SAndroid Build Coastguard Worker   }
541*6777b538SAndroid Build Coastguard Worker 
542*6777b538SAndroid Build Coastguard Worker   DCHECK(path.IsAbsolute());
543*6777b538SAndroid Build Coastguard Worker 
544*6777b538SAndroid Build Coastguard Worker   bool result = base::PathExists(path);
545*6777b538SAndroid Build Coastguard Worker   return result;
546*6777b538SAndroid Build Coastguard Worker }
547*6777b538SAndroid Build Coastguard Worker 
DirectoryExists(const base::FilePath & path)548*6777b538SAndroid Build Coastguard Worker bool TrivialFileOperations::DirectoryExists(const base::FilePath& path) {
549*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
550*6777b538SAndroid Build Coastguard Worker   DCHECK(path.IsAbsolute());
551*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
552*6777b538SAndroid Build Coastguard Worker   DCHECK(bound_);
553*6777b538SAndroid Build Coastguard Worker #endif
554*6777b538SAndroid Build Coastguard Worker 
555*6777b538SAndroid Build Coastguard Worker   bool result = base::DirectoryExists(path);
556*6777b538SAndroid Build Coastguard Worker   return result;
557*6777b538SAndroid Build Coastguard Worker }
558*6777b538SAndroid Build Coastguard Worker 
OpenFile(const base::FilePath & path,uint32_t flags)559*6777b538SAndroid Build Coastguard Worker base::File TrivialFileOperations::OpenFile(const base::FilePath& path,
560*6777b538SAndroid Build Coastguard Worker                                            uint32_t flags) {
561*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
562*6777b538SAndroid Build Coastguard Worker   DCHECK(path.IsAbsolute());
563*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
564*6777b538SAndroid Build Coastguard Worker   DCHECK(bound_);
565*6777b538SAndroid Build Coastguard Worker #endif
566*6777b538SAndroid Build Coastguard Worker 
567*6777b538SAndroid Build Coastguard Worker   base::File file(path, flags);
568*6777b538SAndroid Build Coastguard Worker   return file;
569*6777b538SAndroid Build Coastguard Worker }
570*6777b538SAndroid Build Coastguard Worker 
DeleteFile(const base::FilePath & path,DeleteFileMode mode)571*6777b538SAndroid Build Coastguard Worker bool TrivialFileOperations::DeleteFile(const base::FilePath& path,
572*6777b538SAndroid Build Coastguard Worker                                        DeleteFileMode mode) {
573*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
574*6777b538SAndroid Build Coastguard Worker   DCHECK(path.IsAbsolute());
575*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
576*6777b538SAndroid Build Coastguard Worker   DCHECK(bound_);
577*6777b538SAndroid Build Coastguard Worker #endif
578*6777b538SAndroid Build Coastguard Worker 
579*6777b538SAndroid Build Coastguard Worker   bool result = false;
580*6777b538SAndroid Build Coastguard Worker   switch (mode) {
581*6777b538SAndroid Build Coastguard Worker     case DeleteFileMode::kDefault:
582*6777b538SAndroid Build Coastguard Worker       result = base::DeleteFile(path);
583*6777b538SAndroid Build Coastguard Worker       break;
584*6777b538SAndroid Build Coastguard Worker     case DeleteFileMode::kEnsureImmediateAvailability:
585*6777b538SAndroid Build Coastguard Worker       result = disk_cache::simple_util::SimpleCacheDeleteFile(path);
586*6777b538SAndroid Build Coastguard Worker       break;
587*6777b538SAndroid Build Coastguard Worker   }
588*6777b538SAndroid Build Coastguard Worker   return result;
589*6777b538SAndroid Build Coastguard Worker }
590*6777b538SAndroid Build Coastguard Worker 
ReplaceFile(const base::FilePath & from_path,const base::FilePath & to_path,base::File::Error * error)591*6777b538SAndroid Build Coastguard Worker bool TrivialFileOperations::ReplaceFile(const base::FilePath& from_path,
592*6777b538SAndroid Build Coastguard Worker                                         const base::FilePath& to_path,
593*6777b538SAndroid Build Coastguard Worker                                         base::File::Error* error) {
594*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
595*6777b538SAndroid Build Coastguard Worker   DCHECK(from_path.IsAbsolute());
596*6777b538SAndroid Build Coastguard Worker   DCHECK(to_path.IsAbsolute());
597*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
598*6777b538SAndroid Build Coastguard Worker   DCHECK(bound_);
599*6777b538SAndroid Build Coastguard Worker #endif
600*6777b538SAndroid Build Coastguard Worker 
601*6777b538SAndroid Build Coastguard Worker   return base::ReplaceFile(from_path, to_path, error);
602*6777b538SAndroid Build Coastguard Worker }
603*6777b538SAndroid Build Coastguard Worker 
GetFileInfo(const base::FilePath & path)604*6777b538SAndroid Build Coastguard Worker std::optional<base::File::Info> TrivialFileOperations::GetFileInfo(
605*6777b538SAndroid Build Coastguard Worker     const base::FilePath& path) {
606*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
607*6777b538SAndroid Build Coastguard Worker   DCHECK(path.IsAbsolute());
608*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
609*6777b538SAndroid Build Coastguard Worker   DCHECK(bound_);
610*6777b538SAndroid Build Coastguard Worker #endif
611*6777b538SAndroid Build Coastguard Worker 
612*6777b538SAndroid Build Coastguard Worker   base::File::Info file_info;
613*6777b538SAndroid Build Coastguard Worker   if (!base::GetFileInfo(path, &file_info)) {
614*6777b538SAndroid Build Coastguard Worker     return std::nullopt;
615*6777b538SAndroid Build Coastguard Worker   }
616*6777b538SAndroid Build Coastguard Worker   return file_info;
617*6777b538SAndroid Build Coastguard Worker }
618*6777b538SAndroid Build Coastguard Worker 
EnumerateFiles(const base::FilePath & path)619*6777b538SAndroid Build Coastguard Worker std::unique_ptr<FileEnumerator> TrivialFileOperations::EnumerateFiles(
620*6777b538SAndroid Build Coastguard Worker     const base::FilePath& path) {
621*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
622*6777b538SAndroid Build Coastguard Worker   DCHECK(path.IsAbsolute());
623*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
624*6777b538SAndroid Build Coastguard Worker   DCHECK(bound_);
625*6777b538SAndroid Build Coastguard Worker #endif
626*6777b538SAndroid Build Coastguard Worker   return std::make_unique<TrivialFileEnumerator>(path);
627*6777b538SAndroid Build Coastguard Worker }
628*6777b538SAndroid Build Coastguard Worker 
CleanupDirectory(const base::FilePath & path,base::OnceCallback<void (bool)> callback)629*6777b538SAndroid Build Coastguard Worker void TrivialFileOperations::CleanupDirectory(
630*6777b538SAndroid Build Coastguard Worker     const base::FilePath& path,
631*6777b538SAndroid Build Coastguard Worker     base::OnceCallback<void(bool)> callback) {
632*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
633*6777b538SAndroid Build Coastguard Worker 
634*6777b538SAndroid Build Coastguard Worker   // This is needed for some unittests.
635*6777b538SAndroid Build Coastguard Worker   if (path.empty()) {
636*6777b538SAndroid Build Coastguard Worker     base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
637*6777b538SAndroid Build Coastguard Worker         FROM_HERE, base::BindOnce(std::move(callback), false));
638*6777b538SAndroid Build Coastguard Worker     return;
639*6777b538SAndroid Build Coastguard Worker   }
640*6777b538SAndroid Build Coastguard Worker 
641*6777b538SAndroid Build Coastguard Worker   DCHECK(path.IsAbsolute());
642*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
643*6777b538SAndroid Build Coastguard Worker   DCHECK(bound_);
644*6777b538SAndroid Build Coastguard Worker #endif
645*6777b538SAndroid Build Coastguard Worker 
646*6777b538SAndroid Build Coastguard Worker   disk_cache::CleanupDirectory(path, std::move(callback));
647*6777b538SAndroid Build Coastguard Worker }
648*6777b538SAndroid Build Coastguard Worker 
Unbind()649*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UnboundBackendFileOperations> TrivialFileOperations::Unbind() {
650*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
651*6777b538SAndroid Build Coastguard Worker   DCHECK(bound_);
652*6777b538SAndroid Build Coastguard Worker   bound_ = false;
653*6777b538SAndroid Build Coastguard Worker #endif
654*6777b538SAndroid Build Coastguard Worker   return std::make_unique<UnboundTrivialFileOperations>();
655*6777b538SAndroid Build Coastguard Worker }
656*6777b538SAndroid Build Coastguard Worker 
657*6777b538SAndroid Build Coastguard Worker TrivialFileOperationsFactory::TrivialFileOperationsFactory() = default;
658*6777b538SAndroid Build Coastguard Worker TrivialFileOperationsFactory::~TrivialFileOperationsFactory() = default;
659*6777b538SAndroid Build Coastguard Worker 
Create(scoped_refptr<base::SequencedTaskRunner> task_runner)660*6777b538SAndroid Build Coastguard Worker std::unique_ptr<BackendFileOperations> TrivialFileOperationsFactory::Create(
661*6777b538SAndroid Build Coastguard Worker     scoped_refptr<base::SequencedTaskRunner> task_runner) {
662*6777b538SAndroid Build Coastguard Worker   return std::make_unique<TrivialFileOperations>();
663*6777b538SAndroid Build Coastguard Worker }
664*6777b538SAndroid Build Coastguard Worker 
665*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UnboundBackendFileOperations>
CreateUnbound()666*6777b538SAndroid Build Coastguard Worker TrivialFileOperationsFactory::CreateUnbound() {
667*6777b538SAndroid Build Coastguard Worker   return std::make_unique<UnboundTrivialFileOperations>();
668*6777b538SAndroid Build Coastguard Worker }
669*6777b538SAndroid Build Coastguard Worker 
670*6777b538SAndroid Build Coastguard Worker }  // namespace disk_cache
671