15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_appcache_helper.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_helper.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserContext;
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing content::BrowserThread;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBrowsingDataAppCacheHelper::BrowsingDataAppCacheHelper(
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    BrowserContext* browser_context)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : is_fetching_(false),
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      appcache_service_(BrowserContext::GetDefaultStoragePartition(
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            browser_context)->GetAppCacheService()) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataAppCacheHelper::StartFetching(const base::Closure& callback) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!is_fetching_);
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DCHECK(!callback.is_null());
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_fetching_ = true;
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    info_collection_ = new content::AppCacheInfoCollection;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    completion_callback_ = callback;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataAppCacheHelper::StartFetching, this, callback));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  appcache_info_callback_.Reset(
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataAppCacheHelper::OnFetchComplete,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  appcache_service_->GetAllAppCacheInfo(info_collection_.get(),
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                        appcache_info_callback_.callback());
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataAppCacheHelper::DeleteAppCacheGroup(
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& manifest_url) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataAppCacheHelper::DeleteAppCacheGroup, this,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   manifest_url));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  appcache_service_->DeleteAppCacheGroup(manifest_url,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         net::CompletionCallback());
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataAppCacheHelper::~BrowsingDataAppCacheHelper() {}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataAppCacheHelper::OnFetchComplete(int rv) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (BrowserThread::CurrentlyOn(BrowserThread::IO)) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Filter out appcache info entries for non-websafe schemes. Extension state
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and DevTools, for example, are not considered browsing data.
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    typedef std::map<GURL, content::AppCacheInfoVector> InfoByOrigin;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InfoByOrigin& origin_map = info_collection_->infos_by_origin;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (InfoByOrigin::iterator origin = origin_map.begin();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         origin != origin_map.end();) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InfoByOrigin::iterator current = origin;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++origin;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!BrowsingDataHelper::HasWebScheme(current->first))
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        origin_map.erase(current);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::UI, FROM_HERE,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataAppCacheHelper::OnFetchComplete, this, rv));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(is_fetching_);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_fetching_ = false;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  completion_callback_.Run();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  completion_callback_.Reset();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CannedBrowsingDataAppCacheHelper::CannedBrowsingDataAppCacheHelper(
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    BrowserContext* browser_context)
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : BrowsingDataAppCacheHelper(browser_context) {
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  info_collection_ = new content::AppCacheInfoCollection;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedBrowsingDataAppCacheHelper::AddAppCache(const GURL& manifest_url) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BrowsingDataHelper::HasWebScheme(manifest_url))
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;  // Ignore non-websafe schemes.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OriginAppCacheInfoMap& origin_map = info_collection_->infos_by_origin;
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::AppCacheInfoVector& appcache_infos_ =
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_map[manifest_url.GetOrigin()];
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (content::AppCacheInfoVector::iterator
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       appcache = appcache_infos_.begin(); appcache != appcache_infos_.end();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++appcache) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (appcache->manifest_url == manifest_url)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::AppCacheInfo info;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.manifest_url = manifest_url;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  appcache_infos_.push_back(info);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedBrowsingDataAppCacheHelper::Reset() {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info_collection_->infos_by_origin.clear();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CannedBrowsingDataAppCacheHelper::empty() const {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return info_collection_->infos_by_origin.empty();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t CannedBrowsingDataAppCacheHelper::GetAppCacheCount() const {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t count = 0;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const OriginAppCacheInfoMap& map = info_collection_->infos_by_origin;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (OriginAppCacheInfoMap::const_iterator it = map.begin();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != map.end();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++it) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    count += it->second.size();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return count;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const BrowsingDataAppCacheHelper::OriginAppCacheInfoMap&
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CannedBrowsingDataAppCacheHelper::GetOriginAppCacheInfoMap() const {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return info_collection_->infos_by_origin;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedBrowsingDataAppCacheHelper::StartFetching(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Closure& completion_callback) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  completion_callback.Run();
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CannedBrowsingDataAppCacheHelper::DeleteAppCacheGroup(
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const GURL& manifest_url) {
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  info_collection_->infos_by_origin.erase(manifest_url.GetOrigin());
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BrowsingDataAppCacheHelper::DeleteAppCacheGroup(manifest_url);
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CannedBrowsingDataAppCacheHelper::~CannedBrowsingDataAppCacheHelper() {}
150