OLD | NEW |
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/browsing_data_remover.h" | 5 #include "chrome/browser/browsing_data/browsing_data_remover.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <set> | 8 #include <set> |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 #include "content/public/browser/storage_partition.h" | 60 #include "content/public/browser/storage_partition.h" |
61 #include "content/public/browser/user_metrics.h" | 61 #include "content/public/browser/user_metrics.h" |
62 #include "net/base/net_errors.h" | 62 #include "net/base/net_errors.h" |
63 #include "net/cookies/cookie_store.h" | 63 #include "net/cookies/cookie_store.h" |
64 #include "net/http/transport_security_state.h" | 64 #include "net/http/transport_security_state.h" |
65 #include "net/ssl/channel_id_service.h" | 65 #include "net/ssl/channel_id_service.h" |
66 #include "net/ssl/channel_id_store.h" | 66 #include "net/ssl/channel_id_store.h" |
67 #include "net/url_request/url_request_context.h" | 67 #include "net/url_request/url_request_context.h" |
68 #include "net/url_request/url_request_context_getter.h" | 68 #include "net/url_request/url_request_context_getter.h" |
69 #include "storage/browser/quota/special_storage_policy.h" | 69 #include "storage/browser/quota/special_storage_policy.h" |
| 70 #include "url/origin.h" |
70 | 71 |
71 #if defined(OS_ANDROID) | 72 #if defined(OS_ANDROID) |
72 #include "chrome/browser/precache/precache_manager_factory.h" | 73 #include "chrome/browser/precache/precache_manager_factory.h" |
73 #include "components/precache/content/precache_manager.h" | 74 #include "components/precache/content/precache_manager.h" |
74 #endif | 75 #endif |
75 | 76 |
76 #if defined(OS_CHROMEOS) | 77 #if defined(OS_CHROMEOS) |
77 #include "chrome/browser/chromeos/profiles/profile_helper.h" | 78 #include "chrome/browser/chromeos/profiles/profile_helper.h" |
78 #include "chromeos/attestation/attestation_constants.h" | 79 #include "chromeos/attestation/attestation_constants.h" |
79 #include "chromeos/dbus/cryptohome_client.h" | 80 #include "chromeos/dbus/cryptohome_client.h" |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 waiting_for_clear_plugin_data_(false), | 226 waiting_for_clear_plugin_data_(false), |
226 waiting_for_clear_pnacl_cache_(false), | 227 waiting_for_clear_pnacl_cache_(false), |
227 #if defined(OS_ANDROID) | 228 #if defined(OS_ANDROID) |
228 waiting_for_clear_precache_history_(false), | 229 waiting_for_clear_precache_history_(false), |
229 #endif | 230 #endif |
230 waiting_for_clear_storage_partition_data_(false), | 231 waiting_for_clear_storage_partition_data_(false), |
231 #if defined(ENABLE_WEBRTC) | 232 #if defined(ENABLE_WEBRTC) |
232 waiting_for_clear_webrtc_logs_(false), | 233 waiting_for_clear_webrtc_logs_(false), |
233 #endif | 234 #endif |
234 remove_mask_(0), | 235 remove_mask_(0), |
235 remove_origin_(GURL()), | |
236 origin_type_mask_(0), | 236 origin_type_mask_(0), |
237 storage_partition_for_testing_(NULL) { | 237 storage_partition_for_testing_(NULL) { |
238 DCHECK(profile); | 238 DCHECK(profile); |
239 // crbug.com/140910: Many places were calling this with base::Time() as | 239 // crbug.com/140910: Many places were calling this with base::Time() as |
240 // delete_end, even though they should've used base::Time::Max(). Work around | 240 // delete_end, even though they should've used base::Time::Max(). Work around |
241 // it here. New code should use base::Time::Max(). | 241 // it here. New code should use base::Time::Max(). |
242 DCHECK(delete_end_ != base::Time()); | 242 DCHECK(delete_end_ != base::Time()); |
243 if (delete_end_ == base::Time()) | 243 if (delete_end_ == base::Time()) |
244 delete_end_ = base::Time::Max(); | 244 delete_end_ = base::Time::Max(); |
245 } | 245 } |
246 | 246 |
247 BrowsingDataRemover::~BrowsingDataRemover() { | 247 BrowsingDataRemover::~BrowsingDataRemover() { |
248 DCHECK(AllDone()); | 248 DCHECK(AllDone()); |
249 } | 249 } |
250 | 250 |
251 // Static. | 251 // Static. |
252 void BrowsingDataRemover::set_removing(bool is_removing) { | 252 void BrowsingDataRemover::set_removing(bool is_removing) { |
253 DCHECK(is_removing_ != is_removing); | 253 DCHECK(is_removing_ != is_removing); |
254 is_removing_ = is_removing; | 254 is_removing_ = is_removing; |
255 } | 255 } |
256 | 256 |
257 void BrowsingDataRemover::Remove(int remove_mask, int origin_type_mask) { | 257 void BrowsingDataRemover::Remove(int remove_mask, int origin_type_mask) { |
258 RemoveImpl(remove_mask, GURL(), origin_type_mask); | 258 RemoveImpl(remove_mask, GURL(), origin_type_mask); |
259 } | 259 } |
260 | 260 |
261 void BrowsingDataRemover::RemoveImpl(int remove_mask, | 261 void BrowsingDataRemover::RemoveImpl(int remove_mask, |
262 const GURL& origin, | 262 const GURL& remove_url, |
263 int origin_type_mask) { | 263 int origin_type_mask) { |
264 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 264 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
265 set_removing(true); | 265 set_removing(true); |
266 remove_mask_ = remove_mask; | 266 remove_mask_ = remove_mask; |
267 remove_origin_ = origin; | |
268 origin_type_mask_ = origin_type_mask; | 267 origin_type_mask_ = origin_type_mask; |
| 268 url::Origin remove_origin(remove_url); |
269 | 269 |
270 PrefService* prefs = profile_->GetPrefs(); | 270 PrefService* prefs = profile_->GetPrefs(); |
271 bool may_delete_history = prefs->GetBoolean( | 271 bool may_delete_history = prefs->GetBoolean( |
272 prefs::kAllowDeletingBrowserHistory); | 272 prefs::kAllowDeletingBrowserHistory); |
273 | 273 |
274 // All the UI entry points into the BrowsingDataRemover should be disabled, | 274 // All the UI entry points into the BrowsingDataRemover should be disabled, |
275 // but this will fire if something was missed or added. | 275 // but this will fire if something was missed or added. |
276 DCHECK(may_delete_history || (remove_mask & REMOVE_NOCHECKS) || | 276 DCHECK(may_delete_history || (remove_mask & REMOVE_NOCHECKS) || |
277 (!(remove_mask & REMOVE_HISTORY) && !(remove_mask & REMOVE_DOWNLOADS))); | 277 (!(remove_mask & REMOVE_HISTORY) && !(remove_mask & REMOVE_DOWNLOADS))); |
278 | 278 |
(...skipping 16 matching lines...) Expand all Loading... |
295 BrowsingDataHelper::PROTECTED_WEB | | 295 BrowsingDataHelper::PROTECTED_WEB | |
296 BrowsingDataHelper::EXTENSION), | 296 BrowsingDataHelper::EXTENSION), |
297 "OriginTypeMask has been updated without updating user metrics"); | 297 "OriginTypeMask has been updated without updating user metrics"); |
298 | 298 |
299 if ((remove_mask & REMOVE_HISTORY) && may_delete_history) { | 299 if ((remove_mask & REMOVE_HISTORY) && may_delete_history) { |
300 history::HistoryService* history_service = | 300 history::HistoryService* history_service = |
301 HistoryServiceFactory::GetForProfile( | 301 HistoryServiceFactory::GetForProfile( |
302 profile_, ServiceAccessType::EXPLICIT_ACCESS); | 302 profile_, ServiceAccessType::EXPLICIT_ACCESS); |
303 if (history_service) { | 303 if (history_service) { |
304 std::set<GURL> restrict_urls; | 304 std::set<GURL> restrict_urls; |
305 if (!remove_origin_.is_empty()) | 305 if (!remove_url.is_empty()) |
306 restrict_urls.insert(remove_origin_); | 306 restrict_urls.insert(remove_url); |
307 content::RecordAction(UserMetricsAction("ClearBrowsingData_History")); | 307 content::RecordAction(UserMetricsAction("ClearBrowsingData_History")); |
308 waiting_for_clear_history_ = true; | 308 waiting_for_clear_history_ = true; |
309 | 309 |
310 history_service->ExpireLocalAndRemoteHistoryBetween( | 310 history_service->ExpireLocalAndRemoteHistoryBetween( |
311 WebHistoryServiceFactory::GetForProfile(profile_), | 311 WebHistoryServiceFactory::GetForProfile(profile_), |
312 restrict_urls, delete_begin_, delete_end_, | 312 restrict_urls, delete_begin_, delete_end_, |
313 base::Bind(&BrowsingDataRemover::OnHistoryDeletionDone, | 313 base::Bind(&BrowsingDataRemover::OnHistoryDeletionDone, |
314 base::Unretained(this)), | 314 base::Unretained(this)), |
315 &history_task_tracker_); | 315 &history_task_tracker_); |
316 | 316 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 // As part of history deletion we also delete the auto-generated keywords. | 360 // As part of history deletion we also delete the auto-generated keywords. |
361 TemplateURLService* keywords_model = | 361 TemplateURLService* keywords_model = |
362 TemplateURLServiceFactory::GetForProfile(profile_); | 362 TemplateURLServiceFactory::GetForProfile(profile_); |
363 if (keywords_model && !keywords_model->loaded()) { | 363 if (keywords_model && !keywords_model->loaded()) { |
364 template_url_sub_ = keywords_model->RegisterOnLoadedCallback( | 364 template_url_sub_ = keywords_model->RegisterOnLoadedCallback( |
365 base::Bind(&BrowsingDataRemover::OnKeywordsLoaded, | 365 base::Bind(&BrowsingDataRemover::OnKeywordsLoaded, |
366 base::Unretained(this))); | 366 base::Unretained(this))); |
367 keywords_model->Load(); | 367 keywords_model->Load(); |
368 waiting_for_clear_keyword_data_ = true; | 368 waiting_for_clear_keyword_data_ = true; |
369 } else if (keywords_model) { | 369 } else if (keywords_model) { |
370 keywords_model->RemoveAutoGeneratedForOriginBetween(remove_origin_, | 370 keywords_model->RemoveAutoGeneratedForOriginBetween( |
371 delete_begin_, delete_end_); | 371 remove_url, delete_begin_, delete_end_); |
372 } | 372 } |
373 | 373 |
374 // The PrerenderManager keeps history of prerendered pages, so clear that. | 374 // The PrerenderManager keeps history of prerendered pages, so clear that. |
375 // It also may have a prerendered page. If so, the page could be | 375 // It also may have a prerendered page. If so, the page could be |
376 // considered to have a small amount of historical information, so delete | 376 // considered to have a small amount of historical information, so delete |
377 // it, too. | 377 // it, too. |
378 prerender::PrerenderManager* prerender_manager = | 378 prerender::PrerenderManager* prerender_manager = |
379 prerender::PrerenderManagerFactory::GetForProfile(profile_); | 379 prerender::PrerenderManagerFactory::GetForProfile(profile_); |
380 if (prerender_manager) { | 380 if (prerender_manager) { |
381 prerender_manager->ClearData( | 381 prerender_manager->ClearData( |
382 prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS | | 382 prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS | |
383 prerender::PrerenderManager::CLEAR_PRERENDER_HISTORY); | 383 prerender::PrerenderManager::CLEAR_PRERENDER_HISTORY); |
384 } | 384 } |
385 | 385 |
386 // If the caller is removing history for all hosts, then clear ancillary | 386 // If the caller is removing history for all hosts, then clear ancillary |
387 // historical information. | 387 // historical information. |
388 if (remove_origin_.is_empty()) { | 388 if (remove_url.is_empty()) { |
389 // We also delete the list of recently closed tabs. Since these expire, | 389 // We also delete the list of recently closed tabs. Since these expire, |
390 // they can't be more than a day old, so we can simply clear them all. | 390 // they can't be more than a day old, so we can simply clear them all. |
391 TabRestoreService* tab_service = | 391 TabRestoreService* tab_service = |
392 TabRestoreServiceFactory::GetForProfile(profile_); | 392 TabRestoreServiceFactory::GetForProfile(profile_); |
393 if (tab_service) { | 393 if (tab_service) { |
394 tab_service->ClearEntries(); | 394 tab_service->ClearEntries(); |
395 tab_service->DeleteLastSession(); | 395 tab_service->DeleteLastSession(); |
396 } | 396 } |
397 | 397 |
398 #if defined(ENABLE_SESSION_SERVICE) | 398 #if defined(ENABLE_SESSION_SERVICE) |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 base::Bind(&BrowsingDataRemover::OnClearedPrecacheHistory, | 461 base::Bind(&BrowsingDataRemover::OnClearedPrecacheHistory, |
462 base::Unretained(this))); | 462 base::Unretained(this))); |
463 } | 463 } |
464 #endif | 464 #endif |
465 } | 465 } |
466 | 466 |
467 if ((remove_mask & REMOVE_DOWNLOADS) && may_delete_history) { | 467 if ((remove_mask & REMOVE_DOWNLOADS) && may_delete_history) { |
468 content::RecordAction(UserMetricsAction("ClearBrowsingData_Downloads")); | 468 content::RecordAction(UserMetricsAction("ClearBrowsingData_Downloads")); |
469 content::DownloadManager* download_manager = | 469 content::DownloadManager* download_manager = |
470 BrowserContext::GetDownloadManager(profile_); | 470 BrowserContext::GetDownloadManager(profile_); |
471 download_manager->RemoveDownloadsBetween(delete_begin_, delete_end_); | 471 if (remove_origin.unique()) |
| 472 download_manager->RemoveDownloadsBetween(delete_begin_, delete_end_); |
| 473 else |
| 474 download_manager->RemoveDownloadsByOriginAndTime( |
| 475 remove_origin, delete_begin_, delete_end_); |
472 DownloadPrefs* download_prefs = DownloadPrefs::FromDownloadManager( | 476 DownloadPrefs* download_prefs = DownloadPrefs::FromDownloadManager( |
473 download_manager); | 477 download_manager); |
474 download_prefs->SetSaveFilePath(download_prefs->DownloadPath()); | 478 download_prefs->SetSaveFilePath(download_prefs->DownloadPath()); |
475 } | 479 } |
476 | 480 |
477 uint32 storage_partition_remove_mask = 0; | 481 uint32 storage_partition_remove_mask = 0; |
478 | 482 |
479 // We ignore the REMOVE_COOKIES request if UNPROTECTED_WEB is not set, | 483 // We ignore the REMOVE_COOKIES request if UNPROTECTED_WEB is not set, |
480 // so that callers who request REMOVE_SITE_DATA with PROTECTED_WEB | 484 // so that callers who request REMOVE_SITE_DATA with PROTECTED_WEB |
481 // don't accidentally remove the cookies that are associated with the | 485 // don't accidentally remove the cookies that are associated with the |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
701 if (delete_begin_ == base::Time() || | 705 if (delete_begin_ == base::Time() || |
702 origin_type_mask_ & | 706 origin_type_mask_ & |
703 (BrowsingDataHelper::PROTECTED_WEB | BrowsingDataHelper::EXTENSION)) { | 707 (BrowsingDataHelper::PROTECTED_WEB | BrowsingDataHelper::EXTENSION)) { |
704 // If we're deleting since the beginning of time, or we're removing | 708 // If we're deleting since the beginning of time, or we're removing |
705 // protected origins, then remove persistent quota data. | 709 // protected origins, then remove persistent quota data. |
706 quota_storage_remove_mask |= | 710 quota_storage_remove_mask |= |
707 content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT; | 711 content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT; |
708 } | 712 } |
709 | 713 |
710 storage_partition->ClearData( | 714 storage_partition->ClearData( |
711 storage_partition_remove_mask, | 715 storage_partition_remove_mask, quota_storage_remove_mask, remove_url, |
712 quota_storage_remove_mask, | 716 base::Bind(&DoesOriginMatchMask, origin_type_mask_), delete_begin_, |
713 remove_origin_, | |
714 base::Bind(&DoesOriginMatchMask, origin_type_mask_), | |
715 delete_begin_, | |
716 delete_end_, | 717 delete_end_, |
717 base::Bind(&BrowsingDataRemover::OnClearedStoragePartitionData, | 718 base::Bind(&BrowsingDataRemover::OnClearedStoragePartitionData, |
718 base::Unretained(this))); | 719 base::Unretained(this))); |
719 } | 720 } |
720 | 721 |
721 #if defined(ENABLE_PLUGINS) | 722 #if defined(ENABLE_PLUGINS) |
722 if (remove_mask & REMOVE_CONTENT_LICENSES) { | 723 if (remove_mask & REMOVE_CONTENT_LICENSES) { |
723 content::RecordAction( | 724 content::RecordAction( |
724 UserMetricsAction("ClearBrowsingData_ContentLicenses")); | 725 UserMetricsAction("ClearBrowsingData_ContentLicenses")); |
725 | 726 |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1146 waiting_for_clear_domain_reliability_monitor_ = false; | 1147 waiting_for_clear_domain_reliability_monitor_ = false; |
1147 NotifyAndDeleteIfDone(); | 1148 NotifyAndDeleteIfDone(); |
1148 } | 1149 } |
1149 | 1150 |
1150 // static | 1151 // static |
1151 BrowsingDataRemover::CallbackSubscription | 1152 BrowsingDataRemover::CallbackSubscription |
1152 BrowsingDataRemover::RegisterOnBrowsingDataRemovedCallback( | 1153 BrowsingDataRemover::RegisterOnBrowsingDataRemovedCallback( |
1153 const BrowsingDataRemover::Callback& callback) { | 1154 const BrowsingDataRemover::Callback& callback) { |
1154 return GetOnBrowsingDataRemovedCallbacks()->Add(callback); | 1155 return GetOnBrowsingDataRemovedCallbacks()->Add(callback); |
1155 } | 1156 } |
OLD | NEW |