| Index: content/browser/cache_storage/cache_storage_index.cc
|
| diff --git a/content/browser/cache_storage/cache_storage_index.cc b/content/browser/cache_storage/cache_storage_index.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a5ddcb33692b53b986a8859949b64c4e3ce19730
|
| --- /dev/null
|
| +++ b/content/browser/cache_storage/cache_storage_index.cc
|
| @@ -0,0 +1,114 @@
|
| +// 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.
|
| +
|
| +#include "content/browser/cache_storage/cache_storage_index.h"
|
| +
|
| +#include <utility>
|
| +
|
| +namespace content {
|
| +
|
| +CacheStorageIndex::CacheStorageIndex()
|
| + : doomed_cache_metadata_("", CacheStorage::kSizeUnknown) {
|
| + ClearDoomedCache();
|
| +}
|
| +
|
| +CacheStorageIndex::~CacheStorageIndex() = default;
|
| +
|
| +CacheStorageIndex& CacheStorageIndex::operator=(CacheStorageIndex&& rhs) {
|
| + DCHECK(!has_doomed_cache_);
|
| + ordered_cache_metadata_ = std::move(rhs.ordered_cache_metadata_);
|
| + cache_metadata_map_ = std::move(rhs.cache_metadata_map_);
|
| + storage_size_ = rhs.storage_size_;
|
| + rhs.storage_size_ = CacheStorage::kSizeUnknown;
|
| + return *this;
|
| +}
|
| +
|
| +void CacheStorageIndex::Insert(const CacheMetadata& cache_metadata) {
|
| + DCHECK(!has_doomed_cache_);
|
| + DCHECK(cache_metadata_map_.find(cache_metadata.name) ==
|
| + cache_metadata_map_.end());
|
| + ordered_cache_metadata_.push_back(cache_metadata);
|
| + cache_metadata_map_[cache_metadata.name] = --ordered_cache_metadata_.end();
|
| + storage_size_ = CacheStorage::kSizeUnknown;
|
| +}
|
| +
|
| +void CacheStorageIndex::Delete(const std::string& cache_name) {
|
| + DCHECK(!has_doomed_cache_);
|
| + auto it = cache_metadata_map_.find(cache_name);
|
| + DCHECK(it != cache_metadata_map_.end());
|
| + ordered_cache_metadata_.erase(it->second);
|
| + cache_metadata_map_.erase(it);
|
| + storage_size_ = CacheStorage::kSizeUnknown;
|
| +}
|
| +
|
| +bool CacheStorageIndex::SetCacheSize(const std::string& cache_name,
|
| + int64_t size) {
|
| + if (has_doomed_cache_)
|
| + DCHECK_NE(cache_name, doomed_cache_metadata_.name);
|
| + auto it = cache_metadata_map_.find(cache_name);
|
| + DCHECK(it != cache_metadata_map_.end());
|
| + if (it->second->size == size)
|
| + return false;
|
| + it->second->size = size;
|
| + storage_size_ = CacheStorage::kSizeUnknown;
|
| + return true;
|
| +}
|
| +
|
| +int64_t CacheStorageIndex::GetCacheSize(const std::string& cache_name) const {
|
| + const auto& it = cache_metadata_map_.find(cache_name);
|
| + if (it == cache_metadata_map_.end())
|
| + return CacheStorage::kSizeUnknown;
|
| + return it->second->size;
|
| +}
|
| +
|
| +int64_t CacheStorageIndex::GetStorageSize() {
|
| + if (storage_size_ == CacheStorage::kSizeUnknown)
|
| + UpdateStorageSize();
|
| + return storage_size_;
|
| +}
|
| +
|
| +void CacheStorageIndex::UpdateStorageSize() {
|
| + int64_t storage_size = 0;
|
| + storage_size_ = CacheStorage::kSizeUnknown;
|
| + for (const CacheMetadata& info : ordered_cache_metadata_) {
|
| + if (info.size == CacheStorage::kSizeUnknown)
|
| + return;
|
| + storage_size += info.size;
|
| + }
|
| + storage_size_ = storage_size;
|
| +}
|
| +
|
| +void CacheStorageIndex::DoomCache(const std::string& cache_name) {
|
| + DCHECK(!has_doomed_cache_);
|
| + auto map_it = cache_metadata_map_.find(cache_name);
|
| + DCHECK(map_it != cache_metadata_map_.end());
|
| + doomed_cache_metadata_ = std::move(*(map_it->second));
|
| + after_doomed_cache_metadata_ = ordered_cache_metadata_.erase(map_it->second);
|
| + cache_metadata_map_.erase(map_it);
|
| + storage_size_ = CacheStorage::kSizeUnknown;
|
| + has_doomed_cache_ = true;
|
| +}
|
| +
|
| +void CacheStorageIndex::FinalizeDoomedCache() {
|
| + DCHECK(has_doomed_cache_);
|
| + ClearDoomedCache();
|
| +}
|
| +
|
| +void CacheStorageIndex::RestoreDoomedCache() {
|
| + DCHECK(has_doomed_cache_);
|
| + const auto cache_name = doomed_cache_metadata_.name;
|
| + cache_metadata_map_[cache_name] = ordered_cache_metadata_.insert(
|
| + after_doomed_cache_metadata_, std::move(doomed_cache_metadata_));
|
| + after_doomed_cache_metadata_ = ordered_cache_metadata_.end();
|
| + storage_size_ = CacheStorage::kSizeUnknown;
|
| + ClearDoomedCache();
|
| +}
|
| +
|
| +void CacheStorageIndex::ClearDoomedCache() {
|
| + doomed_cache_metadata_.name.clear();
|
| + after_doomed_cache_metadata_ = ordered_cache_metadata_.end();
|
| + has_doomed_cache_ = false;
|
| +}
|
| +
|
| +} // namespace content
|
|
|