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