15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/appcache/appcache_quota_client.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "webkit/browser/appcache/appcache_service_impl.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using quota::QuotaClient;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)quota::QuotaStatusCode NetErrorCodeToQuotaStatus(int code) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (code == net::OK)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return quota::kQuotaStatusOk;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (code == net::ERR_ABORTED)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return quota::kQuotaErrorAbort;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return quota::kQuotaStatusUnknown;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RunFront(appcache::AppCacheQuotaClient::RequestQueue* queue) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure request = queue->front();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  queue->pop_front();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request.Run();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace appcache {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)AppCacheQuotaClient::AppCacheQuotaClient(AppCacheServiceImpl* service)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : service_(service),
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      appcache_is_ready_(false),
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      quota_manager_is_destroyed_(false) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppCacheQuotaClient::~AppCacheQuotaClient() {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(pending_batch_requests_.empty());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(pending_serial_requests_.empty());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(current_delete_request_callback_.is_null());
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuotaClient::ID AppCacheQuotaClient::id() const {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kAppcache;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppCacheQuotaClient::OnQuotaManagerDestroyed() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeletePendingRequests();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!current_delete_request_callback_.is_null()) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_delete_request_callback_.Reset();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetServiceDeleteCallback()->Cancel();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager_is_destroyed_ = true;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!service_)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete this;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppCacheQuotaClient::GetOriginUsage(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& origin,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota::StorageType type,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GetUsageCallback& callback) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!callback.is_null());
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!quota_manager_is_destroyed_);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!service_) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(0);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!appcache_is_ready_) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_batch_requests_.push_back(
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&AppCacheQuotaClient::GetOriginUsage,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this), origin, type, callback));
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (type != quota::kStorageTypeTemporary) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(0);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const AppCacheStorage::UsageMap* map = GetUsageMap();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheStorage::UsageMap::const_iterator found = map->find(origin);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (found == map->end()) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(0);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(found->second);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppCacheQuotaClient::GetOriginsForType(
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota::StorageType type,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GetOriginsCallback& callback) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetOriginsHelper(type, std::string(), callback);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppCacheQuotaClient::GetOriginsForHost(
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota::StorageType type,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& host,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GetOriginsCallback& callback) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!callback.is_null());
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host.empty()) {
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    callback.Run(std::set<GURL>());
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetOriginsHelper(type, host, callback);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppCacheQuotaClient::DeleteOriginData(const GURL& origin,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           quota::StorageType type,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const DeletionCallback& callback) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!quota_manager_is_destroyed_);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!service_) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(quota::kQuotaErrorAbort);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!appcache_is_ready_ || !current_delete_request_callback_.is_null()) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_serial_requests_.push_back(
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&AppCacheQuotaClient::DeleteOriginData,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this), origin, type, callback));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_delete_request_callback_ = callback;
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (type != quota::kStorageTypeTemporary) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DidDeleteAppCachesForOrigin(net::OK);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service_->DeleteAppCachesForOrigin(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin, GetServiceDeleteCallback()->callback());
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool AppCacheQuotaClient::DoesSupport(quota::StorageType type) const {
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return type == quota::kStorageTypeTemporary;
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppCacheQuotaClient::DidDeleteAppCachesForOrigin(int rv) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(service_);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (quota_manager_is_destroyed_)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finish the request by calling our callers callback.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_delete_request_callback_.Run(NetErrorCodeToQuotaStatus(rv));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_delete_request_callback_.Reset();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pending_serial_requests_.empty())
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start the next in the queue.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunFront(&pending_serial_requests_);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppCacheQuotaClient::GetOriginsHelper(
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota::StorageType type,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& opt_host,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GetOriginsCallback& callback) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!callback.is_null());
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!quota_manager_is_destroyed_);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!service_) {
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    callback.Run(std::set<GURL>());
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!appcache_is_ready_) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_batch_requests_.push_back(
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&AppCacheQuotaClient::GetOriginsHelper,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this), type, opt_host, callback));
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (type != quota::kStorageTypeTemporary) {
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    callback.Run(std::set<GURL>());
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const AppCacheStorage::UsageMap* map = GetUsageMap();
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<GURL> origins;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (AppCacheStorage::UsageMap::const_iterator iter = map->begin();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != map->end(); ++iter) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (opt_host.empty() || iter->first.host() == opt_host)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origins.insert(iter->first);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  callback.Run(origins);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppCacheQuotaClient::ProcessPendingRequests() {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(appcache_is_ready_);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!pending_batch_requests_.empty())
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunFront(&pending_batch_requests_);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!pending_serial_requests_.empty())
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunFront(&pending_serial_requests_);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppCacheQuotaClient::DeletePendingRequests() {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_batch_requests_.clear();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_serial_requests_.clear();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const AppCacheStorage::UsageMap* AppCacheQuotaClient::GetUsageMap() {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(service_);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return service_->storage()->usage_map();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::CancelableCompletionCallback*
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppCacheQuotaClient::GetServiceDeleteCallback() {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lazily created due to CancelableCompletionCallback's threading
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // restrictions, there is no way to detach from the thread created on.
218b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!service_delete_callback_) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_delete_callback_.reset(
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new net::CancelableCompletionCallback(
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Bind(&AppCacheQuotaClient::DidDeleteAppCachesForOrigin,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Unretained(this))));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return service_delete_callback_.get();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppCacheQuotaClient::NotifyAppCacheReady() {
2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Can reoccur during reinitialization.
2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!appcache_is_ready_) {
2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    appcache_is_ready_ = true;
2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ProcessPendingRequests();
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppCacheQuotaClient::NotifyAppCacheDestroyed() {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service_ = NULL;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!pending_batch_requests_.empty())
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunFront(&pending_batch_requests_);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!pending_serial_requests_.empty())
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunFront(&pending_serial_requests_);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!current_delete_request_callback_.is_null()) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_delete_request_callback_.Run(quota::kQuotaErrorAbort);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_delete_request_callback_.Reset();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetServiceDeleteCallback()->Cancel();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (quota_manager_is_destroyed_)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete this;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace appcache
254