Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(272)

Side by Side Diff: chrome/browser/browsing_data_remover.cc

Issue 9379008: Add origin-based deletion to BrowsingDataRemover (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Peter's feedback. Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/browsing_data_remover.h" 5 #include "chrome/browser/browsing_data_remover.h"
6 6
7 #include <map> 7 #include <map>
8 #include <set> 8 #include <set>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 cache_(NULL), 96 cache_(NULL),
97 main_context_getter_(profile->GetRequestContext()), 97 main_context_getter_(profile->GetRequestContext()),
98 media_context_getter_(profile->GetRequestContextForMedia()), 98 media_context_getter_(profile->GetRequestContextForMedia()),
99 waiting_for_clear_cache_(false), 99 waiting_for_clear_cache_(false),
100 waiting_for_clear_cookies_(false), 100 waiting_for_clear_cookies_(false),
101 waiting_for_clear_history_(false), 101 waiting_for_clear_history_(false),
102 waiting_for_clear_networking_history_(false), 102 waiting_for_clear_networking_history_(false),
103 waiting_for_clear_origin_bound_certs_(false), 103 waiting_for_clear_origin_bound_certs_(false),
104 waiting_for_clear_plugin_data_(false), 104 waiting_for_clear_plugin_data_(false),
105 waiting_for_clear_quota_managed_data_(false), 105 waiting_for_clear_quota_managed_data_(false),
106 remove_mask_(0) { 106 remove_mask_(0),
107 remove_origin_(GURL()),
108 remove_protected_(false) {
107 DCHECK(profile); 109 DCHECK(profile);
108 } 110 }
109 111
110 BrowsingDataRemover::BrowsingDataRemover(Profile* profile, 112 BrowsingDataRemover::BrowsingDataRemover(Profile* profile,
111 TimePeriod time_period, 113 TimePeriod time_period,
112 base::Time delete_end) 114 base::Time delete_end)
113 : profile_(profile), 115 : profile_(profile),
114 quota_manager_(NULL), 116 quota_manager_(NULL),
115 special_storage_policy_(profile->GetExtensionSpecialStoragePolicy()), 117 special_storage_policy_(profile->GetExtensionSpecialStoragePolicy()),
116 delete_begin_(CalculateBeginDeleteTime(time_period)), 118 delete_begin_(CalculateBeginDeleteTime(time_period)),
117 delete_end_(delete_end), 119 delete_end_(delete_end),
118 next_cache_state_(STATE_NONE), 120 next_cache_state_(STATE_NONE),
119 cache_(NULL), 121 cache_(NULL),
120 main_context_getter_(profile->GetRequestContext()), 122 main_context_getter_(profile->GetRequestContext()),
121 media_context_getter_(profile->GetRequestContextForMedia()), 123 media_context_getter_(profile->GetRequestContextForMedia()),
122 waiting_for_clear_cache_(false), 124 waiting_for_clear_cache_(false),
123 waiting_for_clear_cookies_(false), 125 waiting_for_clear_cookies_(false),
124 waiting_for_clear_history_(false), 126 waiting_for_clear_history_(false),
125 waiting_for_clear_networking_history_(false), 127 waiting_for_clear_networking_history_(false),
126 waiting_for_clear_origin_bound_certs_(false), 128 waiting_for_clear_origin_bound_certs_(false),
127 waiting_for_clear_plugin_data_(false), 129 waiting_for_clear_plugin_data_(false),
128 waiting_for_clear_quota_managed_data_(false), 130 waiting_for_clear_quota_managed_data_(false),
129 remove_mask_(0) { 131 remove_mask_(0),
132 remove_origin_(GURL()),
133 remove_protected_(false) {
130 DCHECK(profile); 134 DCHECK(profile);
131 } 135 }
132 136
133 BrowsingDataRemover::~BrowsingDataRemover() { 137 BrowsingDataRemover::~BrowsingDataRemover() {
134 DCHECK(all_done()); 138 DCHECK(all_done());
135 } 139 }
136 140
137 // Static. 141 // Static.
138 void BrowsingDataRemover::set_removing(bool removing) { 142 void BrowsingDataRemover::set_removing(bool removing) {
139 DCHECK(removing_ != removing); 143 DCHECK(removing_ != removing);
140 removing_ = removing; 144 removing_ = removing;
141 } 145 }
142 146
143 // Static. 147 // Static.
144 int BrowsingDataRemover::GenerateQuotaClientMask(int remove_mask) { 148 int BrowsingDataRemover::GenerateQuotaClientMask(int remove_mask) {
145 int quota_client_mask = 0; 149 int quota_client_mask = 0;
146 if (remove_mask & BrowsingDataRemover::REMOVE_FILE_SYSTEMS) 150 if (remove_mask & BrowsingDataRemover::REMOVE_FILE_SYSTEMS)
147 quota_client_mask |= quota::QuotaClient::kFileSystem; 151 quota_client_mask |= quota::QuotaClient::kFileSystem;
148 if (remove_mask & BrowsingDataRemover::REMOVE_WEBSQL) 152 if (remove_mask & BrowsingDataRemover::REMOVE_WEBSQL)
149 quota_client_mask |= quota::QuotaClient::kDatabase; 153 quota_client_mask |= quota::QuotaClient::kDatabase;
150 if (remove_mask & BrowsingDataRemover::REMOVE_APPCACHE) 154 if (remove_mask & BrowsingDataRemover::REMOVE_APPCACHE)
151 quota_client_mask |= quota::QuotaClient::kAppcache; 155 quota_client_mask |= quota::QuotaClient::kAppcache;
152 if (remove_mask & BrowsingDataRemover::REMOVE_INDEXEDDB) 156 if (remove_mask & BrowsingDataRemover::REMOVE_INDEXEDDB)
153 quota_client_mask |= quota::QuotaClient::kIndexedDatabase; 157 quota_client_mask |= quota::QuotaClient::kIndexedDatabase;
154 158
155 return quota_client_mask; 159 return quota_client_mask;
156 } 160 }
157 161
158 void BrowsingDataRemover::Remove(int remove_mask) { 162 void BrowsingDataRemover::Remove(int remove_mask) {
163 RemoveImpl(remove_mask, GURL(), false);
164 }
165
166 void BrowsingDataRemover::RemoveImpl(int remove_mask,
167 const GURL& origin,
168 bool remove_protected_origins) {
159 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 169 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
160 set_removing(true); 170 set_removing(true);
161 remove_mask_ = remove_mask; 171 remove_mask_ = remove_mask;
172 remove_origin_ = origin;
173 remove_protected_ = remove_protected_origins;
162 174
163 if (remove_mask & REMOVE_HISTORY) { 175 if (remove_mask & REMOVE_HISTORY) {
164 HistoryService* history_service = 176 HistoryService* history_service =
165 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); 177 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
166 if (history_service) { 178 if (history_service) {
167 std::set<GURL> restrict_urls; 179 std::set<GURL> restrict_urls;
180 if (!remove_origin_.is_empty())
181 restrict_urls.insert(remove_origin_);
168 content::RecordAction(UserMetricsAction("ClearBrowsingData_History")); 182 content::RecordAction(UserMetricsAction("ClearBrowsingData_History"));
169 waiting_for_clear_history_ = true; 183 waiting_for_clear_history_ = true;
170 history_service->ExpireHistoryBetween(restrict_urls, 184 history_service->ExpireHistoryBetween(restrict_urls,
171 delete_begin_, delete_end_, 185 delete_begin_, delete_end_,
172 &request_consumer_, 186 &request_consumer_,
173 base::Bind(&BrowsingDataRemover::OnHistoryDeletionDone, 187 base::Bind(&BrowsingDataRemover::OnHistoryDeletionDone,
174 base::Unretained(this))); 188 base::Unretained(this)));
175 } 189 }
176 190
177 // Need to clear the host cache and accumulated speculative data, as it also 191 // Need to clear the host cache and accumulated speculative data, as it also
178 // reveals some history. 192 // reveals some history: we have no mechanism to track when these items were
193 // created, so we'll clear them all. Better safe than sorry.
179 if (g_browser_process->io_thread()) { 194 if (g_browser_process->io_thread()) {
180 waiting_for_clear_networking_history_ = true; 195 waiting_for_clear_networking_history_ = true;
181 BrowserThread::PostTask( 196 BrowserThread::PostTask(
182 BrowserThread::IO, FROM_HERE, 197 BrowserThread::IO, FROM_HERE,
183 base::Bind(&BrowsingDataRemover::ClearNetworkingHistory, 198 base::Bind(&BrowsingDataRemover::ClearNetworkingHistory,
184 base::Unretained(this), g_browser_process->io_thread())); 199 base::Unretained(this), g_browser_process->io_thread()));
185 } 200 }
186 201
187 // As part of history deletion we also delete the auto-generated keywords. 202 // As part of history deletion we also delete the auto-generated keywords.
188 TemplateURLService* keywords_model = 203 TemplateURLService* keywords_model =
189 TemplateURLServiceFactory::GetForProfile(profile_); 204 TemplateURLServiceFactory::GetForProfile(profile_);
190 if (keywords_model && !keywords_model->loaded()) { 205 if (keywords_model && !keywords_model->loaded()) {
191 registrar_.Add(this, chrome::NOTIFICATION_TEMPLATE_URL_SERVICE_LOADED, 206 registrar_.Add(this, chrome::NOTIFICATION_TEMPLATE_URL_SERVICE_LOADED,
192 content::Source<TemplateURLService>(keywords_model)); 207 content::Source<TemplateURLService>(keywords_model));
193 keywords_model->Load(); 208 keywords_model->Load();
194 } else if (keywords_model) { 209 } else if (keywords_model) {
195 keywords_model->RemoveAutoGeneratedBetween(delete_begin_, delete_end_); 210 keywords_model->RemoveAutoGeneratedForOriginBetween(remove_origin_,
211 delete_begin_, delete_end_);
196 } 212 }
197 213
198 // We also delete the list of recently closed tabs. Since these expire,
199 // they can't be more than a day old, so we can simply clear them all.
200 TabRestoreService* tab_service =
201 TabRestoreServiceFactory::GetForProfile(profile_);
202 if (tab_service) {
203 tab_service->ClearEntries();
204 tab_service->DeleteLastSession();
205 }
206
207 // We also delete the last session when we delete the history.
208 SessionService* session_service =
209 SessionServiceFactory::GetForProfile(profile_);
210 if (session_service)
211 session_service->DeleteLastSession();
212
213 // The PrerenderManager keeps history of prerendered pages, so clear that. 214 // The PrerenderManager keeps history of prerendered pages, so clear that.
214 // It also may have a prerendered page. If so, the page could be considered 215 // It also may have a prerendered page. If so, the page could be
215 // to have a small amount of historical information, so delete it, too. 216 // considered to have a small amount of historical information, so delete
217 // it, too.
216 prerender::PrerenderManager* prerender_manager = 218 prerender::PrerenderManager* prerender_manager =
217 prerender::PrerenderManagerFactory::GetForProfile(profile_); 219 prerender::PrerenderManagerFactory::GetForProfile(profile_);
218 if (prerender_manager) { 220 if (prerender_manager) {
219 prerender_manager->ClearData( 221 prerender_manager->ClearData(
220 prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS | 222 prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS |
221 prerender::PrerenderManager::CLEAR_PRERENDER_HISTORY); 223 prerender::PrerenderManager::CLEAR_PRERENDER_HISTORY);
222 } 224 }
225
226 // If the caller is removing history for all hosts, then clear ancillary
227 // historical information.
228 if (remove_origin_.is_empty()) {
229 // We also delete the list of recently closed tabs. Since these expire,
230 // they can't be more than a day old, so we can simply clear them all.
231 TabRestoreService* tab_service =
232 TabRestoreServiceFactory::GetForProfile(profile_);
233 if (tab_service) {
234 tab_service->ClearEntries();
235 tab_service->DeleteLastSession();
236 }
237
238 // We also delete the last session when we delete the history.
239 SessionService* session_service =
240 SessionServiceFactory::GetForProfile(profile_);
241 if (session_service)
242 session_service->DeleteLastSession();
243 }
223 } 244 }
224 245
225 if (remove_mask & REMOVE_DOWNLOADS) { 246 if (remove_mask & REMOVE_DOWNLOADS) {
226 content::RecordAction(UserMetricsAction("ClearBrowsingData_Downloads")); 247 content::RecordAction(UserMetricsAction("ClearBrowsingData_Downloads"));
227 DownloadManager* download_manager = 248 DownloadManager* download_manager =
228 DownloadServiceFactory::GetForProfile(profile_)->GetDownloadManager(); 249 DownloadServiceFactory::GetForProfile(profile_)->GetDownloadManager();
229 download_manager->RemoveDownloadsBetween(delete_begin_, delete_end_); 250 download_manager->RemoveDownloadsBetween(delete_begin_, delete_end_);
230 download_manager->ClearLastDownloadPath(); 251 download_manager->ClearLastDownloadPath();
231 } 252 }
232 253
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
658 BrowserThread::UI, FROM_HERE, 679 BrowserThread::UI, FROM_HERE,
659 base::Bind(&BrowsingDataRemover::OnClearedOriginBoundCerts, 680 base::Bind(&BrowsingDataRemover::OnClearedOriginBoundCerts,
660 base::Unretained(this))); 681 base::Unretained(this)));
661 } 682 }
662 683
663 void BrowsingDataRemover::OnClearedOriginBoundCerts() { 684 void BrowsingDataRemover::OnClearedOriginBoundCerts() {
664 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 685 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
665 waiting_for_clear_origin_bound_certs_ = false; 686 waiting_for_clear_origin_bound_certs_ = false;
666 NotifyAndDeleteIfDone(); 687 NotifyAndDeleteIfDone();
667 } 688 }
OLDNEW
« no previous file with comments | « chrome/browser/browsing_data_remover.h ('k') | chrome/browser/browsing_data_remover_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698