Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "webkit/appcache/appcache_storage_impl.h" | 5 #include "webkit/appcache/appcache_storage_impl.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "app/sql/connection.h" | 9 #include "app/sql/connection.h" |
| 10 #include "app/sql/transaction.h" | 10 #include "app/sql/transaction.h" |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 22 #include "webkit/appcache/appcache_histograms.h" | 22 #include "webkit/appcache/appcache_histograms.h" |
| 23 #include "webkit/appcache/appcache_policy.h" | 23 #include "webkit/appcache/appcache_policy.h" |
| 24 #include "webkit/appcache/appcache_quota_client.h" | 24 #include "webkit/appcache/appcache_quota_client.h" |
| 25 #include "webkit/appcache/appcache_response.h" | 25 #include "webkit/appcache/appcache_response.h" |
| 26 #include "webkit/appcache/appcache_service.h" | 26 #include "webkit/appcache/appcache_service.h" |
| 27 #include "webkit/appcache/appcache_thread.h" | 27 #include "webkit/appcache/appcache_thread.h" |
| 28 #include "webkit/quota/quota_client.h" | 28 #include "webkit/quota/quota_client.h" |
| 29 #include "webkit/quota/quota_manager.h" | 29 #include "webkit/quota/quota_manager.h" |
| 30 #include "webkit/quota/special_storage_policy.h" | 30 #include "webkit/quota/special_storage_policy.h" |
| 31 | 31 |
| 32 namespace { | 32 namespace { |
|
michaeln
2011/07/14 22:53:16
If this anon namespace is moved down a couple of l
marja(google)
2011/07/15 11:03:42
Done.
| |
| 33 // Helper with no return value for use with NewRunnableFunction. | 33 // Helper with no return value for use with NewRunnableFunction. |
| 34 void DeleteDirectory(const FilePath& path) { | 34 void DeleteDirectory(const FilePath& path) { |
| 35 file_util::Delete(path, true); | 35 file_util::Delete(path, true); |
| 36 } | 36 } |
| 37 | |
| 38 void ClearOnExit( | |
| 39 appcache::AppCacheDatabase* database, | |
| 40 scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy) { | |
| 41 LOG(WARNING) << "ClearOnExit"; | |
| 42 std::set<GURL> origins; | |
| 43 database->FindOriginsWithGroups(&origins); | |
| 44 if (origins.empty()) | |
| 45 return; // nothing to delete | |
| 46 | |
| 47 sql::Connection* connection = database->db_connection(); | |
| 48 if (!connection) { | |
| 49 NOTREACHED() << "Missing database connection."; | |
| 50 return; | |
| 51 } | |
| 52 | |
| 53 std::set<GURL>::const_iterator origin; | |
| 54 for (origin = origins.begin(); origin != origins.end(); ++origin) { | |
| 55 if (special_storage_policy && | |
| 56 special_storage_policy->IsStorageProtected(*origin)) | |
| 57 continue; | |
| 58 | |
| 59 std::vector<appcache::AppCacheDatabase::GroupRecord> groups; | |
| 60 database->FindGroupsForOrigin(*origin, &groups); | |
| 61 std::vector<appcache::AppCacheDatabase::GroupRecord>::const_iterator group; | |
| 62 for (group = groups.begin(); group != groups.end(); ++group) { | |
| 63 sql::Transaction transaction(connection); | |
| 64 if (!transaction.Begin()) { | |
| 65 NOTREACHED() << "Failed to start transaction"; | |
| 66 return; | |
| 67 } | |
| 68 | |
| 69 bool success = false; | |
| 70 | |
| 71 // 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
| |
| 72 appcache::AppCacheDatabase::CacheRecord cache_record; | |
| 73 if (database->FindCacheForGroup(group->group_id, &cache_record)) { | |
| 74 std::vector<int64> response_ids; | |
| 75 database->FindResponseIdsForCacheAsVector(cache_record.cache_id, | |
| 76 &response_ids); | |
| 77 success = | |
| 78 database->DeleteGroup(group->group_id) && | |
| 79 database->DeleteCache(cache_record.cache_id) && | |
| 80 database->DeleteEntriesForCache(cache_record.cache_id) && | |
| 81 database->DeleteFallbackNameSpacesForCache(cache_record.cache_id) && | |
| 82 database->DeleteOnlineWhiteListForCache(cache_record.cache_id) && | |
| 83 database->InsertDeletableResponseIds(response_ids); | |
| 84 } else { | |
| 85 NOTREACHED() << "A existing group without a cache is unexpected"; | |
| 86 success = database->DeleteGroup(group->group_id); | |
| 87 } | |
| 88 | |
| 89 success = success && transaction.Commit(); | |
| 90 DCHECK(success); | |
| 91 } // for each group | |
| 92 } // for each origin | |
| 37 } | 93 } |
| 38 | 94 |
| 95 } // namespace | |
| 96 | |
| 39 namespace appcache { | 97 namespace appcache { |
| 40 | 98 |
| 41 // Hard coded default when not using quota management. | 99 // Hard coded default when not using quota management. |
| 42 static const int kDefaultQuota = 5 * 1024 * 1024; | 100 static const int kDefaultQuota = 5 * 1024 * 1024; |
| 43 | 101 |
| 44 static const int kMaxDiskCacheSize = 250 * 1024 * 1024; | 102 static const int kMaxDiskCacheSize = 250 * 1024 * 1024; |
| 45 static const int kMaxMemDiskCacheSize = 10 * 1024 * 1024; | 103 static const int kMaxMemDiskCacheSize = 10 * 1024 * 1024; |
| 46 static const FilePath::CharType kDiskCacheDirectoryName[] = | 104 static const FilePath::CharType kDiskCacheDirectoryName[] = |
| 47 FILE_PATH_LITERAL("Cache"); | 105 FILE_PATH_LITERAL("Cache"); |
| 48 | 106 |
| (...skipping 1032 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1081 AppCacheStorageImpl::~AppCacheStorageImpl() { | 1139 AppCacheStorageImpl::~AppCacheStorageImpl() { |
| 1082 STLDeleteElements(&pending_simple_tasks_); | 1140 STLDeleteElements(&pending_simple_tasks_); |
| 1083 | 1141 |
| 1084 std::for_each(pending_quota_queries_.begin(), | 1142 std::for_each(pending_quota_queries_.begin(), |
| 1085 pending_quota_queries_.end(), | 1143 pending_quota_queries_.end(), |
| 1086 std::mem_fun(&DatabaseTask::CancelCompletion)); | 1144 std::mem_fun(&DatabaseTask::CancelCompletion)); |
| 1087 std::for_each(scheduled_database_tasks_.begin(), | 1145 std::for_each(scheduled_database_tasks_.begin(), |
| 1088 scheduled_database_tasks_.end(), | 1146 scheduled_database_tasks_.end(), |
| 1089 std::mem_fun(&DatabaseTask::CancelCompletion)); | 1147 std::mem_fun(&DatabaseTask::CancelCompletion)); |
| 1090 | 1148 |
| 1149 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.
| |
| 1150 AppCacheThread::PostTask( | |
| 1151 AppCacheThread::db(), | |
| 1152 FROM_HERE, | |
| 1153 NewRunnableFunction( | |
| 1154 ClearOnExit, | |
| 1155 database_, | |
| 1156 make_scoped_refptr(service_->special_storage_policy()))); | |
| 1157 | |
| 1158 } | |
| 1091 if (database_) | 1159 if (database_) |
| 1092 AppCacheThread::DeleteSoon(AppCacheThread::db(), FROM_HERE, database_); | 1160 AppCacheThread::DeleteSoon(AppCacheThread::db(), FROM_HERE, database_); |
| 1093 } | 1161 } |
| 1094 | 1162 |
| 1095 void AppCacheStorageImpl::Initialize(const FilePath& cache_directory, | 1163 void AppCacheStorageImpl::Initialize(const FilePath& cache_directory, |
| 1096 base::MessageLoopProxy* cache_thread) { | 1164 base::MessageLoopProxy* cache_thread) { |
| 1097 cache_directory_ = cache_directory; | 1165 cache_directory_ = cache_directory; |
| 1098 cache_thread_ = cache_thread; | 1166 cache_thread_ = cache_thread; |
| 1099 is_incognito_ = cache_directory_.empty(); | 1167 is_incognito_ = cache_directory_.empty(); |
| 1100 | 1168 |
| (...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1571 Disable(); | 1639 Disable(); |
| 1572 if (!is_incognito_) { | 1640 if (!is_incognito_) { |
| 1573 VLOG(1) << "Deleting existing appcache data and starting over."; | 1641 VLOG(1) << "Deleting existing appcache data and starting over."; |
| 1574 AppCacheThread::PostTask(AppCacheThread::db(), FROM_HERE, | 1642 AppCacheThread::PostTask(AppCacheThread::db(), FROM_HERE, |
| 1575 NewRunnableFunction(DeleteDirectory, cache_directory_)); | 1643 NewRunnableFunction(DeleteDirectory, cache_directory_)); |
| 1576 } | 1644 } |
| 1577 } | 1645 } |
| 1578 } | 1646 } |
| 1579 | 1647 |
| 1580 } // namespace appcache | 1648 } // namespace appcache |
| OLD | NEW |