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

Side by Side 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: Moving test helpers to webkit/appcache. 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/appcache/appcache_storage_impl.h ('k') | webkit/appcache/appcache_test_helper.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 {
33 // Helper with no return value for use with NewRunnableFunction.
34 void DeleteDirectory(const FilePath& path) {
35 file_util::Delete(path, true);
36 }
37 }
38
39 namespace appcache { 32 namespace appcache {
40 33
41 // Hard coded default when not using quota management. 34 // Hard coded default when not using quota management.
42 static const int kDefaultQuota = 5 * 1024 * 1024; 35 static const int kDefaultQuota = 5 * 1024 * 1024;
43 36
44 static const int kMaxDiskCacheSize = 250 * 1024 * 1024; 37 static const int kMaxDiskCacheSize = 250 * 1024 * 1024;
45 static const int kMaxMemDiskCacheSize = 10 * 1024 * 1024; 38 static const int kMaxMemDiskCacheSize = 10 * 1024 * 1024;
46 static const FilePath::CharType kDiskCacheDirectoryName[] = 39 static const FilePath::CharType kDiskCacheDirectoryName[] =
47 FILE_PATH_LITERAL("Cache"); 40 FILE_PATH_LITERAL("Cache");
48 41
42 namespace {
43 // Helper with no return value for use with NewRunnableFunction.
44 void DeleteDirectory(const FilePath& path) {
45 file_util::Delete(path, true);
46 }
47
48 // Helpers for clearing data from the AppCacheDatabase.
49 bool DeleteGroupAndRelatedRecords(AppCacheDatabase* database,
50 int64 group_id,
51 std::vector<int64>* deletable_response_ids) {
52 AppCacheDatabase::CacheRecord cache_record;
53 bool success = false;
54 if (database->FindCacheForGroup(group_id, &cache_record)) {
55 database->FindResponseIdsForCacheAsVector(cache_record.cache_id,
56 deletable_response_ids);
57 success =
58 database->DeleteGroup(group_id) &&
59 database->DeleteCache(cache_record.cache_id) &&
60 database->DeleteEntriesForCache(cache_record.cache_id) &&
61 database->DeleteFallbackNameSpacesForCache(cache_record.cache_id) &&
62 database->DeleteOnlineWhiteListForCache(cache_record.cache_id) &&
63 database->InsertDeletableResponseIds(*deletable_response_ids);
64 } else {
65 NOTREACHED() << "A existing group without a cache is unexpected";
66 success = database->DeleteGroup(group_id);
67 }
68 return success;
69 }
70
71 void ClearOnExit(
72 AppCacheDatabase* database,
73 scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy) {
74 std::set<GURL> origins;
75 database->FindOriginsWithGroups(&origins);
76 if (origins.empty())
77 return; // nothing to delete
78
79 sql::Connection* connection = database->db_connection();
80 if (!connection) {
81 NOTREACHED() << "Missing database connection.";
82 return;
83 }
84
85 std::set<GURL>::const_iterator origin;
86 for (origin = origins.begin(); origin != origins.end(); ++origin) {
87 if (special_storage_policy &&
88 special_storage_policy->IsStorageProtected(*origin))
89 continue;
90
91 std::vector<AppCacheDatabase::GroupRecord> groups;
92 database->FindGroupsForOrigin(*origin, &groups);
93 std::vector<AppCacheDatabase::GroupRecord>::const_iterator group;
94 for (group = groups.begin(); group != groups.end(); ++group) {
95 sql::Transaction transaction(connection);
96 if (!transaction.Begin()) {
97 NOTREACHED() << "Failed to start transaction";
98 return;
99 }
100 std::vector<int64> deletable_response_ids;
101 bool success = DeleteGroupAndRelatedRecords(database,
102 group->group_id,
103 &deletable_response_ids);
104 success = success && transaction.Commit();
105 DCHECK(success);
106 } // for each group
107 } // for each origin
108 }
109
110 } // namespace
111
49 // DatabaseTask ----------------------------------------- 112 // DatabaseTask -----------------------------------------
50 113
51 class AppCacheStorageImpl::DatabaseTask 114 class AppCacheStorageImpl::DatabaseTask
52 : public base::RefCountedThreadSafe<DatabaseTask> { 115 : public base::RefCountedThreadSafe<DatabaseTask> {
53 public: 116 public:
54 explicit DatabaseTask(AppCacheStorageImpl* storage) 117 explicit DatabaseTask(AppCacheStorageImpl* storage)
55 : storage_(storage), database_(storage->database_) {} 118 : storage_(storage), database_(storage->database_) {}
56 119
57 virtual ~DatabaseTask() {} 120 virtual ~DatabaseTask() {}
58 121
(...skipping 875 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 997
935 AppCacheDatabase::GroupRecord group_record; 998 AppCacheDatabase::GroupRecord group_record;
936 if (!database_->FindGroup(group_id_, &group_record)) { 999 if (!database_->FindGroup(group_id_, &group_record)) {
937 // This group doesn't exists in the database, nothing todo here. 1000 // This group doesn't exists in the database, nothing todo here.
938 new_origin_usage_ = database_->GetOriginUsage(origin_); 1001 new_origin_usage_ = database_->GetOriginUsage(origin_);
939 success_ = true; 1002 success_ = true;
940 return; 1003 return;
941 } 1004 }
942 1005
943 DCHECK_EQ(group_record.origin, origin_); 1006 DCHECK_EQ(group_record.origin, origin_);
944 1007 success_ = DeleteGroupAndRelatedRecords(database_,
945 AppCacheDatabase::CacheRecord cache_record; 1008 group_id_,
946 if (database_->FindCacheForGroup(group_id_, &cache_record)) { 1009 &newly_deletable_response_ids_);
947 database_->FindResponseIdsForCacheAsVector(cache_record.cache_id,
948 &newly_deletable_response_ids_);
949 success_ =
950 database_->DeleteGroup(group_id_) &&
951 database_->DeleteCache(cache_record.cache_id) &&
952 database_->DeleteEntriesForCache(cache_record.cache_id) &&
953 database_->DeleteFallbackNameSpacesForCache(cache_record.cache_id) &&
954 database_->DeleteOnlineWhiteListForCache(cache_record.cache_id) &&
955 database_->InsertDeletableResponseIds(newly_deletable_response_ids_);
956 } else {
957 NOTREACHED() << "A existing group without a cache is unexpected";
958 success_ = database_->DeleteGroup(group_id_);
959 }
960 1010
961 new_origin_usage_ = database_->GetOriginUsage(origin_); 1011 new_origin_usage_ = database_->GetOriginUsage(origin_);
962 success_ = success_ && transaction.Commit(); 1012 success_ = success_ && transaction.Commit();
963 } 1013 }
964 1014
965 void AppCacheStorageImpl::MakeGroupObsoleteTask::RunCompleted() { 1015 void AppCacheStorageImpl::MakeGroupObsoleteTask::RunCompleted() {
966 if (success_) { 1016 if (success_) {
967 group_->set_obsolete(true); 1017 group_->set_obsolete(true);
968 if (!storage_->is_disabled()) { 1018 if (!storage_->is_disabled()) {
969 storage_->UpdateUsageMapAndNotify(origin_, new_origin_usage_); 1019 storage_->UpdateUsageMapAndNotify(origin_, new_origin_usage_);
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
1081 AppCacheStorageImpl::~AppCacheStorageImpl() { 1131 AppCacheStorageImpl::~AppCacheStorageImpl() {
1082 STLDeleteElements(&pending_simple_tasks_); 1132 STLDeleteElements(&pending_simple_tasks_);
1083 1133
1084 std::for_each(pending_quota_queries_.begin(), 1134 std::for_each(pending_quota_queries_.begin(),
1085 pending_quota_queries_.end(), 1135 pending_quota_queries_.end(),
1086 std::mem_fun(&DatabaseTask::CancelCompletion)); 1136 std::mem_fun(&DatabaseTask::CancelCompletion));
1087 std::for_each(scheduled_database_tasks_.begin(), 1137 std::for_each(scheduled_database_tasks_.begin(),
1088 scheduled_database_tasks_.end(), 1138 scheduled_database_tasks_.end(),
1089 std::mem_fun(&DatabaseTask::CancelCompletion)); 1139 std::mem_fun(&DatabaseTask::CancelCompletion));
1090 1140
1091 if (database_) 1141 if (database_) {
1142 if (service()->clear_local_state_on_exit()) {
1143 AppCacheThread::PostTask(
1144 AppCacheThread::db(),
1145 FROM_HERE,
1146 NewRunnableFunction(
1147 ClearOnExit,
1148 database_,
1149 make_scoped_refptr(service_->special_storage_policy())));
1150 }
1092 AppCacheThread::DeleteSoon(AppCacheThread::db(), FROM_HERE, database_); 1151 AppCacheThread::DeleteSoon(AppCacheThread::db(), FROM_HERE, database_);
1152 }
1093 } 1153 }
1094 1154
1095 void AppCacheStorageImpl::Initialize(const FilePath& cache_directory, 1155 void AppCacheStorageImpl::Initialize(const FilePath& cache_directory,
1096 base::MessageLoopProxy* cache_thread) { 1156 base::MessageLoopProxy* cache_thread) {
1097 cache_directory_ = cache_directory; 1157 cache_directory_ = cache_directory;
1098 cache_thread_ = cache_thread; 1158 cache_thread_ = cache_thread;
1099 is_incognito_ = cache_directory_.empty(); 1159 is_incognito_ = cache_directory_.empty();
1100 1160
1101 FilePath db_file_path; 1161 FilePath db_file_path;
1102 if (!is_incognito_) 1162 if (!is_incognito_)
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after
1571 Disable(); 1631 Disable();
1572 if (!is_incognito_) { 1632 if (!is_incognito_) {
1573 VLOG(1) << "Deleting existing appcache data and starting over."; 1633 VLOG(1) << "Deleting existing appcache data and starting over.";
1574 AppCacheThread::PostTask(AppCacheThread::db(), FROM_HERE, 1634 AppCacheThread::PostTask(AppCacheThread::db(), FROM_HERE,
1575 NewRunnableFunction(DeleteDirectory, cache_directory_)); 1635 NewRunnableFunction(DeleteDirectory, cache_directory_));
1576 } 1636 }
1577 } 1637 }
1578 } 1638 }
1579 1639
1580 } // namespace appcache 1640 } // namespace appcache
OLDNEW
« no previous file with comments | « webkit/appcache/appcache_storage_impl.h ('k') | webkit/appcache/appcache_test_helper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698