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