// 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 "chrome/browser/browsing_data/browsing_data_appcache_helper.h" #include "base/bind.h" #include "base/bind_helpers.h" #include "chrome/browser/browsing_data/browsing_data_helper.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/url_constants.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/storage_partition.h" using content::BrowserThread; using content::BrowserContext; BrowsingDataAppCacheHelper::BrowsingDataAppCacheHelper(Profile* profile) : is_fetching_(false), appcache_service_(BrowserContext::GetDefaultStoragePartition(profile)-> GetAppCacheService()) { } void BrowsingDataAppCacheHelper::StartFetching(const base::Closure& callback) { if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { DCHECK(!is_fetching_); DCHECK(!callback.is_null()); is_fetching_ = true; info_collection_ = new content::AppCacheInfoCollection; completion_callback_ = callback; BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, base::Bind(&BrowsingDataAppCacheHelper::StartFetching, this, callback)); return; } DCHECK_CURRENTLY_ON(BrowserThread::IO); appcache_info_callback_.Reset( base::Bind(&BrowsingDataAppCacheHelper::OnFetchComplete, base::Unretained(this))); appcache_service_->GetAllAppCacheInfo(info_collection_.get(), appcache_info_callback_.callback()); } void BrowsingDataAppCacheHelper::DeleteAppCacheGroup( const GURL& manifest_url) { if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, base::Bind(&BrowsingDataAppCacheHelper::DeleteAppCacheGroup, this, manifest_url)); return; } appcache_service_->DeleteAppCacheGroup(manifest_url, net::CompletionCallback()); } BrowsingDataAppCacheHelper::~BrowsingDataAppCacheHelper() {} void BrowsingDataAppCacheHelper::OnFetchComplete(int rv) { if (BrowserThread::CurrentlyOn(BrowserThread::IO)) { // Filter out appcache info entries for non-websafe schemes. Extension state // and DevTools, for example, are not considered browsing data. typedef std::map InfoByOrigin; InfoByOrigin& origin_map = info_collection_->infos_by_origin; for (InfoByOrigin::iterator origin = origin_map.begin(); origin != origin_map.end();) { InfoByOrigin::iterator current = origin; ++origin; if (!BrowsingDataHelper::HasWebScheme(current->first)) origin_map.erase(current); } BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&BrowsingDataAppCacheHelper::OnFetchComplete, this, rv)); return; } DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(is_fetching_); is_fetching_ = false; completion_callback_.Run(); completion_callback_.Reset(); } CannedBrowsingDataAppCacheHelper::CannedBrowsingDataAppCacheHelper( Profile* profile) : BrowsingDataAppCacheHelper(profile), profile_(profile) { info_collection_ = new content::AppCacheInfoCollection; } CannedBrowsingDataAppCacheHelper* CannedBrowsingDataAppCacheHelper::Clone() { DCHECK_CURRENTLY_ON(BrowserThread::UI); CannedBrowsingDataAppCacheHelper* clone = new CannedBrowsingDataAppCacheHelper(profile_); clone->info_collection_->infos_by_origin = info_collection_->infos_by_origin; return clone; } void CannedBrowsingDataAppCacheHelper::AddAppCache(const GURL& manifest_url) { if (!BrowsingDataHelper::HasWebScheme(manifest_url)) return; // Ignore non-websafe schemes. OriginAppCacheInfoMap& origin_map = info_collection_->infos_by_origin; content::AppCacheInfoVector& appcache_infos_ = origin_map[manifest_url.GetOrigin()]; for (content::AppCacheInfoVector::iterator appcache = appcache_infos_.begin(); appcache != appcache_infos_.end(); ++appcache) { if (appcache->manifest_url == manifest_url) return; } content::AppCacheInfo info; info.manifest_url = manifest_url; appcache_infos_.push_back(info); } void CannedBrowsingDataAppCacheHelper::Reset() { info_collection_->infos_by_origin.clear(); } bool CannedBrowsingDataAppCacheHelper::empty() const { return info_collection_->infos_by_origin.empty(); } size_t CannedBrowsingDataAppCacheHelper::GetAppCacheCount() const { size_t count = 0; const OriginAppCacheInfoMap& map = info_collection_->infos_by_origin; for (OriginAppCacheInfoMap::const_iterator it = map.begin(); it != map.end(); ++it) { count += it->second.size(); } return count; } const BrowsingDataAppCacheHelper::OriginAppCacheInfoMap& CannedBrowsingDataAppCacheHelper::GetOriginAppCacheInfoMap() const { return info_collection_->infos_by_origin; } void CannedBrowsingDataAppCacheHelper::StartFetching( const base::Closure& completion_callback) { completion_callback.Run(); } void CannedBrowsingDataAppCacheHelper::DeleteAppCacheGroup( const GURL& manifest_url) { info_collection_->infos_by_origin.erase(manifest_url.GetOrigin()); BrowsingDataAppCacheHelper::DeleteAppCacheGroup(manifest_url); } CannedBrowsingDataAppCacheHelper::~CannedBrowsingDataAppCacheHelper() {}