Chromium Code Reviews| Index: chrome/browser/browsing_data_remover.cc |
| diff --git a/chrome/browser/browsing_data_remover.cc b/chrome/browser/browsing_data_remover.cc |
| index 592cc8066e82dbcd7c32889d5396896f007b0f87..8d86f8e8de08610b69627cf5017f195724d0181e 100644 |
| --- a/chrome/browser/browsing_data_remover.cc |
| +++ b/chrome/browser/browsing_data_remover.cc |
| @@ -61,6 +61,11 @@ |
| #include "net/url_request/url_request_context_getter.h" |
| #include "webkit/quota/quota_manager.h" |
| #include "webkit/quota/quota_types.h" |
| +#include "webkit/quota/special_storage_policy.h" |
| +#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebCString.h" |
|
Bernhard Bauer
2012/05/31 15:57:31
Nit: Alphabetize
Mike West
2012/06/01 13:35:17
Done.
|
| +#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" |
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" |
| +#include "webkit/glue/webkit_glue.h" |
| using content::BrowserContext; |
| using content::BrowserThread; |
| @@ -95,6 +100,7 @@ BrowsingDataRemover::BrowsingDataRemover(Profile* profile, |
| base::Time delete_end) |
| : profile_(profile), |
| quota_manager_(NULL), |
| + dom_storage_context_(NULL), |
| special_storage_policy_(profile->GetExtensionSpecialStoragePolicy()), |
| delete_begin_(delete_begin), |
| delete_end_(delete_end), |
| @@ -106,6 +112,7 @@ BrowsingDataRemover::BrowsingDataRemover(Profile* profile, |
| waiting_for_clear_cache_(false), |
| waiting_for_clear_cookies_count_(0), |
| waiting_for_clear_history_(false), |
| + waiting_for_clear_local_storage_(false), |
| waiting_for_clear_networking_history_(false), |
| waiting_for_clear_server_bound_certs_(false), |
| waiting_for_clear_plugin_data_(false), |
| @@ -113,7 +120,7 @@ BrowsingDataRemover::BrowsingDataRemover(Profile* profile, |
| waiting_for_clear_content_licenses_(false), |
| remove_mask_(0), |
| remove_origin_(GURL()), |
| - remove_protected_(false) { |
| + origin_set_mask_(0) { |
| DCHECK(profile); |
| } |
| @@ -122,6 +129,7 @@ BrowsingDataRemover::BrowsingDataRemover(Profile* profile, |
| base::Time delete_end) |
| : profile_(profile), |
| quota_manager_(NULL), |
| + dom_storage_context_(NULL), |
| special_storage_policy_(profile->GetExtensionSpecialStoragePolicy()), |
| delete_begin_(CalculateBeginDeleteTime(time_period)), |
| delete_end_(delete_end), |
| @@ -133,6 +141,7 @@ BrowsingDataRemover::BrowsingDataRemover(Profile* profile, |
| waiting_for_clear_cache_(false), |
| waiting_for_clear_cookies_count_(0), |
| waiting_for_clear_history_(false), |
| + waiting_for_clear_local_storage_(false), |
| waiting_for_clear_networking_history_(false), |
| waiting_for_clear_server_bound_certs_(false), |
| waiting_for_clear_plugin_data_(false), |
| @@ -140,7 +149,7 @@ BrowsingDataRemover::BrowsingDataRemover(Profile* profile, |
| waiting_for_clear_content_licenses_(false), |
| remove_mask_(0), |
| remove_origin_(GURL()), |
| - remove_protected_(false) { |
| + origin_set_mask_(0) { |
| DCHECK(profile); |
| } |
| @@ -169,18 +178,18 @@ int BrowsingDataRemover::GenerateQuotaClientMask(int remove_mask) { |
| return quota_client_mask; |
| } |
| -void BrowsingDataRemover::Remove(int remove_mask) { |
| - RemoveImpl(remove_mask, GURL(), false); |
| +void BrowsingDataRemover::Remove(int remove_mask, int origin_set_mask) { |
| + RemoveImpl(remove_mask, GURL(), origin_set_mask); |
| } |
| void BrowsingDataRemover::RemoveImpl(int remove_mask, |
| const GURL& origin, |
| - bool remove_protected_origins) { |
| + int origin_set_mask) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| set_removing(true); |
| remove_mask_ = remove_mask; |
| remove_origin_ = origin; |
| - remove_protected_ = remove_protected_origins; |
| + origin_set_mask_ = origin_set_mask; |
| if (remove_mask & REMOVE_HISTORY) { |
| HistoryService* history_service = |
| @@ -311,8 +320,13 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask, |
| } |
| if (remove_mask & REMOVE_LOCAL_STORAGE) { |
| - BrowserContext::GetDOMStorageContext(profile_)->DeleteDataModifiedSince( |
| - delete_begin_); |
| + waiting_for_clear_local_storage_ = true; |
| + if (!dom_storage_context_) |
| + dom_storage_context_ = BrowserContext::GetDOMStorageContext(profile_); |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&BrowsingDataRemover::ClearLocalStorageOnIOThread, |
|
michaeln
2012/06/01 03:13:40
Also, its fine to call the DSC methods on the UI t
|
| + base::Unretained(this))); |
| } |
| if (remove_mask & REMOVE_INDEXEDDB || remove_mask & REMOVE_WEBSQL || |
| @@ -596,6 +610,48 @@ void BrowsingDataRemover::DoClearCache(int rv) { |
| } |
| } |
| +void BrowsingDataRemover::ClearLocalStorageOnIOThread() { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + DCHECK(waiting_for_clear_local_storage_); |
| + |
| + dom_storage_context_->GetAllStorageFiles( |
|
michaeln
2012/05/31 22:49:07
The return type for this method pains me... a list
|
| + base::Bind(&BrowsingDataRemover::OnGotLocalStorageFiles, |
| + base::Unretained(this))); |
| +} |
| + |
| +void BrowsingDataRemover::OnGotLocalStorageFiles( |
| + const std::vector<FilePath>& files) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + DCHECK(waiting_for_clear_local_storage_); |
| + |
| + for (size_t i = 0; i < files.size(); ++i) { |
| + FilePath file_path = files[i]; |
| + GURL origin(WebKit::WebSecurityOrigin::createFromDatabaseIdentifier( |
| + webkit_glue::FilePathToWebString(file_path.BaseName())).toString()); |
| + if (!BrowsingDataHelper::DoesOriginMatchMask(origin, origin_set_mask_, |
| + special_storage_policy_)) |
| + continue; |
| + |
| + base::PlatformFileInfo file_info; |
| + file_util::GetFileInfo(file_path, &file_info); |
|
Bernhard Bauer
2012/05/31 15:57:31
Wait, are you doing file access on the IO thread?
Mike West
2012/06/01 13:35:17
No! Well, not now anyway.
|
| + |
| + if (file_info.last_modified >= delete_begin_ && |
| + file_info.last_modified <= delete_end_) |
| + dom_storage_context_->DeleteLocalStorageFile(file_path); |
| + } |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(&BrowsingDataRemover::OnLocalStorageCleared, |
| + base::Unretained(this))); |
| +} |
| + |
| +void BrowsingDataRemover::OnLocalStorageCleared() { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + DCHECK(waiting_for_clear_local_storage_); |
| + waiting_for_clear_local_storage_ = false; |
| + NotifyAndDeleteIfDone(); |
| +} |
| + |
| void BrowsingDataRemover::ClearQuotaManagedDataOnIOThread() { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| @@ -605,11 +661,13 @@ void BrowsingDataRemover::ClearQuotaManagedDataOnIOThread() { |
| quota_managed_origins_to_delete_count_ = 0; |
| quota_managed_storage_types_to_delete_count_ = 2; |
| - if (delete_begin_ == base::Time()) { |
| - // If we're deleting since the beginning of time, ask the QuotaManager for |
| - // all origins with persistent quota modified within the user-specified |
| - // timeframe, and deal with the resulting set in |
| - // OnGotPersistentQuotaManagedOrigins. |
| + if (delete_begin_ == base::Time() || |
| + origin_set_mask_ & |
| + (BrowsingDataHelper::PROTECTED_WEB | BrowsingDataHelper::EXTENSION)) { |
| + // If we're deleting since the beginning of time, or we're removing |
| + // protected origins, then ask the QuotaManager for all origins with |
| + // persistent quota modified within the user-specified timeframe, and deal |
| + // with the resulting set in OnGotPersistentQuotaManagedOrigins. |
| quota_manager_->GetOriginsModifiedSince( |
| quota::kStorageTypePersistent, delete_begin_, |
| base::Bind(&BrowsingDataRemover::OnGotQuotaManagedOrigins, |
| @@ -619,27 +677,31 @@ void BrowsingDataRemover::ClearQuotaManagedDataOnIOThread() { |
| --quota_managed_storage_types_to_delete_count_; |
| } |
| - // Do the same for temporary quota, regardless, passing the resulting set into |
| - // OnGotTemporaryQuotaManagedOrigins. |
| - quota_manager_->GetOriginsModifiedSince( |
| - quota::kStorageTypeTemporary, delete_begin_, |
| - base::Bind(&BrowsingDataRemover::OnGotQuotaManagedOrigins, |
| - base::Unretained(this))); |
| + if (origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) { |
| + // Do the same for temporary quota, if we're removing unprotected origins, |
| + // by passing the resulting set into OnGotTemporaryQuotaManagedOrigins. |
| + quota_manager_->GetOriginsModifiedSince( |
| + quota::kStorageTypeTemporary, delete_begin_, |
| + base::Bind(&BrowsingDataRemover::OnGotQuotaManagedOrigins, |
| + base::Unretained(this))); |
| + } |
|
Bernhard Bauer
2012/05/31 15:57:31
Do you need to decrement the count in the other ca
Mike West
2012/06/01 13:35:17
Makes sense. Done.
|
| } |
| void BrowsingDataRemover::OnGotQuotaManagedOrigins( |
| const std::set<GURL>& origins, quota::StorageType type) { |
| DCHECK_GT(quota_managed_storage_types_to_delete_count_, 0); |
| // Walk through the origins passed in, delete quota of |type| from each that |
| - // isn't protected. |
| + // matches the |origin_set_mask_|. |
| std::set<GURL>::const_iterator origin; |
| for (origin = origins.begin(); origin != origins.end(); ++origin) { |
| - if (!BrowsingDataHelper::IsValidScheme(origin->scheme())) |
| - continue; |
| - if (special_storage_policy_->IsStorageProtected(origin->GetOrigin())) |
| - continue; |
| if (!remove_origin_.is_empty() && remove_origin_ != origin->GetOrigin()) |
|
Bernhard Bauer
2012/05/31 15:57:31
This whole thing looks weird. If |remote_origin_|
Mike West
2012/06/01 13:35:17
You're entirely correct, and it's certainly someth
|
| continue; |
| + |
| + if (!BrowsingDataHelper::DoesOriginMatchMask(origin->GetOrigin(), |
| + origin_set_mask_, |
| + special_storage_policy_)) |
| + continue; |
| + |
| ++quota_managed_origins_to_delete_count_; |
| quota_manager_->DeleteOriginData( |
| origin->GetOrigin(), type, |