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/content_settings/local_shared_objects_container.h" 6 7#include "chrome/browser/browsing_data/browsing_data_appcache_helper.h" 8#include "chrome/browser/browsing_data/browsing_data_channel_id_helper.h" 9#include "chrome/browser/browsing_data/browsing_data_cookie_helper.h" 10#include "chrome/browser/browsing_data/browsing_data_database_helper.h" 11#include "chrome/browser/browsing_data/browsing_data_file_system_helper.h" 12#include "chrome/browser/browsing_data/browsing_data_indexed_db_helper.h" 13#include "chrome/browser/browsing_data/browsing_data_local_storage_helper.h" 14#include "chrome/browser/browsing_data/browsing_data_service_worker_helper.h" 15#include "chrome/browser/browsing_data/canonical_cookie_hash.h" 16#include "chrome/browser/browsing_data/cookies_tree_model.h" 17#include "chrome/browser/profiles/profile.h" 18#include "content/public/browser/storage_partition.h" 19#include "content/public/common/url_constants.h" 20#include "net/base/registry_controlled_domains/registry_controlled_domain.h" 21#include "net/cookies/canonical_cookie.h" 22#include "url/gurl.h" 23 24namespace { 25 26bool SameDomainOrHost(const GURL& gurl1, const GURL& gurl2) { 27 return net::registry_controlled_domains::SameDomainOrHost( 28 gurl1, 29 gurl2, 30 net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); 31} 32 33} // namespace 34 35LocalSharedObjectsContainer::LocalSharedObjectsContainer(Profile* profile) 36 : appcaches_(new CannedBrowsingDataAppCacheHelper(profile)), 37 channel_ids_(new CannedBrowsingDataChannelIDHelper()), 38 cookies_(new CannedBrowsingDataCookieHelper( 39 profile->GetRequestContext())), 40 databases_(new CannedBrowsingDataDatabaseHelper(profile)), 41 file_systems_(new CannedBrowsingDataFileSystemHelper(profile)), 42 indexed_dbs_(new CannedBrowsingDataIndexedDBHelper( 43 content::BrowserContext::GetDefaultStoragePartition(profile)-> 44 GetIndexedDBContext())), 45 local_storages_(new CannedBrowsingDataLocalStorageHelper(profile)), 46 service_workers_(new CannedBrowsingDataServiceWorkerHelper( 47 content::BrowserContext::GetDefaultStoragePartition(profile)-> 48 GetServiceWorkerContext())), 49 session_storages_(new CannedBrowsingDataLocalStorageHelper(profile)) { 50} 51 52LocalSharedObjectsContainer::~LocalSharedObjectsContainer() { 53} 54 55void LocalSharedObjectsContainer::Reset() { 56 appcaches_->Reset(); 57 channel_ids_->Reset(); 58 cookies_->Reset(); 59 databases_->Reset(); 60 file_systems_->Reset(); 61 indexed_dbs_->Reset(); 62 local_storages_->Reset(); 63 service_workers_->Reset(); 64 session_storages_->Reset(); 65} 66 67size_t LocalSharedObjectsContainer::GetObjectCount() const { 68 size_t count = 0; 69 count += appcaches()->GetAppCacheCount(); 70 count += channel_ids()->GetChannelIDCount(); 71 count += cookies()->GetCookieCount(); 72 count += databases()->GetDatabaseCount(); 73 count += file_systems()->GetFileSystemCount(); 74 count += indexed_dbs()->GetIndexedDBCount(); 75 count += local_storages()->GetLocalStorageCount(); 76 count += service_workers()->GetServiceWorkerCount(); 77 count += session_storages()->GetLocalStorageCount(); 78 return count; 79} 80 81size_t LocalSharedObjectsContainer::GetObjectCountForDomain( 82 const GURL& origin) const { 83 size_t count = 0; 84 85 // Count all cookies that have the same domain as the provided |origin|. This 86 // means count all cookies that has been set by a host that is not considered 87 // to be a third party regarding the domain of the provided |origin|. 88 // E.g. if the origin is "http://foo.com" then all cookies with domain foo.com, 89 // a.foo.com, b.a.foo.com or *.foo.com will be counted. 90 typedef CannedBrowsingDataCookieHelper::OriginCookieSetMap OriginCookieSetMap; 91 const OriginCookieSetMap& origin_cookies_set_map = 92 cookies()->origin_cookie_set_map(); 93 for (OriginCookieSetMap::const_iterator it = origin_cookies_set_map.begin(); 94 it != origin_cookies_set_map.end(); 95 ++it) { 96 const canonical_cookie::CookieHashSet* cookie_list = it->second; 97 for (canonical_cookie::CookieHashSet::const_iterator cookie = 98 cookie_list->begin(); 99 cookie != cookie_list->end(); 100 ++cookie) { 101 // Strip leading '.'s. 102 std::string cookie_domain = cookie->Domain(); 103 if (cookie_domain[0] == '.') 104 cookie_domain = cookie_domain.substr(1); 105 // The |domain_url| is only created in order to use the 106 // SameDomainOrHost method below. It does not matter which scheme is 107 // used as the scheme is ignored by the SameDomainOrHost method. 108 GURL domain_url(std::string(url::kHttpScheme) + 109 url::kStandardSchemeSeparator + cookie_domain); 110 if (SameDomainOrHost(origin, domain_url)) 111 ++count; 112 } 113 } 114 115 // Count local storages for the domain of the given |origin|. 116 const std::set<GURL> local_storage_info = 117 local_storages()->GetLocalStorageInfo(); 118 for (std::set<GURL>::const_iterator it = local_storage_info.begin(); 119 it != local_storage_info.end(); 120 ++it) { 121 if (SameDomainOrHost(origin, *it)) 122 ++count; 123 } 124 125 // Count session storages for the domain of the given |origin|. 126 const std::set<GURL> urls = session_storages()->GetLocalStorageInfo(); 127 for (std::set<GURL>::const_iterator it = urls.begin(); 128 it != urls.end(); 129 ++it) { 130 if (SameDomainOrHost(origin, *it)) 131 ++count; 132 } 133 134 // Count indexed dbs for the domain of the given |origin|. 135 typedef CannedBrowsingDataIndexedDBHelper::PendingIndexedDBInfo IndexedDBInfo; 136 const std::set<IndexedDBInfo>& indexed_db_info = 137 indexed_dbs()->GetIndexedDBInfo(); 138 for (std::set<IndexedDBInfo>::const_iterator it = 139 indexed_db_info.begin(); 140 it != indexed_db_info.end(); 141 ++it) { 142 if (SameDomainOrHost(origin, it->origin)) 143 ++count; 144 } 145 146 // Count service workers for the domain of the given |origin|. 147 typedef CannedBrowsingDataServiceWorkerHelper::PendingServiceWorkerUsageInfo 148 ServiceWorkerInfo; 149 const std::set<ServiceWorkerInfo>& service_worker_info = 150 service_workers()->GetServiceWorkerUsageInfo(); 151 for (std::set<ServiceWorkerInfo>::const_iterator it = 152 service_worker_info.begin(); 153 it != service_worker_info.end(); 154 ++it) { 155 if (SameDomainOrHost(origin, it->origin)) 156 ++count; 157 } 158 159 // Count filesystems for the domain of the given |origin|. 160 typedef BrowsingDataFileSystemHelper::FileSystemInfo FileSystemInfo; 161 typedef std::list<FileSystemInfo> FileSystemInfoList; 162 const FileSystemInfoList& file_system_info = 163 file_systems()->GetFileSystemInfo(); 164 for (FileSystemInfoList::const_iterator it = file_system_info.begin(); 165 it != file_system_info.end(); 166 ++it) { 167 if (SameDomainOrHost(origin, it->origin)) 168 ++count; 169 } 170 171 // Count databases for the domain of the given |origin|. 172 typedef CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo DatabaseInfo; 173 const std::set<DatabaseInfo>& database_list = 174 databases()->GetPendingDatabaseInfo(); 175 for (std::set<DatabaseInfo>::const_iterator it = 176 database_list.begin(); 177 it != database_list.end(); 178 ++it) { 179 if (SameDomainOrHost(origin, it->origin)) 180 ++count; 181 } 182 183 // Count the AppCache manifest files for the domain of the given |origin|. 184 typedef BrowsingDataAppCacheHelper::OriginAppCacheInfoMap 185 OriginAppCacheInfoMap; 186 const OriginAppCacheInfoMap& map = appcaches()->GetOriginAppCacheInfoMap(); 187 for (OriginAppCacheInfoMap::const_iterator it = map.begin(); 188 it != map.end(); 189 ++it) { 190 const content::AppCacheInfoVector& info_vector = it->second; 191 for (content::AppCacheInfoVector::const_iterator info = 192 info_vector.begin(); 193 info != info_vector.end(); 194 ++info) { 195 if (SameDomainOrHost(origin, info->manifest_url)) 196 ++count; 197 } 198 } 199 200 return count; 201} 202 203scoped_ptr<CookiesTreeModel> 204LocalSharedObjectsContainer::CreateCookiesTreeModel() const { 205 LocalDataContainer* container = new LocalDataContainer( 206 cookies(), 207 databases(), 208 local_storages(), 209 session_storages(), 210 appcaches(), 211 indexed_dbs(), 212 file_systems(), 213 NULL, 214 channel_ids(), 215 service_workers(), 216 NULL); 217 218 return make_scoped_ptr(new CookiesTreeModel(container, NULL, true)); 219} 220