| Index: content/browser/storage_partition_impl.cc
|
| diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
|
| index da17ff17fbe355437aaa3e264fe4b1c605c9a058..cd86b70dfd3b8fa47cb9c5796981794d83034f7d 100644
|
| --- a/content/browser/storage_partition_impl.cc
|
| +++ b/content/browser/storage_partition_impl.cc
|
| @@ -6,6 +6,7 @@
|
|
|
| #include "base/utf_string_conversions.h"
|
| #include "content/browser/fileapi/browser_file_system_helper.h"
|
| +#include "content/public/browser/dom_storage_context.h"
|
| #include "content/public/browser/browser_context.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/indexed_db_context.h"
|
| @@ -14,18 +15,39 @@
|
| #include "net/cookies/cookie_monster.h"
|
| #include "net/url_request/url_request_context_getter.h"
|
| #include "net/url_request/url_request_context.h"
|
| +#include "webkit/dom_storage/dom_storage_types.h"
|
| #include "webkit/database/database_tracker.h"
|
| -#include "webkit/database/database_util.h"
|
| #include "webkit/quota/quota_manager.h"
|
|
|
| namespace content {
|
|
|
| namespace {
|
|
|
| -void ClearDataOnIOThread(
|
| +void DoNothingStatusCallback(quota::QuotaStatusCode status) {
|
| + // Do nothing.
|
| +}
|
| +
|
| +void ClearQuotaManagedOriginsOnIOThread(
|
| + const scoped_refptr<quota::QuotaManager>& quota_manager,
|
| + const std::set<GURL>& origins,
|
| + quota::StorageType 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));
|
| + std::set<GURL>::const_iterator origin;
|
| + for (std::set<GURL>::const_iterator origin = origins.begin();
|
| + origin != origins.end(); ++origin) {
|
| + quota_manager->DeleteOriginData(*origin, type,
|
| + quota::QuotaClient::kAllClientsMask,
|
| + base::Bind(&DoNothingStatusCallback));
|
| + }
|
| +}
|
| +
|
| +void ClearOriginOnIOThread(
|
| const GURL& storage_origin,
|
| const scoped_refptr<net::URLRequestContextGetter>& request_context,
|
| - const scoped_refptr<ChromeAppCacheService>& appcache_service) {
|
| + const scoped_refptr<quota::QuotaManager>& quota_manager) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
|
|
| // Handle the cookies.
|
| @@ -36,26 +58,54 @@ void ClearDataOnIOThread(
|
| cookie_monster->DeleteAllForHostAsync(
|
| storage_origin, net::CookieMonster::DeleteCallback());
|
|
|
| - // Clear out appcache.
|
| - appcache_service->DeleteAppCachesForOrigin(storage_origin,
|
| - net::CompletionCallback());
|
| + // Handle all HTML5 storage other than DOMStorageContext.
|
| + std::set<GURL> origins;
|
| + origins.insert(storage_origin);
|
| + ClearQuotaManagedOriginsOnIOThread(quota_manager, origins,
|
| + quota::kStorageTypePersistent);
|
| + ClearQuotaManagedOriginsOnIOThread(quota_manager, origins,
|
| + quota::kStorageTypeTemporary);
|
| }
|
|
|
| -void ClearDataOnFileThread(
|
| - const GURL& storage_origin,
|
| - string16 origin_id,
|
| - const scoped_refptr<webkit_database::DatabaseTracker> &database_tracker,
|
| - const scoped_refptr<fileapi::FileSystemContext>& file_system_context) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| +void ClearAllDataOnIOThread(
|
| + const scoped_refptr<net::URLRequestContextGetter>& request_context,
|
| + const scoped_refptr<quota::QuotaManager>& quota_manager) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
|
|
| - // Clear out the HTML5 filesystem.
|
| - file_system_context->DeleteDataForOriginOnFileThread(storage_origin);
|
| + // Handle the cookies.
|
| + net::CookieMonster* cookie_monster =
|
| + request_context->GetURLRequestContext()->cookie_store()->
|
| + GetCookieMonster();
|
| + if (cookie_monster)
|
| + cookie_monster->DeleteAllAsync(net::CookieMonster::DeleteCallback());
|
| +
|
| + // Handle all HTML5 storage other than DOMStorageContext.
|
| + quota_manager->GetOriginsModifiedSince(
|
| + quota::kStorageTypePersistent, base::Time(),
|
| + base::Bind(&ClearQuotaManagedOriginsOnIOThread, quota_manager));
|
| + quota_manager->GetOriginsModifiedSince(
|
| + quota::kStorageTypeTemporary, base::Time(),
|
| + base::Bind(&ClearQuotaManagedOriginsOnIOThread, quota_manager));
|
| +}
|
|
|
| - // Clear out the database tracker. We just let this run until completion
|
| - // without notification.
|
| - int rv = database_tracker->DeleteDataForOrigin(
|
| - origin_id, net::CompletionCallback());
|
| - DCHECK(rv == net::OK || rv == net::ERR_IO_PENDING);
|
| +void OnLocalStorageUsageInfo(
|
| + const scoped_refptr<DOMStorageContextImpl>& dom_storage_context,
|
| + const std::vector<dom_storage::LocalStorageUsageInfo>& infos) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + for (size_t i = 0; i < infos.size(); ++i) {
|
| + dom_storage_context->DeleteLocalStorage(infos[i].origin);
|
| + }
|
| +}
|
| +
|
| +void OnSessionStorageUsageInfo(
|
| + const scoped_refptr<DOMStorageContextImpl>& dom_storage_context,
|
| + const std::vector<dom_storage::SessionStorageUsageInfo>& infos) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + for (size_t i = 0; i < infos.size(); ++i) {
|
| + dom_storage_context->DeleteSessionStorage(infos[i]);
|
| + }
|
| }
|
|
|
| } // namespace
|
| @@ -192,28 +242,28 @@ void StoragePartitionImpl::AsyncClearDataForOrigin(
|
|
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&ClearDataOnIOThread,
|
| + base::Bind(&ClearOriginOnIOThread,
|
| storage_origin,
|
| make_scoped_refptr(request_context_getter),
|
| - appcache_service_));
|
| -
|
| - string16 origin_id =
|
| - webkit_database::DatabaseUtil::GetOriginIdentifier(storage_origin);
|
| - BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&ClearDataOnFileThread,
|
| - storage_origin,
|
| - origin_id,
|
| - database_tracker_,
|
| - filesystem_context_));
|
| + quota_manager_));
|
|
|
| GetDOMStorageContext()->DeleteLocalStorage(storage_origin);
|
| +}
|
|
|
| +void StoragePartitionImpl::AsyncClearAllData() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + // We ignore the media request context because it shares the same cookie store
|
| + // as the main request context.
|
| BrowserThread::PostTask(
|
| - BrowserThread::WEBKIT_DEPRECATED, FROM_HERE,
|
| - base::Bind(
|
| - &IndexedDBContext::DeleteForOrigin,
|
| - indexed_db_context_,
|
| - storage_origin));
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&ClearAllDataOnIOThread, url_request_context_,
|
| + quota_manager_));
|
| +
|
| + dom_storage_context_->GetLocalStorageUsage(
|
| + base::Bind(&OnLocalStorageUsageInfo, dom_storage_context_));
|
| + dom_storage_context_->GetSessionStorageUsage(
|
| + base::Bind(&OnSessionStorageUsageInfo, dom_storage_context_));
|
| }
|
|
|
| void StoragePartitionImpl::SetURLRequestContext(
|
|
|