Index: content/browser/cache_storage/cache_storage_index.h |
diff --git a/content/browser/cache_storage/cache_storage_index.h b/content/browser/cache_storage/cache_storage_index.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3665ec6e7de95d8a2a1a8f9a46cf4bfb00154d1e |
--- /dev/null |
+++ b/content/browser/cache_storage/cache_storage_index.h |
@@ -0,0 +1,93 @@ |
+// Copyright 2016 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_CACHE_STORAGE_CACHE_STORAGE_INDEX_H_ |
+#define CONTENT_BROWSER_CACHE_STORAGE_CACHE_STORAGE_INDEX_H_ |
+ |
+#include <list> |
+#include <string> |
+#include <unordered_map> |
+ |
+#include "base/macros.h" |
+#include "content/browser/cache_storage/cache_storage.h" |
+ |
+namespace content { |
+ |
+class CacheMetadata; |
+ |
+// CacheStorageIndex maintains an ordered list of metadata (CacheMetadata) |
+// for each cache owned by a CacheStorage object. This class is not thread safe, |
+// and is owned by the CacheStorage. |
+class CONTENT_EXPORT CacheStorageIndex { |
+ public: |
+ struct CacheMetadata { |
+ CacheMetadata(const std::string& name, int64_t size) |
+ : name(name), size(size) {} |
+ std::string name; |
+ // The size (in bytes) of the cache. Set to CacheStorage::kSizeUnknown if |
+ // size not known. |
+ int64_t size; |
+ }; |
+ |
+ CacheStorageIndex(); |
+ ~CacheStorageIndex(); |
+ |
+ CacheStorageIndex& operator=(CacheStorageIndex&& rhs); |
+ |
+ void Insert(const CacheMetadata& cache_metadata); |
+ void Delete(const std::string& cache_name); |
+ |
+ // Sets the cache size. Returns true if the new size is different than the |
+ // current size else false. |
+ bool SetCacheSize(const std::string& cache_name, int64_t size); |
+ |
+ // Return the size (in bytes) of the specified cache. Will return |
+ // CacheStorage::kSizeUnknown if the specified cache does not exist. |
+ int64_t GetCacheSize(const std::string& cache_name) const; |
+ |
+ const std::list<CacheMetadata>& ordered_cache_metadata() const { |
+ return ordered_cache_metadata_; |
+ } |
+ |
+ size_t num_entries() const { return ordered_cache_metadata_.size(); } |
+ |
+ // Will calculate (if necessary), and return the total sum of all cache sizes. |
+ int64_t GetStorageSize(); |
+ |
+ // Mark the cache as doomed. This removes the cache metadata from the index. |
+ // All const methods (eg: num_entries) will behave as if the doomed cache is |
+ // not present in the index. Prior to calling any non-const method the doomed |
+ // cache must either be finalized (by calling FinalizeDoomedCache) or restored |
+ // (by calling RestoreDoomedCache). |
+ // |
+ // RestoreDoomedCache restores the metadata to the index at the original |
+ // position prior to calling DoomCache. |
+ void DoomCache(const std::string& cache_name); |
+ void FinalizeDoomedCache(); |
+ void RestoreDoomedCache(); |
+ |
+ private: |
+ void UpdateStorageSize(); |
+ void ClearDoomedCache(); |
+ |
+ // Use a list to keep saved iterators valid during insert/erase. |
+ // Note: ordered by cache creation. |
+ std::list<CacheMetadata> ordered_cache_metadata_; |
+ std::unordered_map<std::string, std::list<CacheMetadata>::iterator> |
+ cache_metadata_map_; |
+ |
+ // The total size of all caches in this store. |
+ int64_t storage_size_ = CacheStorage::kSizeUnknown; |
+ |
+ // The doomed cache metadata saved when calling DoomCache. |
+ CacheMetadata doomed_cache_metadata_; |
+ std::list<CacheMetadata>::iterator after_doomed_cache_metadata_; |
+ bool has_doomed_cache_ = false; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CacheStorageIndex); |
+}; |
+ |
+} // namespace content |
+ |
+#endif // CONTENT_BROWSER_CACHE_STORAGE_CACHE_STORAGE_INDEX_H_ |