Home | History | Annotate | Download | only in content_settings
      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 
     24 namespace {
     25 
     26 bool 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 
     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)) {
     50 }
     51 
     52 LocalSharedObjectsContainer::~LocalSharedObjectsContainer() {
     53 }
     54 
     55 void 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 
     67 size_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 
     81 size_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 
    203 scoped_ptr<CookiesTreeModel>
    204 LocalSharedObjectsContainer::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