1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/browsing_data/browsing_data_appcache_helper.h" 6 7 #include "base/bind.h" 8 #include "base/bind_helpers.h" 9 #include "chrome/browser/browsing_data/browsing_data_helper.h" 10 #include "content/public/browser/browser_context.h" 11 #include "content/public/browser/browser_thread.h" 12 #include "content/public/browser/storage_partition.h" 13 14 using content::BrowserContext; 15 using content::BrowserThread; 16 17 BrowsingDataAppCacheHelper::BrowsingDataAppCacheHelper( 18 BrowserContext* browser_context) 19 : is_fetching_(false), 20 appcache_service_(BrowserContext::GetDefaultStoragePartition( 21 browser_context)->GetAppCacheService()) { 22 } 23 24 void BrowsingDataAppCacheHelper::StartFetching(const base::Closure& callback) { 25 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { 26 DCHECK(!is_fetching_); 27 DCHECK(!callback.is_null()); 28 is_fetching_ = true; 29 info_collection_ = new content::AppCacheInfoCollection; 30 completion_callback_ = callback; 31 BrowserThread::PostTask( 32 BrowserThread::IO, FROM_HERE, 33 base::Bind(&BrowsingDataAppCacheHelper::StartFetching, this, callback)); 34 return; 35 } 36 37 DCHECK_CURRENTLY_ON(BrowserThread::IO); 38 appcache_info_callback_.Reset( 39 base::Bind(&BrowsingDataAppCacheHelper::OnFetchComplete, 40 base::Unretained(this))); 41 appcache_service_->GetAllAppCacheInfo(info_collection_.get(), 42 appcache_info_callback_.callback()); 43 } 44 45 void BrowsingDataAppCacheHelper::DeleteAppCacheGroup( 46 const GURL& manifest_url) { 47 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { 48 BrowserThread::PostTask( 49 BrowserThread::IO, FROM_HERE, 50 base::Bind(&BrowsingDataAppCacheHelper::DeleteAppCacheGroup, this, 51 manifest_url)); 52 return; 53 } 54 55 appcache_service_->DeleteAppCacheGroup(manifest_url, 56 net::CompletionCallback()); 57 } 58 59 BrowsingDataAppCacheHelper::~BrowsingDataAppCacheHelper() {} 60 61 void BrowsingDataAppCacheHelper::OnFetchComplete(int rv) { 62 if (BrowserThread::CurrentlyOn(BrowserThread::IO)) { 63 // Filter out appcache info entries for non-websafe schemes. Extension state 64 // and DevTools, for example, are not considered browsing data. 65 typedef std::map<GURL, content::AppCacheInfoVector> InfoByOrigin; 66 InfoByOrigin& origin_map = info_collection_->infos_by_origin; 67 for (InfoByOrigin::iterator origin = origin_map.begin(); 68 origin != origin_map.end();) { 69 InfoByOrigin::iterator current = origin; 70 ++origin; 71 if (!BrowsingDataHelper::HasWebScheme(current->first)) 72 origin_map.erase(current); 73 } 74 75 BrowserThread::PostTask( 76 BrowserThread::UI, FROM_HERE, 77 base::Bind(&BrowsingDataAppCacheHelper::OnFetchComplete, this, rv)); 78 return; 79 } 80 81 DCHECK_CURRENTLY_ON(BrowserThread::UI); 82 DCHECK(is_fetching_); 83 is_fetching_ = false; 84 completion_callback_.Run(); 85 completion_callback_.Reset(); 86 } 87 88 CannedBrowsingDataAppCacheHelper::CannedBrowsingDataAppCacheHelper( 89 BrowserContext* browser_context) 90 : BrowsingDataAppCacheHelper(browser_context) { 91 info_collection_ = new content::AppCacheInfoCollection; 92 } 93 94 void CannedBrowsingDataAppCacheHelper::AddAppCache(const GURL& manifest_url) { 95 if (!BrowsingDataHelper::HasWebScheme(manifest_url)) 96 return; // Ignore non-websafe schemes. 97 98 OriginAppCacheInfoMap& origin_map = info_collection_->infos_by_origin; 99 content::AppCacheInfoVector& appcache_infos_ = 100 origin_map[manifest_url.GetOrigin()]; 101 102 for (content::AppCacheInfoVector::iterator 103 appcache = appcache_infos_.begin(); appcache != appcache_infos_.end(); 104 ++appcache) { 105 if (appcache->manifest_url == manifest_url) 106 return; 107 } 108 109 content::AppCacheInfo info; 110 info.manifest_url = manifest_url; 111 appcache_infos_.push_back(info); 112 } 113 114 void CannedBrowsingDataAppCacheHelper::Reset() { 115 info_collection_->infos_by_origin.clear(); 116 } 117 118 bool CannedBrowsingDataAppCacheHelper::empty() const { 119 return info_collection_->infos_by_origin.empty(); 120 } 121 122 size_t CannedBrowsingDataAppCacheHelper::GetAppCacheCount() const { 123 size_t count = 0; 124 const OriginAppCacheInfoMap& map = info_collection_->infos_by_origin; 125 for (OriginAppCacheInfoMap::const_iterator it = map.begin(); 126 it != map.end(); 127 ++it) { 128 count += it->second.size(); 129 } 130 return count; 131 } 132 133 const BrowsingDataAppCacheHelper::OriginAppCacheInfoMap& 134 CannedBrowsingDataAppCacheHelper::GetOriginAppCacheInfoMap() const { 135 return info_collection_->infos_by_origin; 136 } 137 138 void CannedBrowsingDataAppCacheHelper::StartFetching( 139 const base::Closure& completion_callback) { 140 completion_callback.Run(); 141 } 142 143 void CannedBrowsingDataAppCacheHelper::DeleteAppCacheGroup( 144 const GURL& manifest_url) { 145 info_collection_->infos_by_origin.erase(manifest_url.GetOrigin()); 146 BrowsingDataAppCacheHelper::DeleteAppCacheGroup(manifest_url); 147 } 148 149 CannedBrowsingDataAppCacheHelper::~CannedBrowsingDataAppCacheHelper() {} 150