Home | History | Annotate | Download | only in browsing_data
      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/browsing_data/browsing_data_appcache_helper.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/bind_helpers.h"
      9 #include "chrome/browser/browsing_data/browsing_data_helper.h"
     10 #include "content/public/browser/browser_context.h"
     11 #include "content/public/browser/browser_thread.h"
     12 #include "content/public/browser/storage_partition.h"
     13 
     14 using content::BrowserContext;
     15 using content::BrowserThread;
     16 
     17 BrowsingDataAppCacheHelper::BrowsingDataAppCacheHelper(
     18     BrowserContext* browser_context)
     19     : is_fetching_(false),
     20       appcache_service_(BrowserContext::GetDefaultStoragePartition(
     21                             browser_context)->GetAppCacheService()) {
     22 }
     23 
     24 void BrowsingDataAppCacheHelper::StartFetching(const base::Closure& callback) {
     25   if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
     26     DCHECK(!is_fetching_);
     27     DCHECK(!callback.is_null());
     28     is_fetching_ = true;
     29     info_collection_ = new content::AppCacheInfoCollection;
     30     completion_callback_ = callback;
     31     BrowserThread::PostTask(
     32         BrowserThread::IO, FROM_HERE,
     33         base::Bind(&BrowsingDataAppCacheHelper::StartFetching, this, callback));
     34     return;
     35   }
     36 
     37   DCHECK_CURRENTLY_ON(BrowserThread::IO);
     38   appcache_info_callback_.Reset(
     39       base::Bind(&BrowsingDataAppCacheHelper::OnFetchComplete,
     40                  base::Unretained(this)));
     41   appcache_service_->GetAllAppCacheInfo(info_collection_.get(),
     42                                         appcache_info_callback_.callback());
     43 }
     44 
     45 void BrowsingDataAppCacheHelper::DeleteAppCacheGroup(
     46     const GURL& manifest_url) {
     47   if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
     48     BrowserThread::PostTask(
     49         BrowserThread::IO, FROM_HERE,
     50         base::Bind(&BrowsingDataAppCacheHelper::DeleteAppCacheGroup, this,
     51                    manifest_url));
     52     return;
     53   }
     54 
     55   appcache_service_->DeleteAppCacheGroup(manifest_url,
     56                                          net::CompletionCallback());
     57 }
     58 
     59 BrowsingDataAppCacheHelper::~BrowsingDataAppCacheHelper() {}
     60 
     61 void BrowsingDataAppCacheHelper::OnFetchComplete(int rv) {
     62   if (BrowserThread::CurrentlyOn(BrowserThread::IO)) {
     63     // Filter out appcache info entries for non-websafe schemes. Extension state
     64     // and DevTools, for example, are not considered browsing data.
     65     typedef std::map<GURL, content::AppCacheInfoVector> InfoByOrigin;
     66     InfoByOrigin& origin_map = info_collection_->infos_by_origin;
     67     for (InfoByOrigin::iterator origin = origin_map.begin();
     68          origin != origin_map.end();) {
     69       InfoByOrigin::iterator current = origin;
     70       ++origin;
     71       if (!BrowsingDataHelper::HasWebScheme(current->first))
     72         origin_map.erase(current);
     73     }
     74 
     75     BrowserThread::PostTask(
     76         BrowserThread::UI, FROM_HERE,
     77         base::Bind(&BrowsingDataAppCacheHelper::OnFetchComplete, this, rv));
     78     return;
     79   }
     80 
     81   DCHECK_CURRENTLY_ON(BrowserThread::UI);
     82   DCHECK(is_fetching_);
     83   is_fetching_ = false;
     84   completion_callback_.Run();
     85   completion_callback_.Reset();
     86 }
     87 
     88 CannedBrowsingDataAppCacheHelper::CannedBrowsingDataAppCacheHelper(
     89     BrowserContext* browser_context)
     90     : BrowsingDataAppCacheHelper(browser_context) {
     91   info_collection_ = new content::AppCacheInfoCollection;
     92 }
     93 
     94 void CannedBrowsingDataAppCacheHelper::AddAppCache(const GURL& manifest_url) {
     95   if (!BrowsingDataHelper::HasWebScheme(manifest_url))
     96     return;  // Ignore non-websafe schemes.
     97 
     98   OriginAppCacheInfoMap& origin_map = info_collection_->infos_by_origin;
     99   content::AppCacheInfoVector& appcache_infos_ =
    100       origin_map[manifest_url.GetOrigin()];
    101 
    102   for (content::AppCacheInfoVector::iterator
    103        appcache = appcache_infos_.begin(); appcache != appcache_infos_.end();
    104        ++appcache) {
    105     if (appcache->manifest_url == manifest_url)
    106       return;
    107   }
    108 
    109   content::AppCacheInfo info;
    110   info.manifest_url = manifest_url;
    111   appcache_infos_.push_back(info);
    112 }
    113 
    114 void CannedBrowsingDataAppCacheHelper::Reset() {
    115   info_collection_->infos_by_origin.clear();
    116 }
    117 
    118 bool CannedBrowsingDataAppCacheHelper::empty() const {
    119   return info_collection_->infos_by_origin.empty();
    120 }
    121 
    122 size_t CannedBrowsingDataAppCacheHelper::GetAppCacheCount() const {
    123   size_t count = 0;
    124   const OriginAppCacheInfoMap& map = info_collection_->infos_by_origin;
    125   for (OriginAppCacheInfoMap::const_iterator it = map.begin();
    126        it != map.end();
    127        ++it) {
    128     count += it->second.size();
    129   }
    130   return count;
    131 }
    132 
    133 const BrowsingDataAppCacheHelper::OriginAppCacheInfoMap&
    134 CannedBrowsingDataAppCacheHelper::GetOriginAppCacheInfoMap() const {
    135   return info_collection_->infos_by_origin;
    136 }
    137 
    138 void CannedBrowsingDataAppCacheHelper::StartFetching(
    139     const base::Closure& completion_callback) {
    140   completion_callback.Run();
    141 }
    142 
    143 void CannedBrowsingDataAppCacheHelper::DeleteAppCacheGroup(
    144     const GURL& manifest_url) {
    145   info_collection_->infos_by_origin.erase(manifest_url.GetOrigin());
    146   BrowsingDataAppCacheHelper::DeleteAppCacheGroup(manifest_url);
    147 }
    148 
    149 CannedBrowsingDataAppCacheHelper::~CannedBrowsingDataAppCacheHelper() {}
    150