| 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_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 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 media_context_getter_(profile->GetRequestContextForMedia()), | 104 media_context_getter_(profile->GetRequestContextForMedia()), |
| 105 waiting_for_clear_cache_(false), | 105 waiting_for_clear_cache_(false), |
| 106 waiting_for_clear_cookies_count_(0), | 106 waiting_for_clear_cookies_count_(0), |
| 107 waiting_for_clear_history_(false), | 107 waiting_for_clear_history_(false), |
| 108 waiting_for_clear_networking_history_(false), | 108 waiting_for_clear_networking_history_(false), |
| 109 waiting_for_clear_server_bound_certs_(false), | 109 waiting_for_clear_server_bound_certs_(false), |
| 110 waiting_for_clear_plugin_data_(false), | 110 waiting_for_clear_plugin_data_(false), |
| 111 waiting_for_clear_quota_managed_data_(false), | 111 waiting_for_clear_quota_managed_data_(false), |
| 112 remove_mask_(0), | 112 remove_mask_(0), |
| 113 remove_origin_(GURL()), | 113 remove_origin_(GURL()), |
| 114 remove_protected_(false) { | 114 include_protected_(false) { |
| 115 DCHECK(profile); | 115 DCHECK(profile); |
| 116 } | 116 } |
| 117 | 117 |
| 118 BrowsingDataRemover::BrowsingDataRemover(Profile* profile, | 118 BrowsingDataRemover::BrowsingDataRemover(Profile* profile, |
| 119 TimePeriod time_period, | 119 TimePeriod time_period, |
| 120 base::Time delete_end) | 120 base::Time delete_end) |
| 121 : profile_(profile), | 121 : profile_(profile), |
| 122 quota_manager_(NULL), | 122 quota_manager_(NULL), |
| 123 special_storage_policy_(profile->GetExtensionSpecialStoragePolicy()), | 123 special_storage_policy_(profile->GetExtensionSpecialStoragePolicy()), |
| 124 delete_begin_(CalculateBeginDeleteTime(time_period)), | 124 delete_begin_(CalculateBeginDeleteTime(time_period)), |
| 125 delete_end_(delete_end), | 125 delete_end_(delete_end), |
| 126 next_cache_state_(STATE_NONE), | 126 next_cache_state_(STATE_NONE), |
| 127 cache_(NULL), | 127 cache_(NULL), |
| 128 main_context_getter_(profile->GetRequestContext()), | 128 main_context_getter_(profile->GetRequestContext()), |
| 129 media_context_getter_(profile->GetRequestContextForMedia()), | 129 media_context_getter_(profile->GetRequestContextForMedia()), |
| 130 waiting_for_clear_cache_(false), | 130 waiting_for_clear_cache_(false), |
| 131 waiting_for_clear_cookies_count_(0), | 131 waiting_for_clear_cookies_count_(0), |
| 132 waiting_for_clear_history_(false), | 132 waiting_for_clear_history_(false), |
| 133 waiting_for_clear_networking_history_(false), | 133 waiting_for_clear_networking_history_(false), |
| 134 waiting_for_clear_server_bound_certs_(false), | 134 waiting_for_clear_server_bound_certs_(false), |
| 135 waiting_for_clear_plugin_data_(false), | 135 waiting_for_clear_plugin_data_(false), |
| 136 waiting_for_clear_quota_managed_data_(false), | 136 waiting_for_clear_quota_managed_data_(false), |
| 137 remove_mask_(0), | 137 remove_mask_(0), |
| 138 remove_origin_(GURL()), | 138 remove_origin_(GURL()), |
| 139 remove_protected_(false) { | 139 include_protected_(false) { |
| 140 DCHECK(profile); | 140 DCHECK(profile); |
| 141 } | 141 } |
| 142 | 142 |
| 143 BrowsingDataRemover::~BrowsingDataRemover() { | 143 BrowsingDataRemover::~BrowsingDataRemover() { |
| 144 DCHECK(all_done()); | 144 DCHECK(all_done()); |
| 145 } | 145 } |
| 146 | 146 |
| 147 // Static. | 147 // Static. |
| 148 void BrowsingDataRemover::set_removing(bool removing) { | 148 void BrowsingDataRemover::set_removing(bool removing) { |
| 149 DCHECK(removing_ != removing); | 149 DCHECK(removing_ != removing); |
| 150 removing_ = removing; | 150 removing_ = removing; |
| 151 } | 151 } |
| 152 | 152 |
| 153 // Static. | 153 // Static. |
| 154 int BrowsingDataRemover::GenerateQuotaClientMask(int remove_mask) { | 154 int BrowsingDataRemover::GenerateQuotaClientMask(int remove_mask) { |
| 155 int quota_client_mask = 0; | 155 int quota_client_mask = 0; |
| 156 if (remove_mask & BrowsingDataRemover::REMOVE_FILE_SYSTEMS) | 156 if (remove_mask & BrowsingDataRemover::REMOVE_FILE_SYSTEMS) |
| 157 quota_client_mask |= quota::QuotaClient::kFileSystem; | 157 quota_client_mask |= quota::QuotaClient::kFileSystem; |
| 158 if (remove_mask & BrowsingDataRemover::REMOVE_WEBSQL) | 158 if (remove_mask & BrowsingDataRemover::REMOVE_WEBSQL) |
| 159 quota_client_mask |= quota::QuotaClient::kDatabase; | 159 quota_client_mask |= quota::QuotaClient::kDatabase; |
| 160 if (remove_mask & BrowsingDataRemover::REMOVE_APPCACHE) | 160 if (remove_mask & BrowsingDataRemover::REMOVE_APPCACHE) |
| 161 quota_client_mask |= quota::QuotaClient::kAppcache; | 161 quota_client_mask |= quota::QuotaClient::kAppcache; |
| 162 if (remove_mask & BrowsingDataRemover::REMOVE_INDEXEDDB) | 162 if (remove_mask & BrowsingDataRemover::REMOVE_INDEXEDDB) |
| 163 quota_client_mask |= quota::QuotaClient::kIndexedDatabase; | 163 quota_client_mask |= quota::QuotaClient::kIndexedDatabase; |
| 164 | 164 |
| 165 return quota_client_mask; | 165 return quota_client_mask; |
| 166 } | 166 } |
| 167 | 167 |
| 168 void BrowsingDataRemover::Remove(int remove_mask) { | 168 void BrowsingDataRemover::Remove(int remove_mask, |
| 169 RemoveImpl(remove_mask, GURL(), false); | 169 bool include_protected_origins) { |
| 170 RemoveImpl(remove_mask, GURL(), include_protected_origins); |
| 170 } | 171 } |
| 171 | 172 |
| 172 void BrowsingDataRemover::RemoveImpl(int remove_mask, | 173 void BrowsingDataRemover::RemoveImpl(int remove_mask, |
| 173 const GURL& origin, | 174 const GURL& origin, |
| 174 bool remove_protected_origins) { | 175 bool include_protected_origins) { |
| 175 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 176 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 176 set_removing(true); | 177 set_removing(true); |
| 177 remove_mask_ = remove_mask; | 178 remove_mask_ = remove_mask; |
| 178 remove_origin_ = origin; | 179 remove_origin_ = origin; |
| 179 remove_protected_ = remove_protected_origins; | 180 include_protected_ = include_protected_origins; |
| 180 | 181 |
| 181 if (remove_mask & REMOVE_HISTORY) { | 182 if (remove_mask & REMOVE_HISTORY) { |
| 182 HistoryService* history_service = | 183 HistoryService* history_service = |
| 183 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); | 184 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); |
| 184 if (history_service) { | 185 if (history_service) { |
| 185 std::set<GURL> restrict_urls; | 186 std::set<GURL> restrict_urls; |
| 186 if (!remove_origin_.is_empty()) | 187 if (!remove_origin_.is_empty()) |
| 187 restrict_urls.insert(remove_origin_); | 188 restrict_urls.insert(remove_origin_); |
| 188 content::RecordAction(UserMetricsAction("ClearBrowsingData_History")); | 189 content::RecordAction(UserMetricsAction("ClearBrowsingData_History")); |
| 189 waiting_for_clear_history_ = true; | 190 waiting_for_clear_history_ = true; |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 waiting_for_clear_server_bound_certs_ = true; | 302 waiting_for_clear_server_bound_certs_ = true; |
| 302 BrowserThread::PostTask( | 303 BrowserThread::PostTask( |
| 303 BrowserThread::IO, FROM_HERE, | 304 BrowserThread::IO, FROM_HERE, |
| 304 base::Bind(&BrowsingDataRemover::ClearServerBoundCertsOnIOThread, | 305 base::Bind(&BrowsingDataRemover::ClearServerBoundCertsOnIOThread, |
| 305 base::Unretained(this), base::Unretained(rq_context))); | 306 base::Unretained(this), base::Unretained(rq_context))); |
| 306 } | 307 } |
| 307 } | 308 } |
| 308 | 309 |
| 309 if (remove_mask & REMOVE_LOCAL_STORAGE) { | 310 if (remove_mask & REMOVE_LOCAL_STORAGE) { |
| 310 BrowserContext::GetDOMStorageContext(profile_)->DeleteDataModifiedSince( | 311 BrowserContext::GetDOMStorageContext(profile_)->DeleteDataModifiedSince( |
| 311 delete_begin_); | 312 delete_begin_, include_protected_); |
| 312 } | 313 } |
| 313 | 314 |
| 314 if (remove_mask & REMOVE_INDEXEDDB || remove_mask & REMOVE_WEBSQL || | 315 if (remove_mask & REMOVE_INDEXEDDB || remove_mask & REMOVE_WEBSQL || |
| 315 remove_mask & REMOVE_APPCACHE || remove_mask & REMOVE_FILE_SYSTEMS) { | 316 remove_mask & REMOVE_APPCACHE || remove_mask & REMOVE_FILE_SYSTEMS) { |
| 316 if (!quota_manager_) | 317 if (!quota_manager_) |
| 317 quota_manager_ = content::BrowserContext::GetQuotaManager(profile_); | 318 quota_manager_ = content::BrowserContext::GetQuotaManager(profile_); |
| 318 waiting_for_clear_quota_managed_data_ = true; | 319 waiting_for_clear_quota_managed_data_ = true; |
| 319 BrowserThread::PostTask( | 320 BrowserThread::PostTask( |
| 320 BrowserThread::IO, FROM_HERE, | 321 BrowserThread::IO, FROM_HERE, |
| 321 base::Bind(&BrowsingDataRemover::ClearQuotaManagedDataOnIOThread, | 322 base::Bind(&BrowsingDataRemover::ClearQuotaManagedDataOnIOThread, |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 581 | 582 |
| 582 void BrowsingDataRemover::ClearQuotaManagedDataOnIOThread() { | 583 void BrowsingDataRemover::ClearQuotaManagedDataOnIOThread() { |
| 583 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 584 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 584 | 585 |
| 585 // Ask the QuotaManager for all origins with temporary quota modified within | 586 // Ask the QuotaManager for all origins with temporary quota modified within |
| 586 // the user-specified timeframe, and deal with the resulting set in | 587 // the user-specified timeframe, and deal with the resulting set in |
| 587 // OnGotQuotaManagedOrigins(). | 588 // OnGotQuotaManagedOrigins(). |
| 588 quota_managed_origins_to_delete_count_ = 0; | 589 quota_managed_origins_to_delete_count_ = 0; |
| 589 quota_managed_storage_types_to_delete_count_ = 2; | 590 quota_managed_storage_types_to_delete_count_ = 2; |
| 590 | 591 |
| 591 if (delete_begin_ == base::Time()) { | 592 if (delete_begin_ == base::Time() || include_protected_) { |
| 592 // If we're deleting since the beginning of time, ask the QuotaManager for | 593 // If we're deleting since the beginning of time, or we're removing |
| 593 // all origins with persistent quota modified within the user-specified | 594 // protected origins, then ask the QuotaManager for all origins with |
| 594 // timeframe, and deal with the resulting set in | 595 // persistent quota modified within the user-specified timeframe, and deal |
| 595 // OnGotPersistentQuotaManagedOrigins. | 596 // with the resulting set in OnGotPersistentQuotaManagedOrigins. |
| 596 quota_manager_->GetOriginsModifiedSince( | 597 quota_manager_->GetOriginsModifiedSince( |
| 597 quota::kStorageTypePersistent, delete_begin_, | 598 quota::kStorageTypePersistent, delete_begin_, |
| 598 base::Bind(&BrowsingDataRemover::OnGotQuotaManagedOrigins, | 599 base::Bind(&BrowsingDataRemover::OnGotQuotaManagedOrigins, |
| 599 base::Unretained(this))); | 600 base::Unretained(this))); |
| 600 } else { | 601 } else { |
| 601 // Otherwise, we don't need to deal with persistent storage. | 602 // Otherwise, we don't need to deal with persistent storage. |
| 602 --quota_managed_storage_types_to_delete_count_; | 603 --quota_managed_storage_types_to_delete_count_; |
| 603 } | 604 } |
| 604 | 605 |
| 605 // Do the same for temporary quota, regardless, passing the resulting set into | 606 // Do the same for temporary quota, regardless, passing the resulting set into |
| 606 // OnGotTemporaryQuotaManagedOrigins. | 607 // OnGotTemporaryQuotaManagedOrigins. |
| 607 quota_manager_->GetOriginsModifiedSince( | 608 quota_manager_->GetOriginsModifiedSince( |
| 608 quota::kStorageTypeTemporary, delete_begin_, | 609 quota::kStorageTypeTemporary, delete_begin_, |
| 609 base::Bind(&BrowsingDataRemover::OnGotQuotaManagedOrigins, | 610 base::Bind(&BrowsingDataRemover::OnGotQuotaManagedOrigins, |
| 610 base::Unretained(this))); | 611 base::Unretained(this))); |
| 611 } | 612 } |
| 612 | 613 |
| 613 void BrowsingDataRemover::OnGotQuotaManagedOrigins( | 614 void BrowsingDataRemover::OnGotQuotaManagedOrigins( |
| 614 const std::set<GURL>& origins, quota::StorageType type) { | 615 const std::set<GURL>& origins, quota::StorageType type) { |
| 615 DCHECK_GT(quota_managed_storage_types_to_delete_count_, 0); | 616 DCHECK_GT(quota_managed_storage_types_to_delete_count_, 0); |
| 616 // Walk through the origins passed in, delete quota of |type| from each that | 617 // Walk through the origins passed in, delete quota of |type| from each that |
| 617 // isn't protected. | 618 // isn't protected. |
| 618 std::set<GURL>::const_iterator origin; | 619 std::set<GURL>::const_iterator origin; |
| 619 for (origin = origins.begin(); origin != origins.end(); ++origin) { | 620 for (origin = origins.begin(); origin != origins.end(); ++origin) { |
| 620 if (!BrowsingDataHelper::IsValidScheme(origin->scheme())) | 621 if (!BrowsingDataHelper::IsValidScheme(origin->scheme())) |
| 621 continue; | 622 continue; |
| 622 if (special_storage_policy_->IsStorageProtected(origin->GetOrigin())) | 623 if (!include_protected_ && |
| 624 special_storage_policy_->IsStorageProtected(origin->GetOrigin())) |
| 623 continue; | 625 continue; |
| 624 if (!remove_origin_.is_empty() && remove_origin_ != origin->GetOrigin()) | 626 if (!remove_origin_.is_empty() && remove_origin_ != origin->GetOrigin()) |
| 625 continue; | 627 continue; |
| 626 ++quota_managed_origins_to_delete_count_; | 628 ++quota_managed_origins_to_delete_count_; |
| 627 quota_manager_->DeleteOriginData( | 629 quota_manager_->DeleteOriginData( |
| 628 origin->GetOrigin(), type, | 630 origin->GetOrigin(), type, |
| 629 BrowsingDataRemover::GenerateQuotaClientMask(remove_mask_), | 631 BrowsingDataRemover::GenerateQuotaClientMask(remove_mask_), |
| 630 base::Bind(&BrowsingDataRemover::OnQuotaManagedOriginDeletion, | 632 base::Bind(&BrowsingDataRemover::OnQuotaManagedOriginDeletion, |
| 631 base::Unretained(this))); | 633 base::Unretained(this))); |
| 632 } | 634 } |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 708 BrowserThread::UI, FROM_HERE, | 710 BrowserThread::UI, FROM_HERE, |
| 709 base::Bind(&BrowsingDataRemover::OnClearedServerBoundCerts, | 711 base::Bind(&BrowsingDataRemover::OnClearedServerBoundCerts, |
| 710 base::Unretained(this))); | 712 base::Unretained(this))); |
| 711 } | 713 } |
| 712 | 714 |
| 713 void BrowsingDataRemover::OnClearedServerBoundCerts() { | 715 void BrowsingDataRemover::OnClearedServerBoundCerts() { |
| 714 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 716 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 715 waiting_for_clear_server_bound_certs_ = false; | 717 waiting_for_clear_server_bound_certs_ = false; |
| 716 NotifyAndDeleteIfDone(); | 718 NotifyAndDeleteIfDone(); |
| 717 } | 719 } |
| OLD | NEW |