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

Unified Diff: chrome/browser/browsing_data_remover.cc

Issue 10413072: Teaching BrowsingDataRemover how to delete application data. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: How's this direction? Created 8 years, 7 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 side-by-side diff with in-line comments
Download patch
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,

Powered by Google App Engine
This is Rietveld 408576698