summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--android_webview/native/aw_quota_manager_bridge_impl.cc6
-rw-r--r--chrome/browser/browsing_data/browsing_data_remover.cc318
-rw-r--r--chrome/browser/browsing_data/browsing_data_remover.h81
-rw-r--r--chrome/browser/browsing_data/browsing_data_remover_unittest.cc840
-rw-r--r--chrome/browser/guestview/webview/webview_guest.cc4
-rw-r--r--content/browser/storage_partition_impl.cc397
-rw-r--r--content/browser/storage_partition_impl.h69
-rw-r--r--content/browser/storage_partition_impl_map.cc8
-rw-r--r--content/browser/storage_partition_impl_unittest.cc866
-rw-r--r--content/public/browser/storage_partition.h34
10 files changed, 1778 insertions, 845 deletions
diff --git a/android_webview/native/aw_quota_manager_bridge_impl.cc b/android_webview/native/aw_quota_manager_bridge_impl.cc
index 549352f..1e78771 100644
--- a/android_webview/native/aw_quota_manager_bridge_impl.cc
+++ b/android_webview/native/aw_quota_manager_bridge_impl.cc
@@ -207,14 +207,16 @@ void AwQuotaManagerBridgeImpl::DeleteAllData(JNIEnv* env, jobject object) {
void AwQuotaManagerBridgeImpl::DeleteAllDataOnUiThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- GetStoragePartition()->ClearDataForUnboundedRange(
+ GetStoragePartition()->ClearData(
// Clear all web storage data except cookies.
StoragePartition::REMOVE_DATA_MASK_APPCACHE |
StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
StoragePartition::REMOVE_DATA_MASK_INDEXEDDB |
StoragePartition::REMOVE_DATA_MASK_LOCAL_STORAGE |
StoragePartition::REMOVE_DATA_MASK_WEBSQL,
- StoragePartition::QUOTA_MANAGED_STORAGE_MASK_TEMPORARY);
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_TEMPORARY,
+ NULL, StoragePartition::OriginMatcherFunction(),
+ base::Time(), base::Time::Max(), base::Bind(&base::DoNothing));
}
void AwQuotaManagerBridgeImpl::DeleteOrigin(
diff --git a/chrome/browser/browsing_data/browsing_data_remover.cc b/chrome/browser/browsing_data/browsing_data_remover.cc
index 4824b4a..52bb028 100644
--- a/chrome/browser/browsing_data/browsing_data_remover.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover.cc
@@ -87,6 +87,16 @@ using content::UserMetricsAction;
bool BrowsingDataRemover::is_removing_ = false;
+// Helper to create callback for BrowsingDataRemover::DoesOriginMatchMask.
+// Static.
+bool DoesOriginMatchMask(int origin_set_mask,
+ const GURL& origin,
+ quota::SpecialStoragePolicy* special_storage_policy) {
+ return BrowsingDataHelper::DoesOriginMatchMask(
+ origin, origin_set_mask,
+ static_cast<ExtensionSpecialStoragePolicy*>(special_storage_policy));
+}
+
BrowsingDataRemover::NotificationDetails::NotificationDetails()
: removal_begin(base::Time()),
removal_mask(-1),
@@ -157,8 +167,6 @@ BrowsingDataRemover::BrowsingDataRemover(Profile* profile,
base::Time delete_begin,
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),
@@ -174,23 +182,20 @@ BrowsingDataRemover::BrowsingDataRemover(Profile* profile,
waiting_for_clear_form_(false),
waiting_for_clear_history_(false),
waiting_for_clear_hostname_resolution_cache_(false),
- waiting_for_clear_local_storage_(false),
+ waiting_for_clear_keyword_data_(false),
waiting_for_clear_logged_in_predictor_(false),
waiting_for_clear_nacl_cache_(false),
waiting_for_clear_network_predictor_(false),
waiting_for_clear_networking_history_(false),
+ waiting_for_clear_platform_keys_(false),
waiting_for_clear_plugin_data_(false),
waiting_for_clear_pnacl_cache_(false),
- waiting_for_clear_quota_managed_data_(false),
waiting_for_clear_server_bound_certs_(false),
- waiting_for_clear_session_storage_(false),
- waiting_for_clear_shader_cache_(false),
- waiting_for_clear_webrtc_identity_store_(false),
- waiting_for_clear_keyword_data_(false),
- waiting_for_clear_platform_keys_(false),
+ waiting_for_clear_storage_partition_data_(false),
remove_mask_(0),
remove_origin_(GURL()),
- origin_set_mask_(0) {
+ origin_set_mask_(0),
+ storage_partition_for_testing_(NULL) {
DCHECK(profile);
// crbug.com/140910: Many places were calling this with base::Time() as
// delete_end, even though they should've used base::Time::Max(). Work around
@@ -210,21 +215,6 @@ void BrowsingDataRemover::set_removing(bool is_removing) {
is_removing_ = is_removing;
}
-// Static.
-int BrowsingDataRemover::GenerateQuotaClientMask(int remove_mask) {
- int quota_client_mask = 0;
- if (remove_mask & BrowsingDataRemover::REMOVE_FILE_SYSTEMS)
- quota_client_mask |= quota::QuotaClient::kFileSystem;
- if (remove_mask & BrowsingDataRemover::REMOVE_WEBSQL)
- quota_client_mask |= quota::QuotaClient::kDatabase;
- if (remove_mask & BrowsingDataRemover::REMOVE_APPCACHE)
- quota_client_mask |= quota::QuotaClient::kAppcache;
- if (remove_mask & BrowsingDataRemover::REMOVE_INDEXEDDB)
- quota_client_mask |= quota::QuotaClient::kIndexedDatabase;
-
- return quota_client_mask;
-}
-
void BrowsingDataRemover::Remove(int remove_mask, int origin_set_mask) {
RemoveImpl(remove_mask, GURL(), origin_set_mask);
}
@@ -393,6 +383,8 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
download_prefs->SetSaveFilePath(download_prefs->DownloadPath());
}
+ uint32 storage_partition_remove_mask = 0;
+
// We ignore the REMOVE_COOKIES request if UNPROTECTED_WEB is not set,
// so that callers who request REMOVE_SITE_DATA with PROTECTED_WEB
// don't accidentally remove the cookies that are associated with the
@@ -401,15 +393,10 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
if (remove_mask & REMOVE_COOKIES &&
origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) {
content::RecordAction(UserMetricsAction("ClearBrowsingData_Cookies"));
- // Since we are running on the UI thread don't call GetURLRequestContext().
- net::URLRequestContextGetter* rq_context = profile_->GetRequestContext();
- if (rq_context) {
- ++waiting_for_clear_cookies_count_;
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&BrowsingDataRemover::ClearCookiesOnIOThread,
- base::Unretained(this), base::Unretained(rq_context)));
- }
+
+ storage_partition_remove_mask |=
+ content::StoragePartition::REMOVE_DATA_MASK_COOKIES;
+
// Also delete the LoggedIn Predictor, which tries to keep track of which
// sites a user is logged into.
ClearLoggedInPredictor();
@@ -453,29 +440,25 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
}
if (remove_mask & REMOVE_LOCAL_STORAGE) {
- waiting_for_clear_local_storage_ = true;
- waiting_for_clear_session_storage_ = true;
- if (!dom_storage_context_) {
- dom_storage_context_ =
- BrowserContext::GetDefaultStoragePartition(profile_)->
- GetDOMStorageContext();
- }
- ClearLocalStorageOnUIThread();
- ClearSessionStorageOnUIThread();
+ storage_partition_remove_mask |=
+ content::StoragePartition::REMOVE_DATA_MASK_LOCAL_STORAGE;
}
- if (remove_mask & REMOVE_INDEXEDDB || remove_mask & REMOVE_WEBSQL ||
- remove_mask & REMOVE_APPCACHE || remove_mask & REMOVE_FILE_SYSTEMS) {
- if (!quota_manager_) {
- quota_manager_ =
- BrowserContext::GetDefaultStoragePartition(profile_)->
- GetQuotaManager();
- }
- waiting_for_clear_quota_managed_data_ = true;
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&BrowsingDataRemover::ClearQuotaManagedDataOnIOThread,
- base::Unretained(this)));
+ if (remove_mask & REMOVE_INDEXEDDB) {
+ storage_partition_remove_mask |=
+ content::StoragePartition::REMOVE_DATA_MASK_INDEXEDDB;
+ }
+ if (remove_mask & REMOVE_WEBSQL) {
+ storage_partition_remove_mask |=
+ content::StoragePartition::REMOVE_DATA_MASK_WEBSQL;
+ }
+ if (remove_mask & REMOVE_APPCACHE) {
+ storage_partition_remove_mask |=
+ content::StoragePartition::REMOVE_DATA_MASK_APPCACHE;
+ }
+ if (remove_mask & REMOVE_FILE_SYSTEMS) {
+ storage_partition_remove_mask |=
+ content::StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS;
}
#if defined(ENABLE_PLUGINS)
@@ -571,18 +554,43 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
}
// Tell the shader disk cache to clear.
- waiting_for_clear_shader_cache_ = true;
content::RecordAction(UserMetricsAction("ClearBrowsingData_ShaderCache"));
+ storage_partition_remove_mask |=
+ content::StoragePartition::REMOVE_DATA_MASK_SHADER_CACHE;
+
+ storage_partition_remove_mask |=
+ content::StoragePartition::REMOVE_DATA_MASK_WEBRTC_IDENTITY;
+ }
- ClearShaderCacheOnUIThread();
+ if (storage_partition_remove_mask) {
+ waiting_for_clear_storage_partition_data_ = true;
- waiting_for_clear_webrtc_identity_store_ = true;
- BrowserContext::GetDefaultStoragePartition(profile_)->ClearDataForRange(
- content::StoragePartition::REMOVE_DATA_MASK_WEBRTC_IDENTITY,
- content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
+ content::StoragePartition* storage_partition;
+ if (storage_partition_for_testing_)
+ storage_partition = storage_partition_for_testing_;
+ else
+ storage_partition = BrowserContext::GetDefaultStoragePartition(profile_);
+
+ uint32 quota_storage_remove_mask =
+ ~content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT;
+
+ 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 remove persistent quota data.
+ quota_storage_remove_mask |=
+ content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT;
+ }
+
+ storage_partition->ClearData(
+ storage_partition_remove_mask,
+ quota_storage_remove_mask,
+ &remove_origin_,
+ base::Bind(&DoesOriginMatchMask, origin_set_mask_),
delete_begin_,
delete_end_,
- base::Bind(&BrowsingDataRemover::OnClearWebRTCIdentityStore,
+ base::Bind(&BrowsingDataRemover::OnClearedStoragePartitionData,
base::Unretained(this)));
}
@@ -640,9 +648,9 @@ void BrowsingDataRemover::OnHistoryDeletionDone() {
NotifyAndDeleteIfDone();
}
-void BrowsingDataRemover::OverrideQuotaManagerForTesting(
- quota::QuotaManager* quota_manager) {
- quota_manager_ = quota_manager;
+void BrowsingDataRemover::OverrideStoragePartitionForTesting(
+ content::StoragePartition* storage_partition) {
+ storage_partition_for_testing_ = storage_partition;
}
base::Time BrowsingDataRemover::CalculateBeginDeleteTime(
@@ -677,20 +685,16 @@ bool BrowsingDataRemover::AllDone() {
!waiting_for_clear_autofill_origin_urls_ &&
!waiting_for_clear_cache_ && !waiting_for_clear_nacl_cache_ &&
!waiting_for_clear_cookies_count_ && !waiting_for_clear_history_ &&
- !waiting_for_clear_local_storage_ &&
!waiting_for_clear_logged_in_predictor_ &&
- !waiting_for_clear_session_storage_ &&
!waiting_for_clear_networking_history_ &&
!waiting_for_clear_server_bound_certs_ &&
!waiting_for_clear_plugin_data_ &&
!waiting_for_clear_pnacl_cache_ &&
- !waiting_for_clear_quota_managed_data_ &&
!waiting_for_clear_content_licenses_ && !waiting_for_clear_form_ &&
!waiting_for_clear_hostname_resolution_cache_ &&
!waiting_for_clear_network_predictor_ &&
- !waiting_for_clear_shader_cache_ &&
- !waiting_for_clear_webrtc_identity_store_ &&
- !waiting_for_clear_platform_keys_;
+ !waiting_for_clear_platform_keys_ &&
+ !waiting_for_clear_storage_partition_data_;
}
void BrowsingDataRemover::OnKeywordsLoaded() {
@@ -896,24 +900,6 @@ void BrowsingDataRemover::DoClearCache(int rv) {
}
}
-void BrowsingDataRemover::ClearedShaderCache() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
- waiting_for_clear_shader_cache_ = false;
- NotifyAndDeleteIfDone();
-}
-
-void BrowsingDataRemover::ClearShaderCacheOnUIThread() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
- BrowserContext::GetDefaultStoragePartition(profile_)->ClearDataForRange(
- content::StoragePartition::REMOVE_DATA_MASK_SHADER_CACHE,
- content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
- delete_begin_, delete_end_,
- base::Bind(&BrowsingDataRemover::ClearedShaderCache,
- base::Unretained(this)));
-}
-
#if !defined(DISABLE_NACL)
void BrowsingDataRemover::ClearedNaClCache() {
// This function should be called on the UI thread.
@@ -974,156 +960,6 @@ void BrowsingDataRemover::ClearPnaclCacheOnIOThread(base::Time begin,
}
#endif
-void BrowsingDataRemover::ClearLocalStorageOnUIThread() {
- DCHECK(waiting_for_clear_local_storage_);
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- dom_storage_context_->GetLocalStorageUsage(
- base::Bind(&BrowsingDataRemover::OnGotLocalStorageUsageInfo,
- base::Unretained(this)));
-}
-
-void BrowsingDataRemover::OnGotLocalStorageUsageInfo(
- const std::vector<content::LocalStorageUsageInfo>& infos) {
- DCHECK(waiting_for_clear_local_storage_);
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
- for (size_t i = 0; i < infos.size(); ++i) {
- if (!BrowsingDataHelper::DoesOriginMatchMask(
- infos[i].origin, origin_set_mask_, special_storage_policy_.get()))
- continue;
-
- if (infos[i].last_modified >= delete_begin_ &&
- infos[i].last_modified <= delete_end_) {
- dom_storage_context_->DeleteLocalStorage(infos[i].origin);
- }
- }
- waiting_for_clear_local_storage_ = false;
- NotifyAndDeleteIfDone();
-}
-
-void BrowsingDataRemover::ClearSessionStorageOnUIThread() {
- DCHECK(waiting_for_clear_session_storage_);
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
- dom_storage_context_->GetSessionStorageUsage(
- base::Bind(&BrowsingDataRemover::OnGotSessionStorageUsageInfo,
- base::Unretained(this)));
-}
-
-void BrowsingDataRemover::OnGotSessionStorageUsageInfo(
- const std::vector<content::SessionStorageUsageInfo>& infos) {
- DCHECK(waiting_for_clear_session_storage_);
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
- for (size_t i = 0; i < infos.size(); ++i) {
- if (!BrowsingDataHelper::DoesOriginMatchMask(
- infos[i].origin, origin_set_mask_, special_storage_policy_.get()))
- continue;
-
- dom_storage_context_->DeleteSessionStorage(infos[i]);
- }
- waiting_for_clear_session_storage_ = false;
- NotifyAndDeleteIfDone();
-}
-
-void BrowsingDataRemover::ClearQuotaManagedDataOnIOThread() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
-
- // Ask the QuotaManager for all origins with temporary quota modified within
- // the user-specified timeframe, and deal with the resulting set in
- // OnGotQuotaManagedOrigins().
- quota_managed_origins_to_delete_count_ = 0;
- quota_managed_storage_types_to_delete_count_ = 0;
-
- 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 OnGotQuotaManagedOrigins.
- ++quota_managed_storage_types_to_delete_count_;
- quota_manager_->GetOriginsModifiedSince(
- quota::kStorageTypePersistent, delete_begin_,
- base::Bind(&BrowsingDataRemover::OnGotQuotaManagedOrigins,
- base::Unretained(this)));
- }
-
- // Do the same for temporary quota.
- ++quota_managed_storage_types_to_delete_count_;
- quota_manager_->GetOriginsModifiedSince(
- quota::kStorageTypeTemporary, delete_begin_,
- base::Bind(&BrowsingDataRemover::OnGotQuotaManagedOrigins,
- base::Unretained(this)));
-
- // Do the same for syncable quota.
- ++quota_managed_storage_types_to_delete_count_;
- quota_manager_->GetOriginsModifiedSince(
- quota::kStorageTypeSyncable, delete_begin_,
- base::Bind(&BrowsingDataRemover::OnGotQuotaManagedOrigins,
- base::Unretained(this)));
-}
-
-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
- // matches the |origin_set_mask_|.
- std::set<GURL>::const_iterator origin;
- for (origin = origins.begin(); origin != origins.end(); ++origin) {
- // TODO(mkwst): Clean this up, it's slow. http://crbug.com/130746
- if (!remove_origin_.is_empty() && remove_origin_ != origin->GetOrigin())
- continue;
-
- if (!BrowsingDataHelper::DoesOriginMatchMask(origin->GetOrigin(),
- origin_set_mask_,
- special_storage_policy_.get()))
- continue;
-
- ++quota_managed_origins_to_delete_count_;
- quota_manager_->DeleteOriginData(
- origin->GetOrigin(), type,
- BrowsingDataRemover::GenerateQuotaClientMask(remove_mask_),
- base::Bind(&BrowsingDataRemover::OnQuotaManagedOriginDeletion,
- base::Unretained(this), origin->GetOrigin(), type));
- }
-
- --quota_managed_storage_types_to_delete_count_;
- CheckQuotaManagedDataDeletionStatus();
-}
-
-void BrowsingDataRemover::OnQuotaManagedOriginDeletion(
- const GURL& origin,
- quota::StorageType type,
- quota::QuotaStatusCode status) {
- DCHECK_GT(quota_managed_origins_to_delete_count_, 0);
- if (status != quota::kQuotaStatusOk) {
- DLOG(ERROR) << "Couldn't remove data of type " << type << " for origin "
- << origin << ". Status: " << status;
- }
-
- --quota_managed_origins_to_delete_count_;
- CheckQuotaManagedDataDeletionStatus();
-}
-
-void BrowsingDataRemover::CheckQuotaManagedDataDeletionStatus() {
- if (quota_managed_storage_types_to_delete_count_ != 0 ||
- quota_managed_origins_to_delete_count_ != 0) {
- return;
- }
-
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&BrowsingDataRemover::OnQuotaManagedDataDeleted,
- base::Unretained(this)));
-}
-
-void BrowsingDataRemover::OnQuotaManagedDataDeleted() {
- DCHECK(waiting_for_clear_quota_managed_data_);
- waiting_for_clear_quota_managed_data_ = false;
- NotifyAndDeleteIfDone();
-}
-
void BrowsingDataRemover::OnWaitableEventSignaled(
base::WaitableEvent* waitable_event) {
waiting_for_clear_plugin_data_ = false;
@@ -1223,8 +1059,8 @@ void BrowsingDataRemover::OnClearedAutofillOriginURLs() {
NotifyAndDeleteIfDone();
}
-void BrowsingDataRemover::OnClearWebRTCIdentityStore() {
+void BrowsingDataRemover::OnClearedStoragePartitionData() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- waiting_for_clear_webrtc_identity_store_ = false;
+ waiting_for_clear_storage_partition_data_ = false;
NotifyAndDeleteIfDone();
}
diff --git a/chrome/browser/browsing_data/browsing_data_remover.h b/chrome/browser/browsing_data/browsing_data_remover.h
index 083781e..a15d3da 100644
--- a/chrome/browser/browsing_data/browsing_data_remover.h
+++ b/chrome/browser/browsing_data/browsing_data_remover.h
@@ -29,6 +29,7 @@ class Profile;
namespace content {
class PluginDataRemover;
+class StoragePartition;
}
namespace disk_cache {
@@ -158,10 +159,6 @@ class BrowsingDataRemover
// Calculate the begin time for the deletion range specified by |time_period|.
static base::Time CalculateBeginDeleteTime(TimePeriod time_period);
- // Quota managed data uses a different bitmask for types than
- // BrowsingDataRemover uses. This method generates that mask.
- static int GenerateQuotaClientMask(int remove_mask);
-
// Is the BrowsingDataRemover currently in the process of removing data?
static bool is_removing() { return is_removing_; }
@@ -176,7 +173,8 @@ class BrowsingDataRemover
void OnHistoryDeletionDone();
// Used for testing.
- void OverrideQuotaManagerForTesting(quota::QuotaManager* quota_manager);
+ void OverrideStoragePartitionForTesting(
+ content::StoragePartition* storage_partition);
private:
// The clear API needs to be able to toggle removing_ in order to test that
@@ -305,44 +303,6 @@ class BrowsingDataRemover
void ClearPnaclCacheOnIOThread(base::Time begin, base::Time end);
#endif
- // Invoked on the UI thread to delete local storage.
- void ClearLocalStorageOnUIThread();
-
- // Callback to deal with the list gathered in ClearLocalStorageOnUIThread.
- void OnGotLocalStorageUsageInfo(
- const std::vector<content::LocalStorageUsageInfo>& infos);
-
- // Invoked on the UI thread to delete session storage.
- void ClearSessionStorageOnUIThread();
-
- // Callback to deal with the list gathered in ClearSessionStorageOnUIThread.
- void OnGotSessionStorageUsageInfo(
- const std::vector<content::SessionStorageUsageInfo>& infos);
-
- // Invoked on the IO thread to delete all storage types managed by the quota
- // system: AppCache, Databases, FileSystems.
- void ClearQuotaManagedDataOnIOThread();
-
- // Callback to respond to QuotaManager::GetOriginsModifiedSince, which is the
- // core of 'ClearQuotaManagedDataOnIOThread'.
- void OnGotQuotaManagedOrigins(const std::set<GURL>& origins,
- quota::StorageType type);
-
- // Callback responding to deletion of a single quota managed origin's
- // persistent data
- void OnQuotaManagedOriginDeletion(const GURL& origin,
- quota::StorageType type,
- quota::QuotaStatusCode);
-
- // Called to check whether all temporary and persistent origin data that
- // should be deleted has been deleted. If everything's good to go, invokes
- // OnQuotaManagedDataDeleted on the UI thread.
- void CheckQuotaManagedDataDeletionStatus();
-
- // Completion handler that runs on the UI thread once persistent data has been
- // deleted. Updates the waiting flag and invokes NotifyAndDeleteIfDone.
- void OnQuotaManagedDataDeleted();
-
// Callback for when Cookies has been deleted. Invokes NotifyAndDeleteIfDone.
void OnClearedCookies(int num_deleted);
@@ -369,15 +329,9 @@ class BrowsingDataRemover
// been deleted.
void OnClearedAutofillOriginURLs();
- // Callback for when the shader cache has been deleted.
- // Invokes NotifyAndDeleteIfDone.
- void ClearedShaderCache();
- // Invoked on the IO thread to delete from the shader cache.
- void ClearShaderCacheOnUIThread();
-
- // Callback on UI thread when the WebRTC identities are cleared.
- void OnClearWebRTCIdentityStore();
+ // Callback on UI thread when the storage partition related data are cleared.
+ void OnClearedStoragePartitionData();
// Returns true if we're all done.
bool AllDone();
@@ -385,13 +339,6 @@ class BrowsingDataRemover
// Profile we're to remove from.
Profile* profile_;
- // The QuotaManager is owned by the profile; we can use a raw pointer here,
- // and rely on the profile to destroy the object whenever it's reasonable.
- quota::QuotaManager* quota_manager_;
-
- // The DOMStorageContext is owned by the profile; we'll store a raw pointer.
- content::DOMStorageContext* dom_storage_context_;
-
// 'Protected' origins are not subject to data removal.
scoped_refptr<ExtensionSpecialStoragePolicy> special_storage_policy_;
@@ -431,25 +378,16 @@ class BrowsingDataRemover
bool waiting_for_clear_form_;
bool waiting_for_clear_history_;
bool waiting_for_clear_hostname_resolution_cache_;
- bool waiting_for_clear_local_storage_;
+ bool waiting_for_clear_keyword_data_;
bool waiting_for_clear_logged_in_predictor_;
bool waiting_for_clear_nacl_cache_;
bool waiting_for_clear_network_predictor_;
bool waiting_for_clear_networking_history_;
+ bool waiting_for_clear_platform_keys_;
bool waiting_for_clear_plugin_data_;
bool waiting_for_clear_pnacl_cache_;
- bool waiting_for_clear_quota_managed_data_;
bool waiting_for_clear_server_bound_certs_;
- bool waiting_for_clear_session_storage_;
- bool waiting_for_clear_shader_cache_;
- bool waiting_for_clear_webrtc_identity_store_;
- bool waiting_for_clear_keyword_data_;
- bool waiting_for_clear_platform_keys_;
-
- // Tracking how many origins need to be deleted, and whether we're finished
- // gathering origins.
- int quota_managed_origins_to_delete_count_;
- int quota_managed_storage_types_to_delete_count_;
+ bool waiting_for_clear_storage_partition_data_;
// The removal mask for the current removal operation.
int remove_mask_;
@@ -467,6 +405,9 @@ class BrowsingDataRemover
scoped_ptr<TemplateURLService::Subscription> template_url_sub_;
+ // We do not own this.
+ content::StoragePartition* storage_partition_for_testing_;
+
DISALLOW_COPY_AND_ASSIGN(BrowsingDataRemover);
};
diff --git a/chrome/browser/browsing_data/browsing_data_remover_unittest.cc b/chrome/browser/browsing_data/browsing_data_remover_unittest.cc
index 228392c..d6313d2 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_unittest.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover_unittest.cc
@@ -56,11 +56,9 @@
#include "net/url_request/url_request_context_getter.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "webkit/browser/quota/mock_quota_manager.h"
-#include "webkit/browser/quota/quota_manager.h"
-#include "webkit/common/quota/quota_types.h"
using content::BrowserThread;
+using content::StoragePartition;
using testing::_;
using testing::Invoke;
using testing::WithArgs;
@@ -95,47 +93,6 @@ const base::FilePath::CharType kDomStorageOrigin3[] =
const base::FilePath::CharType kDomStorageExt[] = FILE_PATH_LITERAL(
"chrome-extension_abcdefghijklmnopqrstuvwxyz_0.localstorage");
-const quota::StorageType kTemporary = quota::kStorageTypeTemporary;
-const quota::StorageType kPersistent = quota::kStorageTypePersistent;
-
-const quota::QuotaClient::ID kClientFile = quota::QuotaClient::kFileSystem;
-
-void PopulateTestQuotaManagedNonBrowsingData(quota::MockQuotaManager* manager) {
- manager->AddOrigin(kOriginDevTools, kTemporary, kClientFile, base::Time());
- manager->AddOrigin(kOriginDevTools, kPersistent, kClientFile, base::Time());
- manager->AddOrigin(kOriginExt, kTemporary, kClientFile, base::Time());
- manager->AddOrigin(kOriginExt, kPersistent, kClientFile, base::Time());
-}
-
-void PopulateTestQuotaManagedPersistentData(quota::MockQuotaManager* manager) {
- manager->AddOrigin(kOrigin2, kPersistent, kClientFile, base::Time());
- manager->AddOrigin(kOrigin3, kPersistent, kClientFile,
- base::Time::Now() - base::TimeDelta::FromDays(1));
-
- EXPECT_FALSE(manager->OriginHasData(kOrigin1, kPersistent, kClientFile));
- EXPECT_TRUE(manager->OriginHasData(kOrigin2, kPersistent, kClientFile));
- EXPECT_TRUE(manager->OriginHasData(kOrigin3, kPersistent, kClientFile));
-}
-
-void PopulateTestQuotaManagedTemporaryData(quota::MockQuotaManager* manager) {
- manager->AddOrigin(kOrigin1, kTemporary, kClientFile, base::Time::Now());
- manager->AddOrigin(kOrigin3, kTemporary, kClientFile,
- base::Time::Now() - base::TimeDelta::FromDays(1));
-
- EXPECT_TRUE(manager->OriginHasData(kOrigin1, kTemporary, kClientFile));
- EXPECT_FALSE(manager->OriginHasData(kOrigin2, kTemporary, kClientFile));
- EXPECT_TRUE(manager->OriginHasData(kOrigin3, kTemporary, kClientFile));
-}
-
-void PopulateTestQuotaManagedData(quota::MockQuotaManager* manager) {
- // Set up kOrigin1 with a temporary quota, kOrigin2 with a persistent
- // quota, and kOrigin3 with both. kOrigin1 is modified now, kOrigin2
- // is modified at the beginning of time, and kOrigin3 is modified one day
- // ago.
- PopulateTestQuotaManagedPersistentData(manager);
- PopulateTestQuotaManagedTemporaryData(manager);
-}
-
class AwaitCompletionHelper : public BrowsingDataRemover::Observer {
public:
AwaitCompletionHelper() : start_(false), already_quit_(false) {}
@@ -186,6 +143,93 @@ void FakeDBusCall(const chromeos::BoolDBusMethodCallback& callback) {
}
#endif
+struct StoragePartitionRemovalData {
+ uint32 remove_mask;
+ uint32 quota_storage_remove_mask;
+ GURL remove_origin;
+ base::Time remove_begin;
+ base::Time remove_end;
+ StoragePartition::OriginMatcherFunction origin_matcher;
+
+ StoragePartitionRemovalData() : remove_mask(0),
+ quota_storage_remove_mask(0) {}
+};
+
+class TestStoragePartition : public StoragePartition {
+ public:
+ TestStoragePartition() {}
+ virtual ~TestStoragePartition() {}
+
+ // content::StoragePartition implementation.
+ virtual base::FilePath GetPath() OVERRIDE { return base::FilePath(); }
+ virtual net::URLRequestContextGetter* GetURLRequestContext() OVERRIDE {
+ return NULL;
+ }
+ virtual net::URLRequestContextGetter* GetMediaURLRequestContext() OVERRIDE {
+ return NULL;
+ }
+ virtual quota::QuotaManager* GetQuotaManager() OVERRIDE {
+ return NULL;
+ }
+ virtual appcache::AppCacheService* GetAppCacheService() OVERRIDE {
+ return NULL;
+ }
+ virtual fileapi::FileSystemContext* GetFileSystemContext() OVERRIDE {
+ return NULL;
+ }
+ virtual webkit_database::DatabaseTracker* GetDatabaseTracker() OVERRIDE {
+ return NULL;
+ }
+ virtual content::DOMStorageContext* GetDOMStorageContext() OVERRIDE {
+ return NULL;
+ }
+ virtual content::IndexedDBContext* GetIndexedDBContext() OVERRIDE {
+ return NULL;
+ }
+
+ virtual void ClearDataForOrigin(
+ uint32 remove_mask,
+ uint32 quota_storage_remove_mask,
+ const GURL& storage_origin,
+ net::URLRequestContextGetter* rq_context) OVERRIDE {}
+
+ virtual void ClearData(uint32 remove_mask,
+ uint32 quota_storage_remove_mask,
+ const GURL* storage_origin,
+ const OriginMatcherFunction& origin_matcher,
+ const base::Time begin,
+ const base::Time end,
+ const base::Closure& callback) OVERRIDE {
+ // Store stuff to verify parameters' correctness later.
+ storage_partition_removal_data_.remove_mask = remove_mask;
+ storage_partition_removal_data_.quota_storage_remove_mask =
+ quota_storage_remove_mask;
+ storage_partition_removal_data_.remove_origin =
+ storage_origin ? *storage_origin : GURL();
+ storage_partition_removal_data_.remove_begin = begin;
+ storage_partition_removal_data_.remove_end = end;
+ storage_partition_removal_data_.origin_matcher = origin_matcher;
+
+ BrowserThread::PostTask(
+ BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(&TestStoragePartition::AsyncRunCallback,
+ base::Unretained(this), callback));
+ }
+
+ StoragePartitionRemovalData GetStoragePartitionRemovalData() {
+ return storage_partition_removal_data_;
+ }
+ private:
+ void AsyncRunCallback(const base::Closure& callback) {
+ callback.Run();
+ }
+
+ StoragePartitionRemovalData storage_partition_removal_data_;
+
+ DISALLOW_COPY_AND_ASSIGN(TestStoragePartition);
+};
+
} // namespace
// Testers -------------------------------------------------------------------
@@ -242,14 +286,6 @@ class RemoveCookieTester {
DISALLOW_COPY_AND_ASSIGN(RemoveCookieTester);
};
-class RemoveProfileCookieTester : public RemoveCookieTester {
- public:
- explicit RemoveProfileCookieTester(TestingProfile* profile) {
- SetMonster(profile->GetRequestContext()->GetURLRequestContext()->
- cookie_store()->GetCookieMonster());
- }
-};
-
#if defined(FULL_SAFE_BROWSING) || defined(MOBILE_SAFE_BROWSING)
class RemoveSafeBrowsingCookieTester : public RemoveCookieTester {
public:
@@ -589,7 +625,9 @@ class BrowsingDataRemoverTest : public testing::Test,
bool include_protected_origins) {
BrowsingDataRemover* remover = BrowsingDataRemover::CreateForPeriod(
profile_.get(), period);
- remover->OverrideQuotaManagerForTesting(GetMockManager());
+
+ TestStoragePartition storage_partition;
+ remover->OverrideStoragePartitionForTesting(&storage_partition);
AwaitCompletionHelper await_completion;
remover->AddObserver(&await_completion);
@@ -602,6 +640,10 @@ class BrowsingDataRemoverTest : public testing::Test,
origin_set_mask |= BrowsingDataHelper::PROTECTED_WEB;
remover->Remove(remove_mask, origin_set_mask);
await_completion.BlockUntilNotified();
+
+ // Save so we can verify later.
+ storage_partition_removal_data_ =
+ storage_partition.GetStoragePartitionRemovalData();
}
void BlockUntilOriginDataRemoved(BrowsingDataRemover::TimePeriod period,
@@ -609,7 +651,8 @@ class BrowsingDataRemoverTest : public testing::Test,
const GURL& remove_origin) {
BrowsingDataRemover* remover = BrowsingDataRemover::CreateForPeriod(
profile_.get(), period);
- remover->OverrideQuotaManagerForTesting(GetMockManager());
+ TestStoragePartition storage_partition;
+ remover->OverrideStoragePartitionForTesting(&storage_partition);
AwaitCompletionHelper await_completion;
remover->AddObserver(&await_completion);
@@ -620,6 +663,10 @@ class BrowsingDataRemoverTest : public testing::Test,
remover->RemoveImpl(remove_mask, remove_origin,
BrowsingDataHelper::UNPROTECTED_WEB);
await_completion.BlockUntilNotified();
+
+ // Save so we can verify later.
+ storage_partition_removal_data_ =
+ storage_partition.GetStoragePartitionRemovalData();
}
TestingProfile* GetProfile() {
@@ -638,16 +685,8 @@ class BrowsingDataRemoverTest : public testing::Test,
return called_with_details_->origin_set_mask;
}
- quota::MockQuotaManager* GetMockManager() {
- if (!quota_manager_.get()) {
- quota_manager_ = new quota::MockQuotaManager(
- profile_->IsOffTheRecord(),
- profile_->GetPath(),
- BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO).get(),
- BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB).get(),
- profile_->GetExtensionSpecialStoragePolicy());
- }
- return quota_manager_.get();
+ StoragePartitionRemovalData GetStoragePartitionRemovalData() {
+ return storage_partition_removal_data_;
}
// content::NotificationObserver implementation.
@@ -671,7 +710,8 @@ class BrowsingDataRemoverTest : public testing::Test,
content::TestBrowserThreadBundle thread_bundle_;
scoped_ptr<TestingProfile> profile_;
- scoped_refptr<quota::MockQuotaManager> quota_manager_;
+
+ StoragePartitionRemovalData storage_partition_removal_data_;
DISALLOW_COPY_AND_ASSIGN(BrowsingDataRemoverTest);
};
@@ -679,31 +719,46 @@ class BrowsingDataRemoverTest : public testing::Test,
// Tests ---------------------------------------------------------------------
TEST_F(BrowsingDataRemoverTest, RemoveCookieForever) {
- RemoveProfileCookieTester tester(GetProfile());
-
- tester.AddCookie();
- ASSERT_TRUE(tester.ContainsCookie());
-
BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING,
- BrowsingDataRemover::REMOVE_COOKIES, false);
+ BrowsingDataRemover::REMOVE_COOKIES,
+ false);
EXPECT_EQ(BrowsingDataRemover::REMOVE_COOKIES, GetRemovalMask());
EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
- EXPECT_FALSE(tester.ContainsCookie());
+
+ // Verify that storage partition was instructed to remove the cookies.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_COOKIES));
+ EXPECT_EQ(removal_data.quota_storage_remove_mask,
+ static_cast<uint32>(
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL));
+ EXPECT_TRUE(removal_data.remove_origin.is_empty());
+ EXPECT_EQ(removal_data.remove_begin, GetBeginTime());
}
TEST_F(BrowsingDataRemoverTest, RemoveCookieLastHour) {
- RemoveProfileCookieTester tester(GetProfile());
-
- tester.AddCookie();
- ASSERT_TRUE(tester.ContainsCookie());
-
BlockUntilBrowsingDataRemoved(BrowsingDataRemover::LAST_HOUR,
- BrowsingDataRemover::REMOVE_COOKIES, false);
+ BrowsingDataRemover::REMOVE_COOKIES,
+ false);
EXPECT_EQ(BrowsingDataRemover::REMOVE_COOKIES, GetRemovalMask());
EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
- EXPECT_FALSE(tester.ContainsCookie());
+
+ // Verify that storage partition was instructed to remove the cookies.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_COOKIES));
+ // Removing with time period other than EVERYTHING should not clear
+ // persistent storage data.
+ EXPECT_EQ(removal_data.quota_storage_remove_mask,
+ static_cast<uint32>(
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL &
+ ~StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT));
+ EXPECT_TRUE(removal_data.remove_origin.is_empty());
+ EXPECT_EQ(removal_data.remove_begin, GetBeginTime());
}
#if defined(FULL_SAFE_BROWSING) || defined(MOBILE_SAFE_BROWSING)
@@ -785,23 +840,29 @@ TEST_F(BrowsingDataRemoverTest, RemoveUnprotectedLocalStorageForever) {
mock_policy->AddProtected(kOrigin1.GetOrigin());
GetProfile()->SetExtensionSpecialStoragePolicy(mock_policy.get());
- RemoveLocalStorageTester tester(GetProfile());
-
- tester.AddDOMStorageTestData();
- EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1));
- EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin2));
- EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3));
- EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOriginExt));
-
BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING,
- BrowsingDataRemover::REMOVE_LOCAL_STORAGE, false);
+ BrowsingDataRemover::REMOVE_LOCAL_STORAGE,
+ false);
EXPECT_EQ(BrowsingDataRemover::REMOVE_LOCAL_STORAGE, GetRemovalMask());
EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
- EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1));
- EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin2));
- EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin3));
- EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOriginExt));
+
+ // Verify that storage partition was instructed to remove the data correctly.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_LOCAL_STORAGE));
+ EXPECT_EQ(removal_data.quota_storage_remove_mask,
+ static_cast<uint32>(
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL));
+ EXPECT_TRUE(removal_data.remove_origin.is_empty());
+ EXPECT_EQ(removal_data.remove_begin, GetBeginTime());
+
+ // Check origin matcher.
+ EXPECT_FALSE(removal_data.origin_matcher.Run(kOrigin1, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin2, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin3, mock_policy));
+ EXPECT_FALSE(removal_data.origin_matcher.Run(kOriginExt, mock_policy));
}
TEST_F(BrowsingDataRemoverTest, RemoveProtectedLocalStorageForever) {
@@ -811,43 +872,63 @@ TEST_F(BrowsingDataRemoverTest, RemoveProtectedLocalStorageForever) {
mock_policy->AddProtected(kOrigin1.GetOrigin());
GetProfile()->SetExtensionSpecialStoragePolicy(mock_policy.get());
- RemoveLocalStorageTester tester(GetProfile());
-
- tester.AddDOMStorageTestData();
- EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1));
- EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin2));
- EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3));
- EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOriginExt));
-
BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING,
- BrowsingDataRemover::REMOVE_LOCAL_STORAGE, true);
+ BrowsingDataRemover::REMOVE_LOCAL_STORAGE,
+ true);
EXPECT_EQ(BrowsingDataRemover::REMOVE_LOCAL_STORAGE, GetRemovalMask());
- EXPECT_EQ(BrowsingDataHelper::PROTECTED_WEB |
- BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
- EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin1));
- EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin2));
- EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin3));
- EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOriginExt));
+ EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB |
+ BrowsingDataHelper::PROTECTED_WEB, GetOriginSetMask());
+
+ // Verify that storage partition was instructed to remove the data correctly.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_LOCAL_STORAGE));
+ EXPECT_EQ(removal_data.quota_storage_remove_mask,
+ static_cast<uint32>(
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL));
+ EXPECT_TRUE(removal_data.remove_origin.is_empty());
+ EXPECT_EQ(removal_data.remove_begin, GetBeginTime());
+
+ // Check origin matcher all http origin will match since we specified
+ // both protected and unprotected.
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin1, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin2, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin3, mock_policy));
+ EXPECT_FALSE(removal_data.origin_matcher.Run(kOriginExt, mock_policy));
}
TEST_F(BrowsingDataRemoverTest, RemoveLocalStorageForLastWeek) {
- RemoveLocalStorageTester tester(GetProfile());
-
- tester.AddDOMStorageTestData();
- EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1));
- EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin2));
- EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3));
+ scoped_refptr<MockExtensionSpecialStoragePolicy> mock_policy =
+ new MockExtensionSpecialStoragePolicy;
+ GetProfile()->SetExtensionSpecialStoragePolicy(mock_policy.get());
BlockUntilBrowsingDataRemoved(BrowsingDataRemover::LAST_WEEK,
- BrowsingDataRemover::REMOVE_LOCAL_STORAGE, false);
+ BrowsingDataRemover::REMOVE_LOCAL_STORAGE,
+ false);
EXPECT_EQ(BrowsingDataRemover::REMOVE_LOCAL_STORAGE, GetRemovalMask());
EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
- EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin1));
- EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin2));
- EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3));
- EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOriginExt));
+
+ // Verify that storage partition was instructed to remove the data correctly.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_LOCAL_STORAGE));
+ // Persistent storage won't be deleted.
+ EXPECT_EQ(removal_data.quota_storage_remove_mask,
+ static_cast<uint32>(
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL &
+ ~StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT));
+ EXPECT_TRUE(removal_data.remove_origin.is_empty());
+ EXPECT_EQ(removal_data.remove_begin, GetBeginTime());
+
+ // Check origin matcher.
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin1, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin2, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin3, mock_policy));
+ EXPECT_FALSE(removal_data.origin_matcher.Run(kOriginExt, mock_policy));
}
TEST_F(BrowsingDataRemoverTest, RemoveHistoryForever) {
@@ -919,11 +1000,6 @@ TEST_F(BrowsingDataRemoverTest, RemoveMultipleTypes) {
history_tester.AddHistory(kOrigin1, base::Time::Now());
ASSERT_TRUE(history_tester.HistoryContainsURL(kOrigin1));
- // Add some cookies.
- RemoveProfileCookieTester cookie_tester(GetProfile());
- cookie_tester.AddCookie();
- ASSERT_TRUE(cookie_tester.ContainsCookie());
-
int removal_mask = BrowsingDataRemover::REMOVE_HISTORY |
BrowsingDataRemover::REMOVE_COOKIES;
@@ -933,7 +1009,16 @@ TEST_F(BrowsingDataRemoverTest, RemoveMultipleTypes) {
EXPECT_EQ(removal_mask, GetRemovalMask());
EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
EXPECT_FALSE(history_tester.HistoryContainsURL(kOrigin1));
- EXPECT_FALSE(cookie_tester.ContainsCookie());
+
+ // The cookie would be deleted throught the StorageParition, check if the
+ // partition was requested to remove cookie.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_COOKIES));
+ EXPECT_EQ(removal_data.quota_storage_remove_mask,
+ static_cast<uint32>(
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL));
}
// This should crash (DCHECK) in Debug, but death tests don't work properly
@@ -949,11 +1034,6 @@ TEST_F(BrowsingDataRemoverTest, RemoveMultipleTypesHistoryProhibited) {
history_tester.AddHistory(kOrigin1, base::Time::Now());
ASSERT_TRUE(history_tester.HistoryContainsURL(kOrigin1));
- // Add some cookies.
- RemoveProfileCookieTester cookie_tester(GetProfile());
- cookie_tester.AddCookie();
- ASSERT_TRUE(cookie_tester.ContainsCookie());
-
int removal_mask = BrowsingDataRemover::REMOVE_HISTORY |
BrowsingDataRemover::REMOVE_COOKIES;
@@ -962,228 +1042,265 @@ TEST_F(BrowsingDataRemoverTest, RemoveMultipleTypesHistoryProhibited) {
EXPECT_EQ(removal_mask, GetRemovalMask());
EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
- // Cookie should be gone; history should remain.
- EXPECT_FALSE(cookie_tester.ContainsCookie());
+ // 1/2. History should remain.
EXPECT_TRUE(history_tester.HistoryContainsURL(kOrigin1));
-}
-#endif
-TEST_F(BrowsingDataRemoverTest, QuotaClientMaskGeneration) {
- EXPECT_EQ(quota::QuotaClient::kFileSystem,
- BrowsingDataRemover::GenerateQuotaClientMask(
- BrowsingDataRemover::REMOVE_FILE_SYSTEMS));
- EXPECT_EQ(quota::QuotaClient::kDatabase,
- BrowsingDataRemover::GenerateQuotaClientMask(
- BrowsingDataRemover::REMOVE_WEBSQL));
- EXPECT_EQ(quota::QuotaClient::kAppcache,
- BrowsingDataRemover::GenerateQuotaClientMask(
- BrowsingDataRemover::REMOVE_APPCACHE));
- EXPECT_EQ(quota::QuotaClient::kIndexedDatabase,
- BrowsingDataRemover::GenerateQuotaClientMask(
- BrowsingDataRemover::REMOVE_INDEXEDDB));
- EXPECT_EQ(quota::QuotaClient::kFileSystem |
- quota::QuotaClient::kDatabase |
- quota::QuotaClient::kAppcache |
- quota::QuotaClient::kIndexedDatabase,
- BrowsingDataRemover::GenerateQuotaClientMask(
- BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
- BrowsingDataRemover::REMOVE_WEBSQL |
- BrowsingDataRemover::REMOVE_APPCACHE |
- BrowsingDataRemover::REMOVE_INDEXEDDB));
+ // 2/2. The cookie(s) would be deleted throught the StorageParition, check if
+ // the partition was requested to remove cookie.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_COOKIES));
+ // Persistent storage won't be deleted, since EVERYTHING was not specified.
+ EXPECT_EQ(removal_data.quota_storage_remove_mask,
+ static_cast<uint32>(
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL &
+ ~StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT));
}
+#endif
TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedDataForeverBoth) {
- PopulateTestQuotaManagedData(GetMockManager());
BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING,
- BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
- BrowsingDataRemover::REMOVE_WEBSQL |
- BrowsingDataRemover::REMOVE_APPCACHE |
- BrowsingDataRemover::REMOVE_INDEXEDDB, false);
+ BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
+ BrowsingDataRemover::REMOVE_WEBSQL |
+ BrowsingDataRemover::REMOVE_APPCACHE |
+ BrowsingDataRemover::REMOVE_INDEXEDDB,
+ false);
EXPECT_EQ(BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
BrowsingDataRemover::REMOVE_WEBSQL |
BrowsingDataRemover::REMOVE_APPCACHE |
BrowsingDataRemover::REMOVE_INDEXEDDB, GetRemovalMask());
EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
- kClientFile));
+
+ // Verify storage partition related stuffs.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
+ StoragePartition::REMOVE_DATA_MASK_WEBSQL |
+ StoragePartition::REMOVE_DATA_MASK_APPCACHE |
+ StoragePartition::REMOVE_DATA_MASK_INDEXEDDB));
+ EXPECT_EQ(removal_data.quota_storage_remove_mask,
+ static_cast<uint32>(
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL));
+ EXPECT_TRUE(removal_data.remove_origin.is_empty());
}
TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedDataForeverOnlyTemporary) {
- PopulateTestQuotaManagedTemporaryData(GetMockManager());
+ scoped_refptr<MockExtensionSpecialStoragePolicy> mock_policy =
+ new MockExtensionSpecialStoragePolicy;
+ GetProfile()->SetExtensionSpecialStoragePolicy(mock_policy.get());
+
BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING,
- BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
- BrowsingDataRemover::REMOVE_WEBSQL |
- BrowsingDataRemover::REMOVE_APPCACHE |
- BrowsingDataRemover::REMOVE_INDEXEDDB, false);
+ BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
+ BrowsingDataRemover::REMOVE_WEBSQL |
+ BrowsingDataRemover::REMOVE_APPCACHE |
+ BrowsingDataRemover::REMOVE_INDEXEDDB,
+ false);
EXPECT_EQ(BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
BrowsingDataRemover::REMOVE_WEBSQL |
BrowsingDataRemover::REMOVE_APPCACHE |
BrowsingDataRemover::REMOVE_INDEXEDDB, GetRemovalMask());
EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
- kClientFile));
+
+ // Verify storage partition related stuffs.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
+ StoragePartition::REMOVE_DATA_MASK_WEBSQL |
+ StoragePartition::REMOVE_DATA_MASK_APPCACHE |
+ StoragePartition::REMOVE_DATA_MASK_INDEXEDDB));
+ EXPECT_EQ(removal_data.quota_storage_remove_mask,
+ static_cast<uint32>(
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL));
+ EXPECT_TRUE(removal_data.remove_origin.is_empty());
+
+ // Check that all related origin data would be removed, that is, origin
+ // matcher would match these origin.
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin1, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin2, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin3, mock_policy));
}
TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedDataForeverOnlyPersistent) {
- PopulateTestQuotaManagedPersistentData(GetMockManager());
+ scoped_refptr<MockExtensionSpecialStoragePolicy> mock_policy =
+ new MockExtensionSpecialStoragePolicy;
+ GetProfile()->SetExtensionSpecialStoragePolicy(mock_policy.get());
+
BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING,
- BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
- BrowsingDataRemover::REMOVE_WEBSQL |
- BrowsingDataRemover::REMOVE_APPCACHE |
- BrowsingDataRemover::REMOVE_INDEXEDDB, false);
+ BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
+ BrowsingDataRemover::REMOVE_WEBSQL |
+ BrowsingDataRemover::REMOVE_APPCACHE |
+ BrowsingDataRemover::REMOVE_INDEXEDDB,
+ false);
EXPECT_EQ(BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
BrowsingDataRemover::REMOVE_WEBSQL |
BrowsingDataRemover::REMOVE_APPCACHE |
BrowsingDataRemover::REMOVE_INDEXEDDB, GetRemovalMask());
EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
- kClientFile));
+
+ // Verify storage partition related stuffs.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
+ StoragePartition::REMOVE_DATA_MASK_WEBSQL |
+ StoragePartition::REMOVE_DATA_MASK_APPCACHE |
+ StoragePartition::REMOVE_DATA_MASK_INDEXEDDB));
+ EXPECT_EQ(removal_data.quota_storage_remove_mask,
+ static_cast<uint32>(
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL));
+ EXPECT_TRUE(removal_data.remove_origin.is_empty());
+
+ // Check that all related origin data would be removed, that is, origin
+ // matcher would match these origin.
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin1, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin2, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin3, mock_policy));
}
TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedDataForeverNeither) {
- GetMockManager(); // Creates the QuotaManager instance.
+ scoped_refptr<MockExtensionSpecialStoragePolicy> mock_policy =
+ new MockExtensionSpecialStoragePolicy;
+ GetProfile()->SetExtensionSpecialStoragePolicy(mock_policy.get());
+
BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING,
- BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
- BrowsingDataRemover::REMOVE_WEBSQL |
- BrowsingDataRemover::REMOVE_APPCACHE |
- BrowsingDataRemover::REMOVE_INDEXEDDB, false);
+ BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
+ BrowsingDataRemover::REMOVE_WEBSQL |
+ BrowsingDataRemover::REMOVE_APPCACHE |
+ BrowsingDataRemover::REMOVE_INDEXEDDB,
+ false);
EXPECT_EQ(BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
BrowsingDataRemover::REMOVE_WEBSQL |
BrowsingDataRemover::REMOVE_APPCACHE |
BrowsingDataRemover::REMOVE_INDEXEDDB, GetRemovalMask());
EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
- kClientFile));
+
+ // Verify storage partition related stuffs.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
+ StoragePartition::REMOVE_DATA_MASK_WEBSQL |
+ StoragePartition::REMOVE_DATA_MASK_APPCACHE |
+ StoragePartition::REMOVE_DATA_MASK_INDEXEDDB));
+ EXPECT_EQ(removal_data.quota_storage_remove_mask,
+ static_cast<uint32>(
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL));
+ EXPECT_TRUE(removal_data.remove_origin.is_empty());
+
+ // Check that all related origin data would be removed, that is, origin
+ // matcher would match these origin.
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin1, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin2, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin3, mock_policy));
}
TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedDataForeverSpecificOrigin) {
- PopulateTestQuotaManagedData(GetMockManager());
-
// Remove Origin 1.
BlockUntilOriginDataRemoved(BrowsingDataRemover::EVERYTHING,
- BrowsingDataRemover::REMOVE_APPCACHE |
- BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
- BrowsingDataRemover::REMOVE_INDEXEDDB |
- BrowsingDataRemover::REMOVE_WEBSQL, kOrigin1);
+ BrowsingDataRemover::REMOVE_APPCACHE |
+ BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
+ BrowsingDataRemover::REMOVE_INDEXEDDB |
+ BrowsingDataRemover::REMOVE_WEBSQL,
+ kOrigin1);
EXPECT_EQ(BrowsingDataRemover::REMOVE_APPCACHE |
BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
BrowsingDataRemover::REMOVE_INDEXEDDB |
BrowsingDataRemover::REMOVE_WEBSQL, GetRemovalMask());
EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
- kClientFile));
- EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
- kClientFile));
- EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
- kClientFile));
- EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
- kClientFile));
+
+ // Verify storage partition related stuffs.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
+ StoragePartition::REMOVE_DATA_MASK_WEBSQL |
+ StoragePartition::REMOVE_DATA_MASK_APPCACHE |
+ StoragePartition::REMOVE_DATA_MASK_INDEXEDDB));
+ EXPECT_EQ(removal_data.quota_storage_remove_mask,
+ static_cast<uint32>(
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL));
+ EXPECT_EQ(removal_data.remove_origin, kOrigin1);
}
TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedDataForLastHour) {
- PopulateTestQuotaManagedData(GetMockManager());
-
BlockUntilBrowsingDataRemoved(BrowsingDataRemover::LAST_HOUR,
- BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
- BrowsingDataRemover::REMOVE_WEBSQL |
- BrowsingDataRemover::REMOVE_APPCACHE |
- BrowsingDataRemover::REMOVE_INDEXEDDB, false);
+ BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
+ BrowsingDataRemover::REMOVE_WEBSQL |
+ BrowsingDataRemover::REMOVE_APPCACHE |
+ BrowsingDataRemover::REMOVE_INDEXEDDB,
+ false);
EXPECT_EQ(BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
BrowsingDataRemover::REMOVE_WEBSQL |
BrowsingDataRemover::REMOVE_APPCACHE |
BrowsingDataRemover::REMOVE_INDEXEDDB, GetRemovalMask());
EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
- kClientFile));
- EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
- kClientFile));
- EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
- kClientFile));
- EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
- kClientFile));
+
+ // Verify storage partition related stuffs.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
+ StoragePartition::REMOVE_DATA_MASK_WEBSQL |
+ StoragePartition::REMOVE_DATA_MASK_APPCACHE |
+ StoragePartition::REMOVE_DATA_MASK_INDEXEDDB));
+
+ // Persistent data would be left out since we are not removing from
+ // beginning of time.
+ uint32 expected_quota_mask =
+ ~StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT;
+ EXPECT_EQ(removal_data.quota_storage_remove_mask, expected_quota_mask);
+ EXPECT_TRUE(removal_data.remove_origin.is_empty());
+ // Check removal begin time.
+ EXPECT_EQ(removal_data.remove_begin, GetBeginTime());
}
TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedDataForLastWeek) {
- PopulateTestQuotaManagedData(GetMockManager());
-
BlockUntilBrowsingDataRemoved(BrowsingDataRemover::LAST_WEEK,
- BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
- BrowsingDataRemover::REMOVE_WEBSQL |
- BrowsingDataRemover::REMOVE_APPCACHE |
- BrowsingDataRemover::REMOVE_INDEXEDDB, false);
+ BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
+ BrowsingDataRemover::REMOVE_WEBSQL |
+ BrowsingDataRemover::REMOVE_APPCACHE |
+ BrowsingDataRemover::REMOVE_INDEXEDDB,
+ false);
EXPECT_EQ(BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
BrowsingDataRemover::REMOVE_WEBSQL |
BrowsingDataRemover::REMOVE_APPCACHE |
BrowsingDataRemover::REMOVE_INDEXEDDB, GetRemovalMask());
EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
- kClientFile));
- EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
- kClientFile));
- EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
- kClientFile));
+
+ // Verify storage partition related stuffs.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
+ StoragePartition::REMOVE_DATA_MASK_WEBSQL |
+ StoragePartition::REMOVE_DATA_MASK_APPCACHE |
+ StoragePartition::REMOVE_DATA_MASK_INDEXEDDB));
+
+ // Persistent data would be left out since we are not removing from
+ // beginning of time.
+ uint32 expected_quota_mask =
+ ~StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT;
+ EXPECT_EQ(removal_data.quota_storage_remove_mask, expected_quota_mask);
+ EXPECT_TRUE(removal_data.remove_origin.is_empty());
+ // Check removal begin time.
+ EXPECT_EQ(removal_data.remove_begin, GetBeginTime());
}
TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedUnprotectedOrigins) {
@@ -1193,31 +1310,38 @@ TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedUnprotectedOrigins) {
mock_policy->AddProtected(kOrigin1.GetOrigin());
GetProfile()->SetExtensionSpecialStoragePolicy(mock_policy.get());
- PopulateTestQuotaManagedData(GetMockManager());
-
BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING,
- BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
- BrowsingDataRemover::REMOVE_WEBSQL |
- BrowsingDataRemover::REMOVE_APPCACHE |
- BrowsingDataRemover::REMOVE_INDEXEDDB, false);
+ BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
+ BrowsingDataRemover::REMOVE_WEBSQL |
+ BrowsingDataRemover::REMOVE_APPCACHE |
+ BrowsingDataRemover::REMOVE_INDEXEDDB,
+ false);
EXPECT_EQ(BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
BrowsingDataRemover::REMOVE_WEBSQL |
BrowsingDataRemover::REMOVE_APPCACHE |
BrowsingDataRemover::REMOVE_INDEXEDDB, GetRemovalMask());
EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
- EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
- kClientFile));
+
+ // Verify storage partition related stuffs.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
+ StoragePartition::REMOVE_DATA_MASK_WEBSQL |
+ StoragePartition::REMOVE_DATA_MASK_APPCACHE |
+ StoragePartition::REMOVE_DATA_MASK_INDEXEDDB));
+ EXPECT_EQ(removal_data.quota_storage_remove_mask,
+ static_cast<uint32>(
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL));
+ EXPECT_TRUE(removal_data.remove_origin.is_empty());
+
+ // Check OriginMatcherFunction, |kOrigin1| would not match mask since it
+ // is protected.
+ EXPECT_FALSE(removal_data.origin_matcher.Run(kOrigin1, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin2, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin3, mock_policy));
}
TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedProtectedSpecificOrigin) {
@@ -1227,32 +1351,39 @@ TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedProtectedSpecificOrigin) {
mock_policy->AddProtected(kOrigin1.GetOrigin());
GetProfile()->SetExtensionSpecialStoragePolicy(mock_policy.get());
- PopulateTestQuotaManagedData(GetMockManager());
-
// Try to remove kOrigin1. Expect failure.
BlockUntilOriginDataRemoved(BrowsingDataRemover::EVERYTHING,
- BrowsingDataRemover::REMOVE_APPCACHE |
- BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
- BrowsingDataRemover::REMOVE_INDEXEDDB |
- BrowsingDataRemover::REMOVE_WEBSQL, kOrigin1);
+ BrowsingDataRemover::REMOVE_APPCACHE |
+ BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
+ BrowsingDataRemover::REMOVE_INDEXEDDB |
+ BrowsingDataRemover::REMOVE_WEBSQL,
+ kOrigin1);
EXPECT_EQ(BrowsingDataRemover::REMOVE_APPCACHE |
BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
BrowsingDataRemover::REMOVE_INDEXEDDB |
BrowsingDataRemover::REMOVE_WEBSQL, GetRemovalMask());
EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
- EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
- kClientFile));
- EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
- kClientFile));
- EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
- kClientFile));
- EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
- kClientFile));
+
+ // Verify storage partition related stuffs.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
+ StoragePartition::REMOVE_DATA_MASK_WEBSQL |
+ StoragePartition::REMOVE_DATA_MASK_APPCACHE |
+ StoragePartition::REMOVE_DATA_MASK_INDEXEDDB));
+ EXPECT_EQ(removal_data.quota_storage_remove_mask,
+ static_cast<uint32>(
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL));
+ EXPECT_EQ(removal_data.remove_origin, kOrigin1);
+
+ // Check OriginMatcherFunction, |kOrigin1| would not match mask since it
+ // is protected.
+ EXPECT_FALSE(removal_data.origin_matcher.Run(kOrigin1, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin2, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin3, mock_policy));
}
TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedProtectedOrigins) {
@@ -1262,14 +1393,13 @@ TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedProtectedOrigins) {
mock_policy->AddProtected(kOrigin1.GetOrigin());
GetProfile()->SetExtensionSpecialStoragePolicy(mock_policy.get());
- PopulateTestQuotaManagedData(GetMockManager());
-
// Try to remove kOrigin1. Expect success.
BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING,
- BrowsingDataRemover::REMOVE_APPCACHE |
- BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
- BrowsingDataRemover::REMOVE_INDEXEDDB |
- BrowsingDataRemover::REMOVE_WEBSQL, true);
+ BrowsingDataRemover::REMOVE_APPCACHE |
+ BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
+ BrowsingDataRemover::REMOVE_INDEXEDDB |
+ BrowsingDataRemover::REMOVE_WEBSQL,
+ true);
EXPECT_EQ(BrowsingDataRemover::REMOVE_APPCACHE |
BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
@@ -1277,28 +1407,39 @@ TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedProtectedOrigins) {
BrowsingDataRemover::REMOVE_WEBSQL, GetRemovalMask());
EXPECT_EQ(BrowsingDataHelper::PROTECTED_WEB |
BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
- kClientFile));
- EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
- kClientFile));
+
+ // Verify storage partition related stuffs.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
+ StoragePartition::REMOVE_DATA_MASK_WEBSQL |
+ StoragePartition::REMOVE_DATA_MASK_APPCACHE |
+ StoragePartition::REMOVE_DATA_MASK_INDEXEDDB));
+ EXPECT_EQ(removal_data.quota_storage_remove_mask,
+ static_cast<uint32>(
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL));
+ EXPECT_TRUE(removal_data.remove_origin.is_empty());
+
+ // Check OriginMatcherFunction, |kOrigin1| would match mask since we
+ // would have 'protected' specified in origin_set_mask.
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin1, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin2, mock_policy));
+ EXPECT_TRUE(removal_data.origin_matcher.Run(kOrigin3, mock_policy));
}
TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedIgnoreExtensionsAndDevTools) {
- PopulateTestQuotaManagedNonBrowsingData(GetMockManager());
+ scoped_refptr<MockExtensionSpecialStoragePolicy> mock_policy =
+ new MockExtensionSpecialStoragePolicy;
+ GetProfile()->SetExtensionSpecialStoragePolicy(mock_policy.get());
BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING,
- BrowsingDataRemover::REMOVE_APPCACHE |
- BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
- BrowsingDataRemover::REMOVE_INDEXEDDB |
- BrowsingDataRemover::REMOVE_WEBSQL, false);
+ BrowsingDataRemover::REMOVE_APPCACHE |
+ BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
+ BrowsingDataRemover::REMOVE_INDEXEDDB |
+ BrowsingDataRemover::REMOVE_WEBSQL,
+ false);
EXPECT_EQ(BrowsingDataRemover::REMOVE_APPCACHE |
BrowsingDataRemover::REMOVE_FILE_SYSTEMS |
@@ -1306,15 +1447,24 @@ TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedIgnoreExtensionsAndDevTools) {
BrowsingDataRemover::REMOVE_WEBSQL, GetRemovalMask());
EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask());
- // Check that extension and devtools data isn't removed.
- EXPECT_TRUE(GetMockManager()->OriginHasData(kOriginExt, kTemporary,
- kClientFile));
- EXPECT_TRUE(GetMockManager()->OriginHasData(kOriginExt, kPersistent,
- kClientFile));
- EXPECT_TRUE(GetMockManager()->OriginHasData(kOriginDevTools, kTemporary,
- kClientFile));
- EXPECT_TRUE(GetMockManager()->OriginHasData(kOriginDevTools, kPersistent,
- kClientFile));
+ // Verify storage partition related stuffs.
+ StoragePartitionRemovalData removal_data = GetStoragePartitionRemovalData();
+
+ EXPECT_EQ(removal_data.remove_mask,
+ static_cast<uint32>(
+ StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
+ StoragePartition::REMOVE_DATA_MASK_WEBSQL |
+ StoragePartition::REMOVE_DATA_MASK_APPCACHE |
+ StoragePartition::REMOVE_DATA_MASK_INDEXEDDB));
+ EXPECT_EQ(removal_data.quota_storage_remove_mask,
+ static_cast<uint32>(
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL));
+ EXPECT_TRUE(removal_data.remove_origin.is_empty());
+
+ // Check that extension and devtools data wouldn't be removed, that is,
+ // origin matcher would not match these origin.
+ EXPECT_FALSE(removal_data.origin_matcher.Run(kOriginExt, mock_policy));
+ EXPECT_FALSE(removal_data.origin_matcher.Run(kOriginDevTools, mock_policy));
}
TEST_F(BrowsingDataRemoverTest, OriginBasedHistoryRemoval) {
diff --git a/chrome/browser/guestview/webview/webview_guest.cc b/chrome/browser/guestview/webview/webview_guest.cc
index dda5729..9e7cd62 100644
--- a/chrome/browser/guestview/webview/webview_guest.cc
+++ b/chrome/browser/guestview/webview/webview_guest.cc
@@ -439,9 +439,11 @@ bool WebViewGuest::ClearData(const base::Time remove_since,
if (!partition)
return false;
- partition->ClearDataForRange(
+ partition->ClearData(
removal_mask,
content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
+ NULL,
+ content::StoragePartition::OriginMatcherFunction(),
remove_since,
base::Time::Now(),
callback);
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index e984e61..6d92f58 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -28,21 +28,6 @@ namespace content {
namespace {
-int GenerateQuotaClientMask(uint32 remove_mask) {
- int quota_client_mask = 0;
-
- if (remove_mask & StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS)
- quota_client_mask |= quota::QuotaClient::kFileSystem;
- if (remove_mask & StoragePartition::REMOVE_DATA_MASK_WEBSQL)
- quota_client_mask |= quota::QuotaClient::kDatabase;
- if (remove_mask & StoragePartition::REMOVE_DATA_MASK_APPCACHE)
- quota_client_mask |= quota::QuotaClient::kAppcache;
- if (remove_mask & StoragePartition::REMOVE_DATA_MASK_INDEXEDDB)
- quota_client_mask |= quota::QuotaClient::kIndexedDatabase;
-
- return quota_client_mask;
-}
-
void OnClearedCookies(const base::Closure& callback, int num_deleted) {
// The final callback needs to happen from UI thread.
if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
@@ -77,51 +62,29 @@ void ClearCookiesOnIOThread(
}
}
+void CheckQuotaManagedDataDeletionStatus(size_t* deletion_task_count,
+ const base::Closure& callback) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ if (*deletion_task_count == 0) {
+ delete deletion_task_count;
+ callback.Run();
+ }
+}
+
void OnQuotaManagedOriginDeleted(const GURL& origin,
quota::StorageType type,
- size_t* origins_to_delete_count,
+ size_t* deletion_task_count,
const base::Closure& callback,
quota::QuotaStatusCode status) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- DCHECK_GT(*origins_to_delete_count, 0u);
+ DCHECK_GT(*deletion_task_count, 0u);
if (status != quota::kQuotaStatusOk) {
DLOG(ERROR) << "Couldn't remove data of type " << type << " for origin "
<< origin << ". Status: " << status;
}
- (*origins_to_delete_count)--;
- if (*origins_to_delete_count == 0) {
- delete origins_to_delete_count;
- callback.Run();
- }
-}
-
-void ClearQuotaManagedOriginsOnIOThread(quota::QuotaManager* quota_manager,
- uint32 remove_mask,
- const base::Closure& callback,
- const std::set<GURL>& origins,
- quota::StorageType quota_storage_type) {
- // The QuotaManager manages all storage other than cookies, LocalStorage,
- // and SessionStorage. This loop wipes out most HTML5 storage for the given
- // origins.
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
-
- if (!origins.size()) {
- // No origins to clear.
- callback.Run();
- return;
- }
-
- size_t* origins_to_delete_count = new size_t(origins.size());
- for (std::set<GURL>::const_iterator origin = origins.begin();
- origin != origins.end(); ++origin) {
- quota_manager->DeleteOriginData(
- *origin, quota_storage_type,
- GenerateQuotaClientMask(remove_mask),
- base::Bind(&OnQuotaManagedOriginDeleted,
- origin->GetOrigin(), quota_storage_type,
- origins_to_delete_count, callback));
- }
+ (*deletion_task_count)--;
+ CheckQuotaManagedDataDeletionStatus(deletion_task_count, callback);
}
void ClearedShaderCache(const base::Closure& callback) {
@@ -145,6 +108,8 @@ void ClearShaderCacheOnIOThread(const base::FilePath& path,
void OnLocalStorageUsageInfo(
const scoped_refptr<DOMStorageContextWrapper>& dom_storage_context,
+ const scoped_refptr<quota::SpecialStoragePolicy>& special_storage_policy,
+ const StoragePartition::OriginMatcherFunction& origin_matcher,
const base::Time delete_begin,
const base::Time delete_end,
const base::Closure& callback,
@@ -152,6 +117,11 @@ void OnLocalStorageUsageInfo(
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
for (size_t i = 0; i < infos.size(); ++i) {
+ if (!origin_matcher.is_null() &&
+ !origin_matcher.Run(infos[i].origin, special_storage_policy.get())) {
+ continue;
+ }
+
if (infos[i].last_modified >= delete_begin &&
infos[i].last_modified <= delete_end) {
dom_storage_context->DeleteLocalStorage(infos[i].origin);
@@ -162,18 +132,27 @@ void OnLocalStorageUsageInfo(
void OnSessionStorageUsageInfo(
const scoped_refptr<DOMStorageContextWrapper>& dom_storage_context,
+ const scoped_refptr<quota::SpecialStoragePolicy>& special_storage_policy,
+ const StoragePartition::OriginMatcherFunction& origin_matcher,
const base::Closure& callback,
const std::vector<SessionStorageUsageInfo>& infos) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- for (size_t i = 0; i < infos.size(); ++i)
+ for (size_t i = 0; i < infos.size(); ++i) {
+ if (!origin_matcher.is_null() &&
+ !origin_matcher.Run(infos[i].origin, special_storage_policy.get())) {
+ continue;
+ }
dom_storage_context->DeleteSessionStorage(infos[i]);
+ }
callback.Run();
}
void ClearLocalStorageOnUIThread(
const scoped_refptr<DOMStorageContextWrapper>& dom_storage_context,
+ const scoped_refptr<quota::SpecialStoragePolicy>& special_storage_policy,
+ const StoragePartition::OriginMatcherFunction& origin_matcher,
const GURL& remove_origin,
const base::Time begin,
const base::Time end,
@@ -181,33 +160,66 @@ void ClearLocalStorageOnUIThread(
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
if (!remove_origin.is_empty()) {
- dom_storage_context->DeleteLocalStorage(remove_origin);
+ bool can_delete = origin_matcher.is_null() ||
+ origin_matcher.Run(remove_origin,
+ special_storage_policy.get());
+ if (can_delete)
+ dom_storage_context->DeleteLocalStorage(remove_origin);
+
callback.Run();
return;
}
dom_storage_context->GetLocalStorageUsage(
base::Bind(&OnLocalStorageUsageInfo,
- dom_storage_context, begin, end, callback));
+ dom_storage_context, special_storage_policy, origin_matcher,
+ begin, end, callback));
}
void ClearSessionStorageOnUIThread(
const scoped_refptr<DOMStorageContextWrapper>& dom_storage_context,
+ const scoped_refptr<quota::SpecialStoragePolicy>& special_storage_policy,
+ const StoragePartition::OriginMatcherFunction& origin_matcher,
const base::Closure& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
dom_storage_context->GetSessionStorageUsage(
- base::Bind(&OnSessionStorageUsageInfo, dom_storage_context, callback));
+ base::Bind(&OnSessionStorageUsageInfo, dom_storage_context,
+ special_storage_policy, origin_matcher,
+ callback));
}
} // namespace
+// Static.
+int StoragePartitionImpl::GenerateQuotaClientMask(uint32 remove_mask) {
+ int quota_client_mask = 0;
+
+ if (remove_mask & StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS)
+ quota_client_mask |= quota::QuotaClient::kFileSystem;
+ if (remove_mask & StoragePartition::REMOVE_DATA_MASK_WEBSQL)
+ quota_client_mask |= quota::QuotaClient::kDatabase;
+ if (remove_mask & StoragePartition::REMOVE_DATA_MASK_APPCACHE)
+ quota_client_mask |= quota::QuotaClient::kAppcache;
+ if (remove_mask & StoragePartition::REMOVE_DATA_MASK_INDEXEDDB)
+ quota_client_mask |= quota::QuotaClient::kIndexedDatabase;
+
+ return quota_client_mask;
+}
+
// Helper for deleting quota managed data from a partition.
//
// Most of the operations in this class are done on IO thread.
struct StoragePartitionImpl::QuotaManagedDataDeletionHelper {
- QuotaManagedDataDeletionHelper(const base::Closure& callback)
- : callback(callback), task_count(0) {
+ QuotaManagedDataDeletionHelper(uint32 remove_mask,
+ uint32 quota_storage_remove_mask,
+ const GURL& remove_origin,
+ const base::Closure& callback)
+ : remove_mask(remove_mask),
+ quota_storage_remove_mask(quota_storage_remove_mask),
+ remove_origin(remove_origin),
+ callback(callback),
+ task_count(0) {
}
void IncrementTaskCountOnIO();
@@ -216,13 +228,22 @@ struct StoragePartitionImpl::QuotaManagedDataDeletionHelper {
void ClearDataOnIOThread(
const scoped_refptr<quota::QuotaManager>& quota_manager,
const base::Time begin,
- uint32 remove_mask,
- uint32 quota_storage_remove_mask,
- const GURL& remove_origin);
-
- // Accessed on IO thread.
+ const scoped_refptr<quota::SpecialStoragePolicy>& special_storage_policy,
+ const StoragePartition::OriginMatcherFunction& origin_matcher);
+
+ void ClearOriginsOnIOThread(
+ quota::QuotaManager* quota_manager,
+ const scoped_refptr<quota::SpecialStoragePolicy>& special_storage_policy,
+ const StoragePartition::OriginMatcherFunction& origin_matcher,
+ const base::Closure& callback,
+ const std::set<GURL>& origins,
+ quota::StorageType quota_storage_type);
+
+ // All of these data are accessed on IO thread.
+ uint32 remove_mask;
+ uint32 quota_storage_remove_mask;
+ GURL remove_origin;
const base::Closure callback;
- // Accessed on IO thread.
int task_count;
};
@@ -237,43 +258,63 @@ struct StoragePartitionImpl::QuotaManagedDataDeletionHelper {
// forwarded and updated on each (sub) deletion's callback. The instance is
// finally destroyed when deletion completes (and |callback| is invoked).
struct StoragePartitionImpl::DataDeletionHelper {
- DataDeletionHelper(const base::Closure& callback)
- : callback(callback), task_count(0) {
+ DataDeletionHelper(uint32 remove_mask,
+ uint32 quota_storage_remove_mask,
+ const base::Closure& callback)
+ : remove_mask(remove_mask),
+ quota_storage_remove_mask(quota_storage_remove_mask),
+ callback(callback),
+ task_count(0) {
}
void IncrementTaskCountOnUI();
void DecrementTaskCountOnUI();
- void ClearDataOnUIThread(uint32 remove_mask,
- uint32 quota_storage_remove_mask,
- const GURL& remove_origin,
+ void ClearDataOnUIThread(const GURL* remove_origin,
+ const OriginMatcherFunction& origin_matcher,
const base::FilePath& path,
net::URLRequestContextGetter* rq_context,
DOMStorageContextWrapper* dom_storage_context,
quota::QuotaManager* quota_manager,
+ quota::SpecialStoragePolicy* special_storage_policy,
WebRTCIdentityStore* webrtc_identity_store,
const base::Time begin,
const base::Time end);
+ void ClearQuotaManagedDataOnIOThread(
+ const scoped_refptr<quota::QuotaManager>& quota_manager,
+ const base::Time begin,
+ const GURL& remove_origin,
+ const scoped_refptr<quota::SpecialStoragePolicy>& special_storage_policy,
+ const StoragePartition::OriginMatcherFunction& origin_matcher,
+ const base::Closure& callback);
+
+ uint32 remove_mask;
+ uint32 quota_storage_remove_mask;
+
// Accessed on UI thread.
const base::Closure callback;
// Accessed on UI thread.
int task_count;
};
-void ClearQuotaManagedDataOnIOThread(
+void StoragePartitionImpl::DataDeletionHelper::ClearQuotaManagedDataOnIOThread(
const scoped_refptr<quota::QuotaManager>& quota_manager,
const base::Time begin,
- uint32 remove_mask,
- uint32 quota_storage_remove_mask,
const GURL& remove_origin,
+ const scoped_refptr<quota::SpecialStoragePolicy>& special_storage_policy,
+ const StoragePartition::OriginMatcherFunction& origin_matcher,
const base::Closure& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
StoragePartitionImpl::QuotaManagedDataDeletionHelper* helper =
- new StoragePartitionImpl::QuotaManagedDataDeletionHelper(callback);
- helper->ClearDataOnIOThread(quota_manager, begin,
- remove_mask, quota_storage_remove_mask, remove_origin);
+ new StoragePartitionImpl::QuotaManagedDataDeletionHelper(
+ remove_mask,
+ quota_storage_remove_mask,
+ remove_origin,
+ callback);
+ helper->ClearDataOnIOThread(quota_manager, begin, special_storage_policy,
+ origin_matcher);
}
StoragePartitionImpl::StoragePartitionImpl(
@@ -285,7 +326,8 @@ StoragePartitionImpl::StoragePartitionImpl(
DOMStorageContextWrapper* dom_storage_context,
IndexedDBContextImpl* indexed_db_context,
ServiceWorkerContext* service_worker_context,
- WebRTCIdentityStore* webrtc_identity_store)
+ WebRTCIdentityStore* webrtc_identity_store,
+ quota::SpecialStoragePolicy* special_storage_policy)
: partition_path_(partition_path),
quota_manager_(quota_manager),
appcache_service_(appcache_service),
@@ -294,7 +336,8 @@ StoragePartitionImpl::StoragePartitionImpl(
dom_storage_context_(dom_storage_context),
indexed_db_context_(indexed_db_context),
service_worker_context_(service_worker_context),
- webrtc_identity_store_(webrtc_identity_store) {}
+ webrtc_identity_store_(webrtc_identity_store),
+ special_storage_policy_(special_storage_policy) {}
StoragePartitionImpl::~StoragePartitionImpl() {
// These message loop checks are just to avoid leaks in unittests.
@@ -378,6 +421,9 @@ StoragePartitionImpl* StoragePartitionImpl::Create(
scoped_refptr<WebRTCIdentityStore> webrtc_identity_store(
new WebRTCIdentityStore(path, context->GetSpecialStoragePolicy()));
+ scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy(
+ context->GetSpecialStoragePolicy());
+
return new StoragePartitionImpl(partition_path,
quota_manager.get(),
appcache_service.get(),
@@ -386,7 +432,8 @@ StoragePartitionImpl* StoragePartitionImpl::Create(
dom_storage_context.get(),
indexed_db_context.get(),
service_worker_context.get(),
- webrtc_identity_store.get());
+ webrtc_identity_store.get(),
+ special_storage_policy.get());
}
base::FilePath StoragePartitionImpl::GetPath() {
@@ -433,19 +480,22 @@ ServiceWorkerContext* StoragePartitionImpl::GetServiceWorkerContext() {
void StoragePartitionImpl::ClearDataImpl(
uint32 remove_mask,
uint32 quota_storage_remove_mask,
- const GURL& remove_origin,
+ const GURL* remove_origin,
+ const OriginMatcherFunction& origin_matcher,
net::URLRequestContextGetter* rq_context,
const base::Time begin,
const base::Time end,
const base::Closure& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- DataDeletionHelper* helper = new DataDeletionHelper(callback);
+ DataDeletionHelper* helper = new DataDeletionHelper(remove_mask,
+ quota_storage_remove_mask,
+ callback);
// |helper| deletes itself when done in
// DataDeletionHelper::DecrementTaskCountOnUI().
- helper->ClearDataOnUIThread(
- remove_mask, quota_storage_remove_mask, remove_origin,
- GetPath(), rq_context, dom_storage_context_, quota_manager_,
- webrtc_identity_store_, begin, end);
+ helper->ClearDataOnUIThread(remove_origin, origin_matcher, GetPath(),
+ rq_context, dom_storage_context_, quota_manager_,
+ special_storage_policy_.get(),
+ webrtc_identity_store_, begin, end);
}
void StoragePartitionImpl::
@@ -469,13 +519,8 @@ void StoragePartitionImpl::
void StoragePartitionImpl::QuotaManagedDataDeletionHelper::ClearDataOnIOThread(
const scoped_refptr<quota::QuotaManager>& quota_manager,
const base::Time begin,
- uint32 remove_mask,
- uint32 quota_storage_remove_mask,
- const GURL& remove_origin) {
- std::set<GURL> origins;
- if (!remove_origin.is_empty())
- origins.insert(remove_origin);
-
+ const scoped_refptr<quota::SpecialStoragePolicy>& special_storage_policy,
+ const StoragePartition::OriginMatcherFunction& origin_matcher) {
IncrementTaskCountOnIO();
base::Closure decrement_callback = base::Bind(
&QuotaManagedDataDeletionHelper::DecrementTaskCountOnIO,
@@ -483,54 +528,92 @@ void StoragePartitionImpl::QuotaManagedDataDeletionHelper::ClearDataOnIOThread(
if (quota_storage_remove_mask & QUOTA_MANAGED_STORAGE_MASK_PERSISTENT) {
IncrementTaskCountOnIO();
- if (origins.empty()) { // Remove for all origins.
- // Ask the QuotaManager for all origins with temporary quota modified
- // within the user-specified timeframe, and deal with the resulting set in
- // ClearQuotaManagedOriginsOnIOThread().
- quota_manager->GetOriginsModifiedSince(
- quota::kStorageTypePersistent, begin,
- base::Bind(&ClearQuotaManagedOriginsOnIOThread,
- quota_manager, remove_mask, decrement_callback));
- } else {
- ClearQuotaManagedOriginsOnIOThread(
- quota_manager, remove_mask, decrement_callback,
- origins, quota::kStorageTypePersistent);
- }
+ // Ask the QuotaManager for all origins with persistent quota modified
+ // within the user-specified timeframe, and deal with the resulting set in
+ // ClearQuotaManagedOriginsOnIOThread().
+ quota_manager->GetOriginsModifiedSince(
+ quota::kStorageTypePersistent, begin,
+ base::Bind(&QuotaManagedDataDeletionHelper::ClearOriginsOnIOThread,
+ base::Unretained(this),
+ quota_manager,
+ special_storage_policy,
+ origin_matcher,
+ decrement_callback));
}
// Do the same for temporary quota.
if (quota_storage_remove_mask & QUOTA_MANAGED_STORAGE_MASK_TEMPORARY) {
IncrementTaskCountOnIO();
- if (origins.empty()) { // Remove for all origins.
- quota_manager->GetOriginsModifiedSince(
- quota::kStorageTypeTemporary, begin,
- base::Bind(&ClearQuotaManagedOriginsOnIOThread,
- quota_manager, remove_mask, decrement_callback));
- } else {
- ClearQuotaManagedOriginsOnIOThread(
- quota_manager, remove_mask, decrement_callback,
- origins, quota::kStorageTypeTemporary);
- }
+ quota_manager->GetOriginsModifiedSince(
+ quota::kStorageTypeTemporary, begin,
+ base::Bind(&QuotaManagedDataDeletionHelper::ClearOriginsOnIOThread,
+ base::Unretained(this),
+ quota_manager,
+ special_storage_policy,
+ origin_matcher,
+ decrement_callback));
}
// Do the same for syncable quota.
if (quota_storage_remove_mask & QUOTA_MANAGED_STORAGE_MASK_SYNCABLE) {
IncrementTaskCountOnIO();
- if (origins.empty()) { // Remove for all origins.
- quota_manager->GetOriginsModifiedSince(
- quota::kStorageTypeSyncable, begin,
- base::Bind(&ClearQuotaManagedOriginsOnIOThread,
- quota_manager, remove_mask, decrement_callback));
- } else {
- ClearQuotaManagedOriginsOnIOThread(
- quota_manager, remove_mask, decrement_callback,
- origins, quota::kStorageTypeSyncable);
- }
+ quota_manager->GetOriginsModifiedSince(
+ quota::kStorageTypeSyncable, begin,
+ base::Bind(&QuotaManagedDataDeletionHelper::ClearOriginsOnIOThread,
+ base::Unretained(this),
+ quota_manager,
+ special_storage_policy,
+ origin_matcher,
+ decrement_callback));
}
DecrementTaskCountOnIO();
}
+void StoragePartitionImpl::
+ QuotaManagedDataDeletionHelper::ClearOriginsOnIOThread(
+ quota::QuotaManager* quota_manager,
+ const scoped_refptr<quota::SpecialStoragePolicy>&
+ special_storage_policy,
+ const StoragePartition::OriginMatcherFunction& origin_matcher,
+ const base::Closure& callback,
+ const std::set<GURL>& origins,
+ quota::StorageType quota_storage_type) {
+ // The QuotaManager manages all storage other than cookies, LocalStorage,
+ // and SessionStorage. This loop wipes out most HTML5 storage for the given
+ // origins.
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ if (!origins.size()) {
+ callback.Run();
+ return;
+ }
+
+ size_t* deletion_task_count = new size_t(0u);
+ (*deletion_task_count)++;
+ for (std::set<GURL>::const_iterator origin = origins.begin();
+ origin != origins.end(); ++origin) {
+ // TODO(mkwst): Clean this up, it's slow. http://crbug.com/130746
+ if (!remove_origin.is_empty() && origin->GetOrigin() != remove_origin)
+ continue;
+
+ if (!origin_matcher.is_null() &&
+ !origin_matcher.Run(*origin, special_storage_policy.get())) {
+ continue;
+ }
+
+ (*deletion_task_count)++;
+ quota_manager->DeleteOriginData(
+ *origin, quota_storage_type,
+ StoragePartitionImpl::GenerateQuotaClientMask(remove_mask),
+ base::Bind(&OnQuotaManagedOriginDeleted,
+ origin->GetOrigin(), quota_storage_type,
+ deletion_task_count, callback));
+ }
+ (*deletion_task_count)--;
+
+ CheckQuotaManagedDataDeletionStatus(deletion_task_count, callback);
+}
+
void StoragePartitionImpl::DataDeletionHelper::IncrementTaskCountOnUI() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
++task_count;
@@ -553,13 +636,13 @@ void StoragePartitionImpl::DataDeletionHelper::DecrementTaskCountOnUI() {
}
void StoragePartitionImpl::DataDeletionHelper::ClearDataOnUIThread(
- uint32 remove_mask,
- uint32 quota_storage_remove_mask,
- const GURL& remove_origin,
+ const GURL* remove_origin,
+ const OriginMatcherFunction& origin_matcher,
const base::FilePath& path,
net::URLRequestContextGetter* rq_context,
DOMStorageContextWrapper* dom_storage_context,
quota::QuotaManager* quota_manager,
+ quota::SpecialStoragePolicy* special_storage_policy,
WebRTCIdentityStore* webrtc_identity_store,
const base::Time begin,
const base::Time end) {
@@ -570,13 +653,14 @@ void StoragePartitionImpl::DataDeletionHelper::ClearDataOnUIThread(
base::Closure decrement_callback = base::Bind(
&DataDeletionHelper::DecrementTaskCountOnUI, base::Unretained(this));
+ GURL origin = remove_origin ? *remove_origin : GURL();
if (remove_mask & REMOVE_DATA_MASK_COOKIES) {
// Handle the cookies.
IncrementTaskCountOnUI();
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::Bind(&ClearCookiesOnIOThread,
- make_scoped_refptr(rq_context), begin, end, remove_origin,
+ make_scoped_refptr(rq_context), begin, end, origin,
decrement_callback));
}
@@ -587,9 +671,13 @@ void StoragePartitionImpl::DataDeletionHelper::ClearDataOnUIThread(
IncrementTaskCountOnUI();
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
- base::Bind(&ClearQuotaManagedDataOnIOThread,
- make_scoped_refptr(quota_manager), begin,
- remove_mask, quota_storage_remove_mask, remove_origin,
+ base::Bind(&DataDeletionHelper::ClearQuotaManagedDataOnIOThread,
+ base::Unretained(this),
+ make_scoped_refptr(quota_manager),
+ begin,
+ origin,
+ make_scoped_refptr(special_storage_policy),
+ origin_matcher,
decrement_callback));
}
@@ -597,15 +685,21 @@ void StoragePartitionImpl::DataDeletionHelper::ClearDataOnUIThread(
IncrementTaskCountOnUI();
ClearLocalStorageOnUIThread(
make_scoped_refptr(dom_storage_context),
- remove_origin, begin, end, decrement_callback);
+ make_scoped_refptr(special_storage_policy),
+ origin_matcher,
+ origin, begin, end,
+ decrement_callback);
// ClearDataImpl cannot clear session storage data when a particular origin
// is specified. Therefore we ignore clearing session storage in this case.
// TODO(lazyboy): Fix.
- if (remove_origin.is_empty()) {
+ if (origin.is_empty()) {
IncrementTaskCountOnUI();
ClearSessionStorageOnUIThread(
- make_scoped_refptr(dom_storage_context), decrement_callback);
+ make_scoped_refptr(dom_storage_context),
+ make_scoped_refptr(special_storage_policy),
+ origin_matcher,
+ decrement_callback);
}
}
@@ -639,32 +733,37 @@ void StoragePartitionImpl::ClearDataForOrigin(
const GURL& storage_origin,
net::URLRequestContextGetter* request_context_getter) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- ClearDataImpl(remove_mask, quota_storage_remove_mask, storage_origin,
- request_context_getter, base::Time(), base::Time::Max(),
- base::Bind(&base::DoNothing));
+ ClearDataImpl(remove_mask, quota_storage_remove_mask, &storage_origin,
+ OriginMatcherFunction(), request_context_getter,
+ base::Time(), base::Time::Max(), base::Bind(&base::DoNothing));
}
-void StoragePartitionImpl::ClearDataForUnboundedRange(
+void StoragePartitionImpl::ClearData(
uint32 remove_mask,
- uint32 quota_storage_remove_mask) {
- ClearDataImpl(remove_mask, quota_storage_remove_mask, GURL(),
- GetURLRequestContext(), base::Time(), base::Time::Max(),
- base::Bind(&base::DoNothing));
-}
-
-void StoragePartitionImpl::ClearDataForRange(uint32 remove_mask,
- uint32 quota_storage_remove_mask,
- const base::Time& begin,
- const base::Time& end,
- const base::Closure& callback) {
- ClearDataImpl(remove_mask, quota_storage_remove_mask, GURL(),
- GetURLRequestContext(), begin, end, callback);
+ uint32 quota_storage_remove_mask,
+ const GURL* storage_origin,
+ const OriginMatcherFunction& origin_matcher,
+ const base::Time begin,
+ const base::Time end,
+ const base::Closure& callback) {
+ ClearDataImpl(remove_mask, quota_storage_remove_mask, storage_origin,
+ origin_matcher, GetURLRequestContext(), begin, end, callback);
}
WebRTCIdentityStore* StoragePartitionImpl::GetWebRTCIdentityStore() {
return webrtc_identity_store_.get();
}
+void StoragePartitionImpl::OverrideQuotaManagerForTesting(
+ quota::QuotaManager* quota_manager) {
+ quota_manager_ = quota_manager;
+}
+
+void StoragePartitionImpl::OverrideSpecialStoragePolicyForTesting(
+ quota::SpecialStoragePolicy* special_storage_policy) {
+ special_storage_policy_ = special_storage_policy;
+}
+
void StoragePartitionImpl::SetURLRequestContext(
net::URLRequestContextGetter* url_request_context) {
url_request_context_ = url_request_context;
diff --git a/content/browser/storage_partition_impl.h b/content/browser/storage_partition_impl.h
index 87130e1..7dfce5e 100644
--- a/content/browser/storage_partition_impl.h
+++ b/content/browser/storage_partition_impl.h
@@ -15,6 +15,7 @@
#include "content/browser/service_worker/service_worker_context.h"
#include "content/common/content_export.h"
#include "content/public/browser/storage_partition.h"
+#include "webkit/browser/quota/special_storage_policy.h"
namespace content {
@@ -22,6 +23,15 @@ class StoragePartitionImpl : public StoragePartition {
public:
CONTENT_EXPORT virtual ~StoragePartitionImpl();
+ // Quota managed data uses a different bitmask for types than
+ // StoragePartition uses. This method generates that mask.
+ CONTENT_EXPORT static int GenerateQuotaClientMask(uint32 remove_mask);
+
+ CONTENT_EXPORT void OverrideQuotaManagerForTesting(
+ quota::QuotaManager* quota_manager);
+ CONTENT_EXPORT void OverrideSpecialStoragePolicyForTesting(
+ quota::SpecialStoragePolicy* special_storage_policy);
+
// StoragePartition interface.
virtual base::FilePath GetPath() OVERRIDE;
virtual net::URLRequestContextGetter* GetURLRequestContext() OVERRIDE;
@@ -38,14 +48,13 @@ class StoragePartitionImpl : public StoragePartition {
uint32 quota_storage_remove_mask,
const GURL& storage_origin,
net::URLRequestContextGetter* request_context_getter) OVERRIDE;
- virtual void ClearDataForUnboundedRange(
- uint32 remove_mask,
- uint32 quota_storage_remove_mask) OVERRIDE;
- virtual void ClearDataForRange(uint32 remove_mask,
- uint32 quota_storage_remove_mask,
- const base::Time& begin,
- const base::Time& end,
- const base::Closure& callback) OVERRIDE;
+ virtual void ClearData(uint32 remove_mask,
+ uint32 quota_storage_remove_mask,
+ const GURL* storage_origin,
+ const OriginMatcherFunction& origin_matcher,
+ const base::Time begin,
+ const base::Time end,
+ const base::Closure& callback) OVERRIDE;
ServiceWorkerContext* GetServiceWorkerContext();
@@ -57,6 +66,36 @@ class StoragePartitionImpl : public StoragePartition {
private:
friend class StoragePartitionImplMap;
FRIEND_TEST_ALL_PREFIXES(StoragePartitionShaderClearTest, ClearShaderCache);
+ FRIEND_TEST_ALL_PREFIXES(StoragePartitionImplTest,
+ RemoveQuotaManagedDataForeverBoth);
+ FRIEND_TEST_ALL_PREFIXES(StoragePartitionImplTest,
+ RemoveQuotaManagedDataForeverOnlyTemporary);
+ FRIEND_TEST_ALL_PREFIXES(StoragePartitionImplTest,
+ RemoveQuotaManagedDataForeverOnlyPersistent);
+ FRIEND_TEST_ALL_PREFIXES(StoragePartitionImplTest,
+ RemoveQuotaManagedDataForeverNeither);
+ FRIEND_TEST_ALL_PREFIXES(StoragePartitionImplTest,
+ RemoveQuotaManagedDataForeverSpecificOrigin);
+ FRIEND_TEST_ALL_PREFIXES(StoragePartitionImplTest,
+ RemoveQuotaManagedDataForLastHour);
+ FRIEND_TEST_ALL_PREFIXES(StoragePartitionImplTest,
+ RemoveQuotaManagedDataForLastWeek);
+ FRIEND_TEST_ALL_PREFIXES(StoragePartitionImplTest,
+ RemoveQuotaManagedUnprotectedOrigins);
+ FRIEND_TEST_ALL_PREFIXES(StoragePartitionImplTest,
+ RemoveQuotaManagedProtectedSpecificOrigin);
+ FRIEND_TEST_ALL_PREFIXES(StoragePartitionImplTest,
+ RemoveQuotaManagedProtectedOrigins);
+ FRIEND_TEST_ALL_PREFIXES(StoragePartitionImplTest,
+ RemoveQuotaManagedIgnoreDevTools);
+ FRIEND_TEST_ALL_PREFIXES(StoragePartitionImplTest, RemoveCookieForever);
+ FRIEND_TEST_ALL_PREFIXES(StoragePartitionImplTest, RemoveCookieLastHour);
+ FRIEND_TEST_ALL_PREFIXES(StoragePartitionImplTest,
+ RemoveUnprotectedLocalStorageForever);
+ FRIEND_TEST_ALL_PREFIXES(StoragePartitionImplTest,
+ RemoveProtectedLocalStorageForever);
+ FRIEND_TEST_ALL_PREFIXES(StoragePartitionImplTest,
+ RemoveLocalStorageForLastWeek);
// The |partition_path| is the absolute path to the root of this
// StoragePartition's on-disk storage.
@@ -68,10 +107,6 @@ class StoragePartitionImpl : public StoragePartition {
bool in_memory,
const base::FilePath& profile_path);
- // Quota managed data uses a different bitmask for types than
- // StoragePartition uses. This method generates that mask.
- static int GenerateQuotaClientMask(uint32 remove_mask);
-
CONTENT_EXPORT StoragePartitionImpl(
const base::FilePath& partition_path,
quota::QuotaManager* quota_manager,
@@ -81,11 +116,13 @@ class StoragePartitionImpl : public StoragePartition {
DOMStorageContextWrapper* dom_storage_context,
IndexedDBContextImpl* indexed_db_context,
ServiceWorkerContext* service_worker_context,
- WebRTCIdentityStore* webrtc_identity_store);
+ WebRTCIdentityStore* webrtc_identity_store,
+ quota::SpecialStoragePolicy* special_storage_policy);
void ClearDataImpl(uint32 remove_mask,
uint32 quota_storage_remove_mask,
- const GURL& remove_origin,
+ const GURL* remove_origin,
+ const OriginMatcherFunction& origin_matcher,
net::URLRequestContextGetter* rq_context,
const base::Time begin,
const base::Time end,
@@ -103,7 +140,8 @@ class StoragePartitionImpl : public StoragePartition {
// appropriate time. These should move back into the constructor once
// URLRequestContextGetter's lifetime is sorted out. We should also move the
// PostCreateInitialization() out of StoragePartitionImplMap.
- void SetURLRequestContext(net::URLRequestContextGetter* url_request_context);
+ CONTENT_EXPORT void SetURLRequestContext(
+ net::URLRequestContextGetter* url_request_context);
void SetMediaURLRequestContext(
net::URLRequestContextGetter* media_url_request_context);
@@ -118,6 +156,7 @@ class StoragePartitionImpl : public StoragePartition {
scoped_refptr<IndexedDBContextImpl> indexed_db_context_;
scoped_refptr<ServiceWorkerContext> service_worker_context_;
scoped_refptr<WebRTCIdentityStore> webrtc_identity_store_;
+ scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy_;
DISALLOW_COPY_AND_ASSIGN(StoragePartitionImpl);
};
diff --git a/content/browser/storage_partition_impl_map.cc b/content/browser/storage_partition_impl_map.cc
index feb9515..90f9497 100644
--- a/content/browser/storage_partition_impl_map.cc
+++ b/content/browser/storage_partition_impl_map.cc
@@ -460,11 +460,15 @@ void StoragePartitionImplMap::AsyncObliterate(
++it) {
const StoragePartitionConfig& config = it->first;
if (config.partition_domain == partition_domain) {
- it->second->ClearDataForUnboundedRange(
+ it->second->ClearData(
// All except shader cache.
StoragePartition::REMOVE_DATA_MASK_ALL &
(~StoragePartition::REMOVE_DATA_MASK_SHADER_CACHE),
- StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL);
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
+ NULL,
+ StoragePartition::OriginMatcherFunction(),
+ base::Time(), base::Time::Max(),
+ base::Bind(&base::DoNothing));
if (!config.in_memory) {
paths_to_keep.push_back(it->second->GetPath());
}
diff --git a/content/browser/storage_partition_impl_unittest.cc b/content/browser/storage_partition_impl_unittest.cc
index 4828ae6..ea9ab26 100644
--- a/content/browser/storage_partition_impl_unittest.cc
+++ b/content/browser/storage_partition_impl_unittest.cc
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/message_loop/message_loop_proxy.h"
#include "base/run_loop.h"
@@ -9,14 +10,57 @@
#include "content/browser/browser_thread_impl.h"
#include "content/browser/gpu/shader_disk_cache.h"
#include "content/browser/storage_partition_impl.h"
+#include "content/public/browser/local_storage_usage_info.h"
#include "content/public/browser/storage_partition.h"
+#include "content/public/test/test_browser_context.h"
+#include "content/public/test/test_browser_thread.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "net/base/test_completion_callback.h"
+#include "net/cookies/cookie_monster.h"
+#include "net/url_request/url_request_context.h"
+#include "net/url_request/url_request_context_getter.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "webkit/browser/quota/mock_quota_manager.h"
+#include "webkit/browser/quota/mock_special_storage_policy.h"
+#include "webkit/browser/quota/quota_manager.h"
namespace content {
namespace {
+const int kDefaultClientId = 42;
+const char kCacheKey[] = "key";
+const char kCacheValue[] = "cached value";
+
+const char kTestOrigin1[] = "http://host1:1/";
+const char kTestOrigin2[] = "http://host2:1/";
+const char kTestOrigin3[] = "http://host3:1/";
+const char kTestOriginDevTools[] = "chrome-devtools://abcdefghijklmnopqrstuvw/";
+
+const GURL kOrigin1(kTestOrigin1);
+const GURL kOrigin2(kTestOrigin2);
+const GURL kOrigin3(kTestOrigin3);
+const GURL kOriginDevTools(kTestOriginDevTools);
+
+const base::FilePath::CharType kDomStorageOrigin1[] =
+ FILE_PATH_LITERAL("http_host1_1.localstorage");
+
+const base::FilePath::CharType kDomStorageOrigin2[] =
+ FILE_PATH_LITERAL("http_host2_1.localstorage");
+
+const base::FilePath::CharType kDomStorageOrigin3[] =
+ FILE_PATH_LITERAL("http_host3_1.localstorage");
+
+const quota::StorageType kTemporary = quota::kStorageTypeTemporary;
+const quota::StorageType kPersistent = quota::kStorageTypePersistent;
+
+const quota::QuotaClient::ID kClientFile = quota::QuotaClient::kFileSystem;
+
+const uint32 kAllQuotaRemoveMask =
+ StoragePartition::REMOVE_DATA_MASK_INDEXEDDB |
+ StoragePartition::REMOVE_DATA_MASK_WEBSQL |
+ StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
+ StoragePartition::REMOVE_DATA_MASK_APPCACHE;
+
class TestClosureCallback {
public:
TestClosureCallback()
@@ -42,12 +86,293 @@ class TestClosureCallback {
DISALLOW_COPY_AND_ASSIGN(TestClosureCallback);
};
-const int kDefaultClientId = 42;
-const char kCacheKey[] = "key";
-const char kCacheValue[] = "cached value";
+class AwaitCompletionHelper {
+ public:
+ AwaitCompletionHelper() : start_(false), already_quit_(false) {}
+ virtual ~AwaitCompletionHelper() {}
+
+ void BlockUntilNotified() {
+ if (!already_quit_) {
+ DCHECK(!start_);
+ start_ = true;
+ base::MessageLoop::current()->Run();
+ } else {
+ DCHECK(!start_);
+ already_quit_ = false;
+ }
+ }
+
+ void Notify() {
+ if (start_) {
+ DCHECK(!already_quit_);
+ base::MessageLoop::current()->Quit();
+ start_ = false;
+ } else {
+ DCHECK(!already_quit_);
+ already_quit_ = true;
+ }
+ }
+
+// protected:
+// // BrowsingDataRemover::Observer implementation.
+// virtual void OnBrowsingDataRemoverDone() OVERRIDE {
+// Notify();
+// }
+//
+ private:
+ // Helps prevent from running message_loop, if the callback invoked
+ // immediately.
+ bool start_;
+ bool already_quit_;
+
+ DISALLOW_COPY_AND_ASSIGN(AwaitCompletionHelper);
+};
+
+class RemoveCookieTester {
+ public:
+ explicit RemoveCookieTester(TestBrowserContext* context)
+ : get_cookie_success_(false), monster_(NULL) {
+ SetMonster(context->GetRequestContext()->GetURLRequestContext()->
+ cookie_store()->GetCookieMonster());
+ }
+
+ // Returns true, if the given cookie exists in the cookie store.
+ bool ContainsCookie() {
+ get_cookie_success_ = false;
+ monster_->GetCookiesWithOptionsAsync(
+ kOrigin1, net::CookieOptions(),
+ base::Bind(&RemoveCookieTester::GetCookieCallback,
+ base::Unretained(this)));
+ await_completion_.BlockUntilNotified();
+ return get_cookie_success_;
+ }
+
+ void AddCookie() {
+ monster_->SetCookieWithOptionsAsync(
+ kOrigin1, "A=1", net::CookieOptions(),
+ base::Bind(&RemoveCookieTester::SetCookieCallback,
+ base::Unretained(this)));
+ await_completion_.BlockUntilNotified();
+ }
+
+ protected:
+ void SetMonster(net::CookieStore* monster) {
+ monster_ = monster;
+ }
+
+ private:
+ void GetCookieCallback(const std::string& cookies) {
+ if (cookies == "A=1") {
+ get_cookie_success_ = true;
+ } else {
+ EXPECT_EQ("", cookies);
+ get_cookie_success_ = false;
+ }
+ await_completion_.Notify();
+ }
+
+ void SetCookieCallback(bool result) {
+ ASSERT_TRUE(result);
+ await_completion_.Notify();
+ }
+
+ bool get_cookie_success_;
+ AwaitCompletionHelper await_completion_;
+ net::CookieStore* monster_;
+
+ DISALLOW_COPY_AND_ASSIGN(RemoveCookieTester);
+};
+
+class RemoveLocalStorageTester {
+ public:
+ explicit RemoveLocalStorageTester(TestBrowserContext* profile)
+ : profile_(profile), dom_storage_context_(NULL) {
+ dom_storage_context_ =
+ content::BrowserContext::GetDefaultStoragePartition(profile)->
+ GetDOMStorageContext();
+ }
+
+ // Returns true, if the given origin URL exists.
+ bool DOMStorageExistsForOrigin(const GURL& origin) {
+ GetLocalStorageUsage();
+ await_completion_.BlockUntilNotified();
+ for (size_t i = 0; i < infos_.size(); ++i) {
+ if (origin == infos_[i].origin)
+ return true;
+ }
+ return false;
+ }
+
+ void AddDOMStorageTestData() {
+ // Note: This test depends on details of how the dom_storage library
+ // stores data in the host file system.
+ base::FilePath storage_path =
+ profile_->GetPath().AppendASCII("Local Storage");
+ file_util::CreateDirectory(storage_path);
+
+ // Write some files.
+ file_util::WriteFile(storage_path.Append(kDomStorageOrigin1), NULL, 0);
+ file_util::WriteFile(storage_path.Append(kDomStorageOrigin2), NULL, 0);
+ file_util::WriteFile(storage_path.Append(kDomStorageOrigin3), NULL, 0);
+
+ // Tweak their dates.
+ file_util::SetLastModifiedTime(storage_path.Append(kDomStorageOrigin1),
+ base::Time::Now());
+ file_util::SetLastModifiedTime(storage_path.Append(kDomStorageOrigin2),
+ base::Time::Now() - base::TimeDelta::FromDays(1));
+ file_util::SetLastModifiedTime(storage_path.Append(kDomStorageOrigin3),
+ base::Time::Now() - base::TimeDelta::FromDays(60));
+ }
+
+ private:
+ void GetLocalStorageUsage() {
+ dom_storage_context_->GetLocalStorageUsage(
+ base::Bind(&RemoveLocalStorageTester::OnGotLocalStorageUsage,
+ base::Unretained(this)));
+ }
+ void OnGotLocalStorageUsage(
+ const std::vector<content::LocalStorageUsageInfo>& infos) {
+ infos_ = infos;
+ await_completion_.Notify();
+ }
+
+ // We don't own these pointers.
+ TestBrowserContext* profile_;
+ content::DOMStorageContext* dom_storage_context_;
+
+ std::vector<content::LocalStorageUsageInfo> infos_;
+
+ AwaitCompletionHelper await_completion_;
+
+ DISALLOW_COPY_AND_ASSIGN(RemoveLocalStorageTester);
+};
+
+bool IsWebSafeSchemeForTest(const std::string& scheme) {
+ return scheme == "http";
+}
+
+bool DoesOriginMatchForUnprotectedWeb(
+ const GURL& origin,
+ quota::SpecialStoragePolicy* special_storage_policy) {
+// if (IsWebSafeSchemeForTest(origin.scheme())) {
+ return !special_storage_policy->IsStorageProtected(origin.GetOrigin());
+
+// }
+// return false;
+}
+
+bool DoesOriginMatchForBothProtectedAndUnprotectedWeb(
+ const GURL& origin,
+ quota::SpecialStoragePolicy* special_storage_policy) {
+ return true;
+}
+
+bool DoesOriginMatchUnprotected(
+ const GURL& origin,
+ quota::SpecialStoragePolicy* special_storage_policy) {
+ return origin.GetOrigin().scheme() != kOriginDevTools.scheme();
+}
+
+void ClearQuotaData(content::StoragePartition* storage_partition,
+ const base::Closure& cb) {
+ storage_partition->ClearData(
+ kAllQuotaRemoveMask,
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
+ NULL, StoragePartition::OriginMatcherFunction(),
+ base::Time(), base::Time::Max(), cb);
+}
+
+void ClearQuotaDataWithOriginMatcher(
+ content::StoragePartition* storage_partition,
+ const GURL& remove_origin,
+ const StoragePartition::OriginMatcherFunction& origin_matcher,
+ const base::Time delete_begin,
+ const base::Closure& cb) {
+ storage_partition->ClearData(kAllQuotaRemoveMask,
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
+ &remove_origin, origin_matcher, delete_begin,
+ base::Time::Max(), cb);
+}
+
+void ClearQuotaDataForOrigin(
+ content::StoragePartition* storage_partition,
+ const GURL& remove_origin,
+ const base::Time delete_begin,
+ const base::Closure& cb) {
+ ClearQuotaDataWithOriginMatcher(
+ storage_partition, remove_origin,
+ StoragePartition::OriginMatcherFunction(), delete_begin, cb);
+}
+
+void ClearQuotaDataForNonPersistent(
+ content::StoragePartition* storage_partition,
+ const base::Time delete_begin,
+ const base::Closure& cb) {
+ uint32 quota_storage_remove_mask_no_persistent =
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL &
+ ~StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT;
+ storage_partition->ClearData(
+ kAllQuotaRemoveMask, quota_storage_remove_mask_no_persistent,
+ NULL, StoragePartition::OriginMatcherFunction(),
+ delete_begin, base::Time::Max(), cb);
+}
+
+void ClearCookies(content::StoragePartition* storage_partition,
+ const base::Time delete_begin,
+ const base::Time delete_end,
+ const base::Closure& cb) {
+ storage_partition->ClearData(
+ StoragePartition::REMOVE_DATA_MASK_COOKIES,
+ StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
+ NULL, StoragePartition::OriginMatcherFunction(),
+ delete_begin, delete_end, cb);
+}
+
+void ClearStuff(uint32 remove_mask,
+ content::StoragePartition* storage_partition,
+ const base::Time delete_begin,
+ const base::Time delete_end,
+ const StoragePartition::OriginMatcherFunction& origin_matcher,
+ const base::Closure& cb) {
+ storage_partition->ClearData(
+ remove_mask, StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
+ NULL, origin_matcher, delete_begin, delete_end, cb);
+}
} // namespace
+class StoragePartitionImplTest : public testing::Test {
+ public:
+ StoragePartitionImplTest()
+ : browser_context_(new TestBrowserContext()),
+ thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {
+ }
+ virtual ~StoragePartitionImplTest() {}
+
+ quota::MockQuotaManager* GetMockManager() {
+ if (!quota_manager_.get()) {
+ quota_manager_ = new quota::MockQuotaManager(
+ browser_context_->IsOffTheRecord(),
+ browser_context_->GetPath(),
+ BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO).get(),
+ BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB).get(),
+ browser_context_->GetSpecialStoragePolicy());
+ }
+ return quota_manager_.get();
+ }
+
+ TestBrowserContext* GetBrowserContext() {
+ return browser_context_.get();
+ }
+
+ private:
+ scoped_ptr<TestBrowserContext> browser_context_;
+ scoped_refptr<quota::MockQuotaManager> quota_manager_;
+ content::TestBrowserThreadBundle thread_bundle_;
+
+ DISALLOW_COPY_AND_ASSIGN(StoragePartitionImplTest);
+};
+
class StoragePartitionShaderClearTest : public testing::Test {
public:
StoragePartitionShaderClearTest()
@@ -98,23 +423,550 @@ class StoragePartitionShaderClearTest : public testing::Test {
void ClearData(content::StoragePartitionImpl* sp,
const base::Closure& cb) {
base::Time time;
- sp->ClearDataForRange(
+ sp->ClearData(
StoragePartition::REMOVE_DATA_MASK_SHADER_CACHE,
StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
+ NULL, StoragePartition::OriginMatcherFunction(),
time, time, cb);
}
+// Tests ---------------------------------------------------------------------
+
TEST_F(StoragePartitionShaderClearTest, ClearShaderCache) {
InitCache();
EXPECT_EQ(1u, Size());
TestClosureCallback clear_cb;
- StoragePartitionImpl sp(
- cache_path(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ StoragePartitionImpl storage_partition(
+ cache_path(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
base::MessageLoop::current()->PostTask(
- FROM_HERE, base::Bind(&ClearData, &sp, clear_cb.callback()));
+ FROM_HERE, base::Bind(&ClearData, &storage_partition,
+ clear_cb.callback()));
clear_cb.WaitForResult();
EXPECT_EQ(0u, Size());
}
+TEST_F(StoragePartitionImplTest, QuotaClientMaskGeneration) {
+ EXPECT_EQ(quota::QuotaClient::kFileSystem,
+ StoragePartitionImpl::GenerateQuotaClientMask(
+ StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS));
+ EXPECT_EQ(quota::QuotaClient::kDatabase,
+ StoragePartitionImpl::GenerateQuotaClientMask(
+ StoragePartition::REMOVE_DATA_MASK_WEBSQL));
+ EXPECT_EQ(quota::QuotaClient::kAppcache,
+ StoragePartitionImpl::GenerateQuotaClientMask(
+ StoragePartition::REMOVE_DATA_MASK_APPCACHE));
+ EXPECT_EQ(quota::QuotaClient::kIndexedDatabase,
+ StoragePartitionImpl::GenerateQuotaClientMask(
+ StoragePartition::REMOVE_DATA_MASK_INDEXEDDB));
+ EXPECT_EQ(quota::QuotaClient::kFileSystem |
+ quota::QuotaClient::kDatabase |
+ quota::QuotaClient::kAppcache |
+ quota::QuotaClient::kIndexedDatabase,
+ StoragePartitionImpl::GenerateQuotaClientMask(
+ StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
+ StoragePartition::REMOVE_DATA_MASK_WEBSQL |
+ StoragePartition::REMOVE_DATA_MASK_APPCACHE |
+ StoragePartition::REMOVE_DATA_MASK_INDEXEDDB));
+}
+
+void PopulateTestQuotaManagedPersistentData(quota::MockQuotaManager* manager) {
+ manager->AddOrigin(kOrigin2, kPersistent, kClientFile, base::Time());
+ manager->AddOrigin(kOrigin3, kPersistent, kClientFile,
+ base::Time::Now() - base::TimeDelta::FromDays(1));
+
+ EXPECT_FALSE(manager->OriginHasData(kOrigin1, kPersistent, kClientFile));
+ EXPECT_TRUE(manager->OriginHasData(kOrigin2, kPersistent, kClientFile));
+ EXPECT_TRUE(manager->OriginHasData(kOrigin3, kPersistent, kClientFile));
+}
+
+void PopulateTestQuotaManagedTemporaryData(quota::MockQuotaManager* manager) {
+ manager->AddOrigin(kOrigin1, kTemporary, kClientFile, base::Time::Now());
+ manager->AddOrigin(kOrigin3, kTemporary, kClientFile,
+ base::Time::Now() - base::TimeDelta::FromDays(1));
+
+ EXPECT_TRUE(manager->OriginHasData(kOrigin1, kTemporary, kClientFile));
+ EXPECT_FALSE(manager->OriginHasData(kOrigin2, kTemporary, kClientFile));
+ EXPECT_TRUE(manager->OriginHasData(kOrigin3, kTemporary, kClientFile));
+}
+
+void PopulateTestQuotaManagedData(quota::MockQuotaManager* manager) {
+ // Set up kOrigin1 with a temporary quota, kOrigin2 with a persistent
+ // quota, and kOrigin3 with both. kOrigin1 is modified now, kOrigin2
+ // is modified at the beginning of time, and kOrigin3 is modified one day
+ // ago.
+ PopulateTestQuotaManagedPersistentData(manager);
+ PopulateTestQuotaManagedTemporaryData(manager);
+}
+
+void PopulateTestQuotaManagedNonBrowsingData(quota::MockQuotaManager* manager) {
+ manager->AddOrigin(kOriginDevTools, kTemporary, kClientFile, base::Time());
+ manager->AddOrigin(kOriginDevTools, kPersistent, kClientFile, base::Time());
+}
+
+TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForeverBoth) {
+ PopulateTestQuotaManagedData(GetMockManager());
+
+ TestClosureCallback clear_cb;
+ StoragePartitionImpl sp(
+ base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
+ GetMockManager());
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE, base::Bind(&ClearQuotaData, &sp, clear_cb.callback()));
+ clear_cb.WaitForResult();
+
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
+ kClientFile));
+}
+
+TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForeverOnlyTemporary) {
+ PopulateTestQuotaManagedTemporaryData(GetMockManager());
+
+ TestClosureCallback clear_cb;
+ StoragePartitionImpl sp(
+ base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
+ GetMockManager());
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE, base::Bind(&ClearQuotaData, &sp, clear_cb.callback()));
+ clear_cb.WaitForResult();
+
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
+ kClientFile));
+}
+
+TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForeverOnlyPersistent) {
+ PopulateTestQuotaManagedPersistentData(GetMockManager());
+
+ TestClosureCallback clear_cb;
+ StoragePartitionImpl sp(
+ base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
+ GetMockManager());
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE, base::Bind(&ClearQuotaData, &sp, clear_cb.callback()));
+ clear_cb.WaitForResult();
+
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
+ kClientFile));
+}
+
+TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForeverNeither) {
+ TestClosureCallback clear_cb;
+ StoragePartitionImpl sp(
+ base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
+ GetMockManager());
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE, base::Bind(&ClearQuotaData, &sp, clear_cb.callback()));
+ clear_cb.WaitForResult();
+
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
+ kClientFile));
+}
+
+TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForeverSpecificOrigin) {
+ PopulateTestQuotaManagedData(GetMockManager());
+
+ TestClosureCallback clear_cb;
+ StoragePartitionImpl sp(
+ base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
+ GetMockManager());
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE, base::Bind(&ClearQuotaDataForOrigin,
+ &sp, kOrigin1, base::Time(), clear_cb.callback()));
+ clear_cb.WaitForResult();
+
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
+ kClientFile));
+ EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
+ kClientFile));
+ EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
+ kClientFile));
+ EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
+ kClientFile));
+}
+
+TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForLastHour) {
+ PopulateTestQuotaManagedData(GetMockManager());
+
+ TestClosureCallback clear_cb;
+ StoragePartitionImpl sp(
+ base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
+ GetMockManager());
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE, base::Bind(&ClearQuotaDataForOrigin,
+ &sp, GURL(),
+ base::Time::Now() - base::TimeDelta::FromHours(1),
+ clear_cb.callback()));
+ clear_cb.WaitForResult();
+
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
+ kClientFile));
+ EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
+ kClientFile));
+ EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
+ kClientFile));
+ EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
+ kClientFile));
+}
+
+TEST_F(StoragePartitionImplTest, RemoveQuotaManagedDataForLastWeek) {
+ PopulateTestQuotaManagedData(GetMockManager());
+
+ TestClosureCallback clear_cb;
+ StoragePartitionImpl sp(
+ base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
+ GetMockManager());
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE, base::Bind(&ClearQuotaDataForNonPersistent,
+ &sp,
+ base::Time::Now() - base::TimeDelta::FromDays(7),
+ clear_cb.callback()));
+ clear_cb.WaitForResult();
+
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
+ kClientFile));
+ EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
+ kClientFile));
+ EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
+ kClientFile));
+}
+
+TEST_F(StoragePartitionImplTest, RemoveQuotaManagedUnprotectedOrigins) {
+ // Protect kOrigin1.
+ scoped_refptr<quota::MockSpecialStoragePolicy> mock_policy =
+ new quota::MockSpecialStoragePolicy;
+ mock_policy->AddProtected(kOrigin1.GetOrigin());
+
+ PopulateTestQuotaManagedData(GetMockManager());
+
+ TestClosureCallback clear_cb;
+ StoragePartitionImpl sp(
+ base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
+ GetMockManager());
+ static_cast<StoragePartitionImpl*>(
+ &sp)->OverrideSpecialStoragePolicyForTesting(mock_policy);
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE, base::Bind(&ClearQuotaDataWithOriginMatcher,
+ &sp, GURL(),
+ base::Bind(&DoesOriginMatchForUnprotectedWeb),
+ base::Time(), clear_cb.callback()));
+ clear_cb.WaitForResult();
+
+ EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
+ kClientFile));
+}
+
+TEST_F(StoragePartitionImplTest, RemoveQuotaManagedProtectedSpecificOrigin) {
+ // Protect kOrigin1.
+ scoped_refptr<quota::MockSpecialStoragePolicy> mock_policy =
+ new quota::MockSpecialStoragePolicy;
+ mock_policy->AddProtected(kOrigin1.GetOrigin());
+
+ PopulateTestQuotaManagedData(GetMockManager());
+
+ TestClosureCallback clear_cb;
+ StoragePartitionImpl sp(
+ base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
+ GetMockManager());
+ static_cast<StoragePartitionImpl*>(
+ &sp)->OverrideSpecialStoragePolicyForTesting(mock_policy);
+
+ // Try to remove kOrigin1. Expect failure.
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE, base::Bind(&ClearQuotaDataWithOriginMatcher,
+ &sp, kOrigin1,
+ base::Bind(&DoesOriginMatchForUnprotectedWeb),
+ base::Time(), clear_cb.callback()));
+ clear_cb.WaitForResult();
+
+ EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
+ kClientFile));
+ EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
+ kClientFile));
+ EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
+ kClientFile));
+ EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
+ kClientFile));
+}
+
+TEST_F(StoragePartitionImplTest, RemoveQuotaManagedProtectedOrigins) {
+ // Protect kOrigin1.
+ scoped_refptr<quota::MockSpecialStoragePolicy> mock_policy =
+ new quota::MockSpecialStoragePolicy;
+ mock_policy->AddProtected(kOrigin1.GetOrigin());
+
+ PopulateTestQuotaManagedData(GetMockManager());
+
+ // Try to remove kOrigin1. Expect success.
+ TestClosureCallback clear_cb;
+ StoragePartitionImpl sp(
+ base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
+ GetMockManager());
+ static_cast<StoragePartitionImpl*>(
+ &sp)->OverrideSpecialStoragePolicyForTesting(mock_policy);
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(&ClearQuotaDataWithOriginMatcher,
+ &sp, GURL(),
+ base::Bind(&DoesOriginMatchForBothProtectedAndUnprotectedWeb),
+ base::Time(), clear_cb.callback()));
+ clear_cb.WaitForResult();
+
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent,
+ kClientFile));
+ EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent,
+ kClientFile));
+}
+
+TEST_F(StoragePartitionImplTest, RemoveQuotaManagedIgnoreDevTools) {
+ PopulateTestQuotaManagedNonBrowsingData(GetMockManager());
+
+ TestClosureCallback clear_cb;
+ StoragePartitionImpl sp(
+ base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ static_cast<StoragePartitionImpl*>(&sp)->OverrideQuotaManagerForTesting(
+ GetMockManager());
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE, base::Bind(&ClearQuotaDataWithOriginMatcher,
+ &sp, GURL(),
+ base::Bind(&DoesOriginMatchUnprotected),
+ base::Time(), clear_cb.callback()));
+ clear_cb.WaitForResult();
+
+ // Check that devtools data isn't removed.
+ EXPECT_TRUE(GetMockManager()->OriginHasData(kOriginDevTools, kTemporary,
+ kClientFile));
+ EXPECT_TRUE(GetMockManager()->OriginHasData(kOriginDevTools, kPersistent,
+ kClientFile));
+}
+
+TEST_F(StoragePartitionImplTest, RemoveCookieForever) {
+ RemoveCookieTester tester(GetBrowserContext());
+
+ tester.AddCookie();
+ ASSERT_TRUE(tester.ContainsCookie());
+
+ TestClosureCallback clear_cb;
+ StoragePartitionImpl sp(
+ base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ sp.SetURLRequestContext(GetBrowserContext()->GetRequestContext());
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE, base::Bind(&ClearCookies,
+ &sp, base::Time(), base::Time::Max(),
+ clear_cb.callback()));
+ clear_cb.WaitForResult();
+
+ EXPECT_FALSE(tester.ContainsCookie());
+}
+
+TEST_F(StoragePartitionImplTest, RemoveCookieLastHour) {
+ RemoveCookieTester tester(GetBrowserContext());
+
+ tester.AddCookie();
+ ASSERT_TRUE(tester.ContainsCookie());
+
+ TestClosureCallback clear_cb;
+ StoragePartitionImpl sp(
+ base::FilePath(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ base::Time an_hour_ago = base::Time::Now() - base::TimeDelta::FromHours(1);
+ sp.SetURLRequestContext(GetBrowserContext()->GetRequestContext());
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE, base::Bind(&ClearCookies,
+ &sp, an_hour_ago, base::Time::Max(),
+ clear_cb.callback()));
+ clear_cb.WaitForResult();
+
+ EXPECT_FALSE(tester.ContainsCookie());
+}
+
+TEST_F(StoragePartitionImplTest, RemoveUnprotectedLocalStorageForever) {
+ // Protect kOrigin1.
+ scoped_refptr<quota::MockSpecialStoragePolicy> mock_policy =
+ new quota::MockSpecialStoragePolicy;
+ mock_policy->AddProtected(kOrigin1.GetOrigin());
+
+ RemoveLocalStorageTester tester(GetBrowserContext());
+
+ tester.AddDOMStorageTestData();
+ EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1));
+ EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin2));
+ EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3));
+
+ TestClosureCallback clear_cb;
+ DOMStorageContextWrapper* dom_storage_context =
+ static_cast<DOMStorageContextWrapper*>(
+ content::BrowserContext::GetDefaultStoragePartition(
+ GetBrowserContext())->GetDOMStorageContext());
+ StoragePartitionImpl sp(base::FilePath(), NULL, NULL, NULL, NULL,
+ dom_storage_context, NULL, NULL, NULL, NULL);
+ static_cast<StoragePartitionImpl*>(
+ &sp)->OverrideSpecialStoragePolicyForTesting(mock_policy);
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(&ClearStuff,
+ StoragePartitionImpl::REMOVE_DATA_MASK_LOCAL_STORAGE,
+ &sp, base::Time(), base::Time::Max(),
+ base::Bind(&DoesOriginMatchForUnprotectedWeb),
+ clear_cb.callback()));
+ clear_cb.WaitForResult();
+
+ EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1));
+ EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin2));
+ EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin3));
+}
+
+TEST_F(StoragePartitionImplTest, RemoveProtectedLocalStorageForever) {
+ // Protect kOrigin1.
+ scoped_refptr<quota::MockSpecialStoragePolicy> mock_policy =
+ new quota::MockSpecialStoragePolicy;
+ mock_policy->AddProtected(kOrigin1.GetOrigin());
+
+ RemoveLocalStorageTester tester(GetBrowserContext());
+
+ tester.AddDOMStorageTestData();
+ EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1));
+ EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin2));
+ EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3));
+
+ TestClosureCallback clear_cb;
+ DOMStorageContextWrapper* dom_storage_context =
+ static_cast<DOMStorageContextWrapper*>(
+ content::BrowserContext::GetDefaultStoragePartition(
+ GetBrowserContext())->GetDOMStorageContext());
+ StoragePartitionImpl sp(base::FilePath(), NULL, NULL, NULL, NULL,
+ dom_storage_context, NULL, NULL, NULL, NULL);
+ static_cast<StoragePartitionImpl*>(
+ &sp)->OverrideSpecialStoragePolicyForTesting(mock_policy);
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(&ClearStuff,
+ StoragePartitionImpl::REMOVE_DATA_MASK_LOCAL_STORAGE,
+ &sp, base::Time(), base::Time::Max(),
+ base::Bind(&DoesOriginMatchForBothProtectedAndUnprotectedWeb),
+ clear_cb.callback()));
+ clear_cb.WaitForResult();
+
+ // Even if kOrigin1 is protected, it will be deleted since we specify
+ // ClearData to delete protected data.
+ EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin1));
+ EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin2));
+ EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin3));
+}
+
+TEST_F(StoragePartitionImplTest, RemoveLocalStorageForLastWeek) {
+ RemoveLocalStorageTester tester(GetBrowserContext());
+
+ tester.AddDOMStorageTestData();
+ EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1));
+ EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin2));
+ EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3));
+
+ TestClosureCallback clear_cb;
+ DOMStorageContextWrapper* dom_storage_context =
+ static_cast<DOMStorageContextWrapper*>(
+ content::BrowserContext::GetDefaultStoragePartition(
+ GetBrowserContext())->GetDOMStorageContext());
+ StoragePartitionImpl sp(base::FilePath(), NULL, NULL, NULL, NULL,
+ dom_storage_context, NULL, NULL, NULL, NULL);
+ base::Time a_week_ago = base::Time::Now() - base::TimeDelta::FromDays(7);
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(&ClearStuff,
+ StoragePartitionImpl::REMOVE_DATA_MASK_LOCAL_STORAGE,
+ &sp, a_week_ago, base::Time::Max(),
+ base::Bind(&DoesOriginMatchForBothProtectedAndUnprotectedWeb),
+ clear_cb.callback()));
+ clear_cb.WaitForResult();
+
+ // kOrigin1 and kOrigin2 do not have age more than a week.
+ EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin1));
+ EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin2));
+ EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3));
+}
+
} // namespace content
diff --git a/content/public/browser/storage_partition.h b/content/public/browser/storage_partition.h
index b30ca42..579ccbc 100644
--- a/content/public/browser/storage_partition.h
+++ b/content/public/browser/storage_partition.h
@@ -26,6 +26,7 @@ class URLRequestContextGetter;
namespace quota {
class QuotaManager;
+class SpecialStoragePolicy;
}
namespace webkit_database {
@@ -97,19 +98,26 @@ class StoragePartition {
const GURL& storage_origin,
net::URLRequestContextGetter* rq_context) = 0;
- // Similar to ClearDataForOrigin(), but deletes all data out of the
- // StoragePartition rather than just the data related to this origin.
- virtual void ClearDataForUnboundedRange(uint32 remove_mask,
- uint32 quota_storage_remove_mask) = 0;
-
- // Similar to ClearDataForOrigin(), but deletes all the data out of the
- // StoragePartion from between the given |begin| and |end| dates rather
- // then just the data related to this origin.
- virtual void ClearDataForRange(uint32 remove_mask,
- uint32 quota_storage_remove_mask,
- const base::Time& begin,
- const base::Time& end,
- const base::Closure& callback) = 0;
+ // A callback type to check if a given origin matches a storage policy.
+ // Can be passed empty/null where used, which means the origin will always
+ // match.
+ typedef base::Callback<bool(const GURL&,
+ quota::SpecialStoragePolicy*)>
+ OriginMatcherFunction;
+
+ // Similar to ClearDataForOrigin().
+ // Deletes all data out fo the StoragePartition if |storage_origin| is NULL.
+ // |origin_matcher| is present if special storage policy is to be handled,
+ // otherwise the callback can be null (base::Callback::is_null() == true).
+ // |callback| is called when data deletion is done or at least the deletion is
+ // scheduled.
+ virtual void ClearData(uint32 remove_mask,
+ uint32 quota_storage_remove_mask,
+ const GURL* storage_origin,
+ const OriginMatcherFunction& origin_matcher,
+ const base::Time begin,
+ const base::Time end,
+ const base::Closure& callback) = 0;
protected:
virtual ~StoragePartition() {}