diff options
author | pilgrim@chromium.org <pilgrim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-25 20:57:55 +0000 |
---|---|---|
committer | pilgrim@chromium.org <pilgrim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-25 20:57:55 +0000 |
commit | 98d6d4562142f682d3bc8419c0f29a4f7fd0f263 (patch) | |
tree | 005b061e143cefc1d2c890a700b28edb57b8573d /content/browser/appcache/appcache_quota_client.cc | |
parent | 0282b03c86d52533c58af2c6e8de4c7bc7a89155 (diff) | |
download | chromium_src-98d6d4562142f682d3bc8419c0f29a4f7fd0f263.zip chromium_src-98d6d4562142f682d3bc8419c0f29a4f7fd0f263.tar.gz chromium_src-98d6d4562142f682d3bc8419c0f29a4f7fd0f263.tar.bz2 |
Move all remaining appcache-related code to content namespace
This introduces NO FUNCTIONAL CHANGES. It is strictly a file move and namespace change.
BUG=338338
R=michaeln@chromium.org
TBR=cevans, darin
Review URL: https://codereview.chromium.org/344493002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@279808 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/appcache/appcache_quota_client.cc')
-rw-r--r-- | content/browser/appcache/appcache_quota_client.cc | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/content/browser/appcache/appcache_quota_client.cc b/content/browser/appcache/appcache_quota_client.cc new file mode 100644 index 0000000..2e8c2ab --- /dev/null +++ b/content/browser/appcache/appcache_quota_client.cc @@ -0,0 +1,253 @@ +// Copyright (c) 2012 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/appcache/appcache_quota_client.h" + +#include <algorithm> +#include <map> +#include <set> + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "content/browser/appcache/appcache_service_impl.h" + +using quota::QuotaClient; + +namespace { +quota::QuotaStatusCode NetErrorCodeToQuotaStatus(int code) { + if (code == net::OK) + return quota::kQuotaStatusOk; + else if (code == net::ERR_ABORTED) + return quota::kQuotaErrorAbort; + else + return quota::kQuotaStatusUnknown; +} + +void RunFront(content::AppCacheQuotaClient::RequestQueue* queue) { + base::Closure request = queue->front(); + queue->pop_front(); + request.Run(); +} +} // namespace + +namespace content { + +AppCacheQuotaClient::AppCacheQuotaClient(AppCacheServiceImpl* service) + : service_(service), + appcache_is_ready_(false), + quota_manager_is_destroyed_(false) { +} + +AppCacheQuotaClient::~AppCacheQuotaClient() { + DCHECK(pending_batch_requests_.empty()); + DCHECK(pending_serial_requests_.empty()); + DCHECK(current_delete_request_callback_.is_null()); +} + +QuotaClient::ID AppCacheQuotaClient::id() const { + return kAppcache; +} + +void AppCacheQuotaClient::OnQuotaManagerDestroyed() { + DeletePendingRequests(); + if (!current_delete_request_callback_.is_null()) { + current_delete_request_callback_.Reset(); + GetServiceDeleteCallback()->Cancel(); + } + + quota_manager_is_destroyed_ = true; + if (!service_) + delete this; +} + +void AppCacheQuotaClient::GetOriginUsage( + const GURL& origin, + quota::StorageType type, + const GetUsageCallback& callback) { + DCHECK(!callback.is_null()); + DCHECK(!quota_manager_is_destroyed_); + + if (!service_) { + callback.Run(0); + return; + } + + if (!appcache_is_ready_) { + pending_batch_requests_.push_back( + base::Bind(&AppCacheQuotaClient::GetOriginUsage, + base::Unretained(this), origin, type, callback)); + return; + } + + if (type != quota::kStorageTypeTemporary) { + callback.Run(0); + return; + } + + const AppCacheStorage::UsageMap* map = GetUsageMap(); + AppCacheStorage::UsageMap::const_iterator found = map->find(origin); + if (found == map->end()) { + callback.Run(0); + return; + } + callback.Run(found->second); +} + +void AppCacheQuotaClient::GetOriginsForType( + quota::StorageType type, + const GetOriginsCallback& callback) { + GetOriginsHelper(type, std::string(), callback); +} + +void AppCacheQuotaClient::GetOriginsForHost( + quota::StorageType type, + const std::string& host, + const GetOriginsCallback& callback) { + DCHECK(!callback.is_null()); + if (host.empty()) { + callback.Run(std::set<GURL>()); + return; + } + GetOriginsHelper(type, host, callback); +} + +void AppCacheQuotaClient::DeleteOriginData(const GURL& origin, + quota::StorageType type, + const DeletionCallback& callback) { + DCHECK(!quota_manager_is_destroyed_); + + if (!service_) { + callback.Run(quota::kQuotaErrorAbort); + return; + } + + if (!appcache_is_ready_ || !current_delete_request_callback_.is_null()) { + pending_serial_requests_.push_back( + base::Bind(&AppCacheQuotaClient::DeleteOriginData, + base::Unretained(this), origin, type, callback)); + return; + } + + current_delete_request_callback_ = callback; + if (type != quota::kStorageTypeTemporary) { + DidDeleteAppCachesForOrigin(net::OK); + return; + } + + service_->DeleteAppCachesForOrigin( + origin, GetServiceDeleteCallback()->callback()); +} + +bool AppCacheQuotaClient::DoesSupport(quota::StorageType type) const { + return type == quota::kStorageTypeTemporary; +} + +void AppCacheQuotaClient::DidDeleteAppCachesForOrigin(int rv) { + DCHECK(service_); + if (quota_manager_is_destroyed_) + return; + + // Finish the request by calling our callers callback. + current_delete_request_callback_.Run(NetErrorCodeToQuotaStatus(rv)); + current_delete_request_callback_.Reset(); + if (pending_serial_requests_.empty()) + return; + + // Start the next in the queue. + RunFront(&pending_serial_requests_); +} + +void AppCacheQuotaClient::GetOriginsHelper( + quota::StorageType type, + const std::string& opt_host, + const GetOriginsCallback& callback) { + DCHECK(!callback.is_null()); + DCHECK(!quota_manager_is_destroyed_); + + if (!service_) { + callback.Run(std::set<GURL>()); + return; + } + + if (!appcache_is_ready_) { + pending_batch_requests_.push_back( + base::Bind(&AppCacheQuotaClient::GetOriginsHelper, + base::Unretained(this), type, opt_host, callback)); + return; + } + + if (type != quota::kStorageTypeTemporary) { + callback.Run(std::set<GURL>()); + return; + } + + const AppCacheStorage::UsageMap* map = GetUsageMap(); + std::set<GURL> origins; + for (AppCacheStorage::UsageMap::const_iterator iter = map->begin(); + iter != map->end(); ++iter) { + if (opt_host.empty() || iter->first.host() == opt_host) + origins.insert(iter->first); + } + callback.Run(origins); +} + +void AppCacheQuotaClient::ProcessPendingRequests() { + DCHECK(appcache_is_ready_); + while (!pending_batch_requests_.empty()) + RunFront(&pending_batch_requests_); + + if (!pending_serial_requests_.empty()) + RunFront(&pending_serial_requests_); +} + +void AppCacheQuotaClient::DeletePendingRequests() { + pending_batch_requests_.clear(); + pending_serial_requests_.clear(); +} + +const AppCacheStorage::UsageMap* AppCacheQuotaClient::GetUsageMap() { + DCHECK(service_); + return service_->storage()->usage_map(); +} + +net::CancelableCompletionCallback* +AppCacheQuotaClient::GetServiceDeleteCallback() { + // Lazily created due to CancelableCompletionCallback's threading + // restrictions, there is no way to detach from the thread created on. + if (!service_delete_callback_) { + service_delete_callback_.reset( + new net::CancelableCompletionCallback( + base::Bind(&AppCacheQuotaClient::DidDeleteAppCachesForOrigin, + base::Unretained(this)))); + } + return service_delete_callback_.get(); +} + +void AppCacheQuotaClient::NotifyAppCacheReady() { + // Can reoccur during reinitialization. + if (!appcache_is_ready_) { + appcache_is_ready_ = true; + ProcessPendingRequests(); + } +} + +void AppCacheQuotaClient::NotifyAppCacheDestroyed() { + service_ = NULL; + while (!pending_batch_requests_.empty()) + RunFront(&pending_batch_requests_); + + while (!pending_serial_requests_.empty()) + RunFront(&pending_serial_requests_); + + if (!current_delete_request_callback_.is_null()) { + current_delete_request_callback_.Run(quota::kQuotaErrorAbort); + current_delete_request_callback_.Reset(); + GetServiceDeleteCallback()->Cancel(); + } + + if (quota_manager_is_destroyed_) + delete this; +} + +} // namespace content |