| 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 |