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/net/chrome_url_request_context.h"
8 #include "chrome/browser/profiles/profile.h"
9 #include "chrome/common/url_constants.h"
10 #include "content/browser/browser_thread.h"
11 #include "webkit/appcache/appcache_database.h"
12 #include "webkit/appcache/appcache_storage.h"
13
14 using appcache::AppCacheDatabase;
15
BrowsingDataAppCacheHelper(Profile * profile)16 BrowsingDataAppCacheHelper::BrowsingDataAppCacheHelper(Profile* profile)
17 : request_context_getter_(profile->GetRequestContext()),
18 is_fetching_(false) {
19 }
20
StartFetching(Callback0::Type * callback)21 void 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
CancelNotification()41 void 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
DeleteAppCacheGroup(const GURL & manifest_url)53 void 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
~BrowsingDataAppCacheHelper()64 BrowsingDataAppCacheHelper::~BrowsingDataAppCacheHelper() {}
65
OnFetchComplete(int rv)66 void 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
GetAppCacheService()95 ChromeAppCacheService* 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
CannedBrowsingDataAppCacheHelper(Profile * profile)104 CannedBrowsingDataAppCacheHelper::CannedBrowsingDataAppCacheHelper(
105 Profile* profile)
106 : BrowsingDataAppCacheHelper(profile),
107 profile_(profile) {
108 info_collection_ = new appcache::AppCacheInfoCollection;
109 }
110
Clone()111 CannedBrowsingDataAppCacheHelper* CannedBrowsingDataAppCacheHelper::Clone() {
112 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
113 CannedBrowsingDataAppCacheHelper* clone =
114 new CannedBrowsingDataAppCacheHelper(profile_);
115
116 clone->info_collection_->infos_by_origin = info_collection_->infos_by_origin;
117 return clone;
118 }
119
AddAppCache(const GURL & manifest_url)120 void CannedBrowsingDataAppCacheHelper::AddAppCache(const GURL& manifest_url) {
121 typedef std::map<GURL, appcache::AppCacheInfoVector> InfoByOrigin;
122 InfoByOrigin& origin_map = info_collection_->infos_by_origin;
123 appcache::AppCacheInfoVector& appcache_infos_ =
124 origin_map[manifest_url.GetOrigin()];
125
126 for (appcache::AppCacheInfoVector::iterator
127 appcache = appcache_infos_.begin(); appcache != appcache_infos_.end();
128 ++appcache) {
129 if (appcache->manifest_url == manifest_url)
130 return;
131 }
132
133 appcache::AppCacheInfo info;
134 info.manifest_url = manifest_url;
135 appcache_infos_.push_back(info);
136 }
137
Reset()138 void CannedBrowsingDataAppCacheHelper::Reset() {
139 info_collection_->infos_by_origin.clear();
140 }
141
empty() const142 bool CannedBrowsingDataAppCacheHelper::empty() const {
143 return info_collection_->infos_by_origin.empty();
144 }
145
StartFetching(Callback0::Type * completion_callback)146 void CannedBrowsingDataAppCacheHelper::StartFetching(
147 Callback0::Type* completion_callback) {
148 completion_callback->Run();
149 delete completion_callback;
150 }
151
~CannedBrowsingDataAppCacheHelper()152 CannedBrowsingDataAppCacheHelper::~CannedBrowsingDataAppCacheHelper() {}
153