Index: webkit/appcache/appcache_storage_impl.cc |
diff --git a/webkit/appcache/appcache_storage_impl.cc b/webkit/appcache/appcache_storage_impl.cc |
index 58a3720e2331218a94c616d4e849ef410d20ca82..63c05549bcda7a80f147edccb9a7594dba4b782a 100644 |
--- a/webkit/appcache/appcache_storage_impl.cc |
+++ b/webkit/appcache/appcache_storage_impl.cc |
@@ -68,9 +68,17 @@ bool DeleteGroupAndRelatedRecords(AppCacheDatabase* database, |
return success; |
} |
-void ClearOnExit( |
+// Deletes all appcache data (if clear_all_data is true), or session-only |
+// appcache data. Also, schedules the database to be destroyed. |
+void CleanUpOnDatabaseThread( |
AppCacheDatabase* database, |
- scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy) { |
+ scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy, |
+ bool clear_all_appcaches) { |
+ scoped_ptr<AppCacheDatabase> database_to_delete(database); |
+ |
+ if (!clear_all_appcaches && !special_storage_policy) |
+ return; |
+ |
std::set<GURL> origins; |
database->FindOriginsWithGroups(&origins); |
if (origins.empty()) |
@@ -84,6 +92,9 @@ void ClearOnExit( |
std::set<GURL>::const_iterator origin; |
for (origin = origins.begin(); origin != origins.end(); ++origin) { |
+ if (!clear_all_appcaches && |
+ !special_storage_policy->IsStorageSessionOnly(*origin)) |
+ continue; |
if (special_storage_policy && |
special_storage_policy->IsStorageProtected(*origin)) |
continue; |
@@ -1148,16 +1159,14 @@ AppCacheStorageImpl::~AppCacheStorageImpl() { |
std::mem_fun(&DatabaseTask::CancelCompletion)); |
if (database_) { |
- if (service()->clear_local_state_on_exit()) { |
- AppCacheThread::PostTask( |
- AppCacheThread::db(), |
- FROM_HERE, |
- NewRunnableFunction( |
- ClearOnExit, |
- database_, |
- make_scoped_refptr(service_->special_storage_policy()))); |
- } |
- AppCacheThread::DeleteSoon(AppCacheThread::db(), FROM_HERE, database_); |
+ AppCacheThread::PostTask( |
+ AppCacheThread::db(), |
+ FROM_HERE, |
+ NewRunnableFunction( |
+ CleanUpOnDatabaseThread, |
+ database_, |
+ make_scoped_refptr(service_->special_storage_policy()), |
+ service()->clear_local_state_on_exit())); |
} |
} |