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

Unified Diff: webkit/appcache/appcache_storage_impl.cc

Issue 7210006: AppCaches which belong to hosted apps are not protected from deletion (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Minor. Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webkit/appcache/appcache_storage_impl.cc
diff --git a/webkit/appcache/appcache_storage_impl.cc b/webkit/appcache/appcache_storage_impl.cc
index 6b7d04d148979f8ba367ba50f4d508eb264ae61f..a6b561ffa219d7969fb19d0d891d37e1a5852053 100644
--- a/webkit/appcache/appcache_storage_impl.cc
+++ b/webkit/appcache/appcache_storage_impl.cc
@@ -34,8 +34,66 @@ namespace {
void DeleteDirectory(const FilePath& path) {
file_util::Delete(path, true);
}
+
+void ClearOnExit(
+ appcache::AppCacheDatabase* database,
+ scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy) {
+ LOG(WARNING) << "ClearOnExit";
+ std::set<GURL> origins;
+ database->FindOriginsWithGroups(&origins);
+ if (origins.empty())
+ return; // nothing to delete
+
+ sql::Connection* connection = database->db_connection();
+ if (!connection) {
+ NOTREACHED() << "Missing database connection.";
+ return;
+ }
+
+ std::set<GURL>::const_iterator origin;
+ for (origin = origins.begin(); origin != origins.end(); ++origin) {
+ if (special_storage_policy &&
+ special_storage_policy->IsStorageProtected(*origin))
+ continue;
+
+ std::vector<appcache::AppCacheDatabase::GroupRecord> groups;
+ database->FindGroupsForOrigin(*origin, &groups);
+ std::vector<appcache::AppCacheDatabase::GroupRecord>::const_iterator group;
+ for (group = groups.begin(); group != groups.end(); ++group) {
+ sql::Transaction transaction(connection);
+ if (!transaction.Begin()) {
+ NOTREACHED() << "Failed to start transaction";
+ return;
+ }
+
+ bool success = false;
+
+ // Logic lifted from MakeGroupObsoleteTask::Run, could be shared.
michaeln 2011/07/14 22:53:16 Can you take a stab at sharing this logic with Mak
marja(google) 2011/07/15 11:03:42 Done. Btw, how about AppCacheGroup::AddNewlyDelet
michaeln 2011/07/15 19:15:46 By the time our ClearOnExit function is run, there
+ appcache::AppCacheDatabase::CacheRecord cache_record;
+ if (database->FindCacheForGroup(group->group_id, &cache_record)) {
+ std::vector<int64> response_ids;
+ database->FindResponseIdsForCacheAsVector(cache_record.cache_id,
+ &response_ids);
+ success =
+ database->DeleteGroup(group->group_id) &&
+ database->DeleteCache(cache_record.cache_id) &&
+ database->DeleteEntriesForCache(cache_record.cache_id) &&
+ database->DeleteFallbackNameSpacesForCache(cache_record.cache_id) &&
+ database->DeleteOnlineWhiteListForCache(cache_record.cache_id) &&
+ database->InsertDeletableResponseIds(response_ids);
+ } else {
+ NOTREACHED() << "A existing group without a cache is unexpected";
+ success = database->DeleteGroup(group->group_id);
+ }
+
+ success = success && transaction.Commit();
+ DCHECK(success);
+ } // for each group
+ } // for each origin
}
+} // namespace
+
namespace appcache {
// Hard coded default when not using quota management.
@@ -1088,6 +1146,16 @@ AppCacheStorageImpl::~AppCacheStorageImpl() {
scheduled_database_tasks_.end(),
std::mem_fun(&DatabaseTask::CancelCompletion));
+ if (service()->clear_local_state_on_exit() && database_) {
michaeln 2011/07/14 22:53:16 nit: maybe test if (database_) once and { if (cl
marja(google) 2011/07/15 11:03:42 Done.
+ AppCacheThread::PostTask(
+ AppCacheThread::db(),
+ FROM_HERE,
+ NewRunnableFunction(
+ ClearOnExit,
+ database_,
+ make_scoped_refptr(service_->special_storage_policy())));
+
+ }
if (database_)
AppCacheThread::DeleteSoon(AppCacheThread::db(), FROM_HERE, database_);
}
« webkit/appcache/appcache_storage.h ('K') | « webkit/appcache/appcache_storage_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698