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