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.
5 #include "chrome/browser/content_settings/local_shared_objects_container.h"
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"
26 bool SameDomainOrHost(const GURL
& gurl1
, const GURL
& gurl2
) {
27 return net::registry_controlled_domains::SameDomainOrHost(
30 net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES
);
35 LocalSharedObjectsContainer::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
)) {
52 LocalSharedObjectsContainer::~LocalSharedObjectsContainer() {
55 void LocalSharedObjectsContainer::Reset() {
57 channel_ids_
->Reset();
60 file_systems_
->Reset();
61 indexed_dbs_
->Reset();
62 local_storages_
->Reset();
63 service_workers_
->Reset();
64 session_storages_
->Reset();
67 size_t LocalSharedObjectsContainer::GetObjectCount() const {
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();
81 size_t LocalSharedObjectsContainer::GetObjectCountForDomain(
82 const GURL
& origin
) const {
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();
96 const canonical_cookie::CookieHashSet
* cookie_list
= it
->second
;
97 for (canonical_cookie::CookieHashSet::const_iterator cookie
=
99 cookie
!= cookie_list
->end();
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
))
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();
121 if (SameDomainOrHost(origin
, *it
))
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();
130 if (SameDomainOrHost(origin
, *it
))
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();
142 if (SameDomainOrHost(origin
, it
->origin
))
146 // Count service workers for the domain of the given |origin|.
147 typedef CannedBrowsingDataServiceWorkerHelper::PendingServiceWorkerUsageInfo
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();
155 if (SameDomainOrHost(origin
, it
->origin
))
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();
167 if (SameDomainOrHost(origin
, it
->origin
))
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();
179 if (SameDomainOrHost(origin
, it
->origin
))
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();
190 const content::AppCacheInfoVector
& info_vector
= it
->second
;
191 for (content::AppCacheInfoVector::const_iterator info
=
193 info
!= info_vector
.end();
195 if (SameDomainOrHost(origin
, info
->manifest_url
))
203 scoped_ptr
<CookiesTreeModel
>
204 LocalSharedObjectsContainer::CreateCookiesTreeModel() const {
205 LocalDataContainer
* container
= new LocalDataContainer(
218 return make_scoped_ptr(new CookiesTreeModel(container
, NULL
, true));