browsing_data_appcache_helper.cc revision 731df977c0511bca2206b5f333555b1205ff1f43
1// Copyright (c) 2010 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_appcache_helper.h"
6
7#include "chrome/browser/browser_thread.h"
8#include "chrome/browser/net/chrome_url_request_context.h"
9#include "chrome/browser/profile.h"
10#include "chrome/common/url_constants.h"
11#include "webkit/appcache/appcache_database.h"
12#include "webkit/appcache/appcache_storage.h"
13
14using appcache::AppCacheDatabase;
15
16BrowsingDataAppCacheHelper::BrowsingDataAppCacheHelper(Profile* profile)
17    : request_context_getter_(profile->GetRequestContext()),
18      is_fetching_(false) {
19}
20
21void BrowsingDataAppCacheHelper::StartFetching(Callback0::Type* callback) {
22  if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
23    DCHECK(!is_fetching_);
24    DCHECK(callback);
25    is_fetching_ = true;
26    info_collection_ = new appcache::AppCacheInfoCollection;
27    completion_callback_.reset(callback);
28    BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, NewRunnableMethod(
29        this, &BrowsingDataAppCacheHelper::StartFetching, callback));
30    return;
31  }
32
33  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
34  appcache_info_callback_ =
35      new net::CancelableCompletionCallback<BrowsingDataAppCacheHelper>(
36          this, &BrowsingDataAppCacheHelper::OnFetchComplete);
37  GetAppCacheService()->GetAllAppCacheInfo(info_collection_,
38                                           appcache_info_callback_);
39}
40
41void BrowsingDataAppCacheHelper::CancelNotification() {
42  if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
43    completion_callback_.reset();
44    BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, NewRunnableMethod(
45        this, &BrowsingDataAppCacheHelper::CancelNotification));
46    return;
47  }
48
49  if (appcache_info_callback_)
50    appcache_info_callback_.release()->Cancel();
51}
52
53void BrowsingDataAppCacheHelper::DeleteAppCacheGroup(
54    const GURL& manifest_url) {
55  if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
56    BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, NewRunnableMethod(
57        this, &BrowsingDataAppCacheHelper::DeleteAppCacheGroup,
58        manifest_url));
59    return;
60  }
61  GetAppCacheService()->DeleteAppCacheGroup(manifest_url, NULL);
62}
63
64BrowsingDataAppCacheHelper::~BrowsingDataAppCacheHelper() {}
65
66void BrowsingDataAppCacheHelper::OnFetchComplete(int rv) {
67  if (BrowserThread::CurrentlyOn(BrowserThread::IO)) {
68    // Filter out appache info entries for extensions. Extension state is not
69    // considered browsing data.
70    typedef std::map<GURL, appcache::AppCacheInfoVector> InfoByOrigin;
71    InfoByOrigin& origin_map = info_collection_->infos_by_origin;
72    for (InfoByOrigin::iterator origin = origin_map.begin();
73         origin != origin_map.end();) {
74      InfoByOrigin::iterator current = origin;
75      ++origin;
76      if (current->first.SchemeIs(chrome::kExtensionScheme))
77        origin_map.erase(current);
78    }
79
80    appcache_info_callback_ = NULL;
81    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, NewRunnableMethod(
82        this, &BrowsingDataAppCacheHelper::OnFetchComplete, rv));
83    return;
84  }
85
86  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
87  DCHECK(is_fetching_);
88  is_fetching_ = false;
89  if (completion_callback_ != NULL) {
90    completion_callback_->Run();
91    completion_callback_.reset();
92  }
93}
94
95ChromeAppCacheService* BrowsingDataAppCacheHelper::GetAppCacheService() {
96  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
97  ChromeURLRequestContext* request_context =
98      reinterpret_cast<ChromeURLRequestContext*>(
99          request_context_getter_->GetURLRequestContext());
100  return request_context ? request_context->appcache_service()
101                         : NULL;
102}
103
104CannedBrowsingDataAppCacheHelper::CannedBrowsingDataAppCacheHelper(
105    Profile* profile)
106    : BrowsingDataAppCacheHelper(profile) {
107  info_collection_ = new appcache::AppCacheInfoCollection;
108}
109
110void CannedBrowsingDataAppCacheHelper::AddAppCache(const GURL& manifest_url) {
111  typedef std::map<GURL, appcache::AppCacheInfoVector> InfoByOrigin;
112  InfoByOrigin& origin_map = info_collection_->infos_by_origin;
113  appcache::AppCacheInfoVector& appcache_infos_ =
114      origin_map[manifest_url.GetOrigin()];
115
116  for (appcache::AppCacheInfoVector::iterator
117       appcache = appcache_infos_.begin(); appcache != appcache_infos_.end();
118       ++appcache) {
119    if (appcache->manifest_url == manifest_url)
120      return;
121  }
122
123  appcache::AppCacheInfo info;
124  info.manifest_url = manifest_url;
125  appcache_infos_.push_back(info);
126}
127
128void CannedBrowsingDataAppCacheHelper::Reset() {
129  info_collection_->infos_by_origin.clear();
130}
131
132bool CannedBrowsingDataAppCacheHelper::empty() const {
133  return info_collection_->infos_by_origin.empty();
134}
135
136void CannedBrowsingDataAppCacheHelper::StartFetching(
137    Callback0::Type* completion_callback) {
138  completion_callback->Run();
139  delete completion_callback;
140}
141
142CannedBrowsingDataAppCacheHelper::~CannedBrowsingDataAppCacheHelper() {}
143