| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CONTENT_BROWSER_BROWSING_DATA_STORAGE_PARTITION_CODE_CACHE_DATA_REMOVER_H_ |
| #define CONTENT_BROWSER_BROWSING_DATA_STORAGE_PARTITION_CODE_CACHE_DATA_REMOVER_H_ |
| |
| #include <stdint.h> |
| |
| #include "base/callback.h" |
| #include "base/macros.h" |
| #include "base/sequenced_task_runner_helpers.h" |
| #include "net/base/completion_callback.h" |
| #include "url/gurl.h" |
| |
| namespace disk_cache { |
| class Backend; |
| } |
| |
| namespace content { |
| |
| class StoragePartition; |
| class GeneratedCodeCacheContext; |
| |
| // Helper to remove code cache data from a StoragePartition. This class is |
| // created on the UI thread and calls the provided callback and destroys itself |
| // on the UI thread after the code caches are cleared. This class also takes a |
| // reference to the generated_code_cache_context and is used in read-only mode |
| // on both the UI / IO thread. Since this isn't modified, it is OK to access it |
| // on both threads. The caches are actually cleared on the IO threads. When the |
| // Remove function is called, it posts tasks on the IO thread to clear the code |
| // caches. Once the the caches are cleared, the callback is called on the UI |
| // thread. |
| class StoragePartitionCodeCacheDataRemover { |
| public: |
| // Creates a StoragePartitionCodeCacheDataRemover that deletes all cache |
| // entries. |
| static StoragePartitionCodeCacheDataRemover* Create( |
| content::StoragePartition* storage_partition, |
| base::RepeatingCallback<bool(const GURL&)> url_predicate, |
| base::Time begin_time, |
| base::Time end_time); |
| |
| // Calls |done_callback| on UI thread upon completion and also destroys |
| // itself on UI thread. |
| // This expects that either storage_partition with which this object was |
| // created is live till the end of operation or GeneratedCodeCacheContext |
| // is destroyed when the storage_partition is destroyed. This ensures the |
| // code cache and hence the backend is destroyed. If this is not guaranteed |
| // there could be a callback accessing the destroyed objects. |
| void Remove(base::OnceClosure done_callback); |
| |
| private: |
| // StoragePartitionCodeCacheDataRemover deletes itself (using DeleteHelper) |
| // and is not supposed to be deleted by other objects so make destructor |
| // private and DeleteHelper a friend. |
| friend class base::DeleteHelper<StoragePartitionCodeCacheDataRemover>; |
| |
| explicit StoragePartitionCodeCacheDataRemover( |
| GeneratedCodeCacheContext* generated_code_cache_context, |
| base::RepeatingCallback<bool(const GURL&)> url_predicate, |
| base::Time begin_time, |
| base::Time end_time); |
| |
| ~StoragePartitionCodeCacheDataRemover(); |
| |
| // Executed on UI thread. |
| void ClearedCodeCache(); |
| |
| // Executed on IO thread. |
| void ClearJSCodeCache(); |
| void ClearWASMCodeCache(int rv); |
| void ClearCache(net::CompletionCallback callback, |
| disk_cache::Backend* backend); |
| void DoneClearCodeCache(int rv); |
| |
| const scoped_refptr<GeneratedCodeCacheContext> generated_code_cache_context_; |
| |
| base::OnceClosure done_callback_; |
| base::Time begin_time_; |
| base::Time end_time_; |
| base::RepeatingCallback<bool(const GURL&)> url_predicate_; |
| |
| DISALLOW_COPY_AND_ASSIGN(StoragePartitionCodeCacheDataRemover); |
| }; |
| |
| } // namespace content |
| |
| #endif // CONTENT_BROWSER_BROWSING_DATA_STORAGE_PARTITION_CODE_CACHE_DATA_REMOVER_H_ |