| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <functional> | 8 #include <functional> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 database->DeleteOnlineWhiteListForCache(cache_record.cache_id) && | 68 database->DeleteOnlineWhiteListForCache(cache_record.cache_id) && |
| 69 database->InsertDeletableResponseIds(*deletable_response_ids); | 69 database->InsertDeletableResponseIds(*deletable_response_ids); |
| 70 } else { | 70 } else { |
| 71 NOTREACHED() << "A existing group without a cache is unexpected"; | 71 NOTREACHED() << "A existing group without a cache is unexpected"; |
| 72 success = database->DeleteGroup(group_id); | 72 success = database->DeleteGroup(group_id); |
| 73 } | 73 } |
| 74 return success; | 74 return success; |
| 75 } | 75 } |
| 76 | 76 |
| 77 // Destroys |database|. If there is appcache data to be deleted | 77 // Destroys |database|. If there is appcache data to be deleted |
| 78 // (|save_session_state| is false), deletes all appcache data (if | 78 // (|force_keep_session_state| is false), deletes session-only appcache data. |
| 79 // |clear_all_data| is true), or session-only appcache data (otherwise). | 79 void ClearSessionOnlyOrigins( |
| 80 void CleanUpOnDatabaseThread( | |
| 81 AppCacheDatabase* database, | 80 AppCacheDatabase* database, |
| 82 scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy, | 81 scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy, |
| 83 bool clear_all_appcaches, | 82 bool force_keep_session_state) { |
| 84 bool save_session_state) { | |
| 85 scoped_ptr<AppCacheDatabase> database_to_delete(database); | 83 scoped_ptr<AppCacheDatabase> database_to_delete(database); |
| 86 | 84 |
| 87 // If saving session state, only delete the database. | 85 // If saving session state, only delete the database. |
| 88 if (save_session_state) | 86 if (force_keep_session_state) |
| 89 return; | 87 return; |
| 90 | 88 |
| 91 bool has_session_only_appcaches = | 89 bool has_session_only_appcaches = |
| 92 special_storage_policy.get() && | 90 special_storage_policy.get() && |
| 93 special_storage_policy->HasSessionOnlyOrigins(); | 91 special_storage_policy->HasSessionOnlyOrigins(); |
| 94 | 92 |
| 95 // Clearning only session-only databases, and there are none. | 93 // Clearning only session-only databases, and there are none. |
| 96 if (!clear_all_appcaches && !has_session_only_appcaches) | 94 if (!has_session_only_appcaches) |
| 97 return; | 95 return; |
| 98 | 96 |
| 99 std::set<GURL> origins; | 97 std::set<GURL> origins; |
| 100 database->FindOriginsWithGroups(&origins); | 98 database->FindOriginsWithGroups(&origins); |
| 101 if (origins.empty()) | 99 if (origins.empty()) |
| 102 return; // nothing to delete | 100 return; // nothing to delete |
| 103 | 101 |
| 104 sql::Connection* connection = database->db_connection(); | 102 sql::Connection* connection = database->db_connection(); |
| 105 if (!connection) { | 103 if (!connection) { |
| 106 NOTREACHED() << "Missing database connection."; | 104 NOTREACHED() << "Missing database connection."; |
| 107 return; | 105 return; |
| 108 } | 106 } |
| 109 | 107 |
| 110 std::set<GURL>::const_iterator origin; | 108 std::set<GURL>::const_iterator origin; |
| 111 for (origin = origins.begin(); origin != origins.end(); ++origin) { | 109 for (origin = origins.begin(); origin != origins.end(); ++origin) { |
| 112 if (!clear_all_appcaches && | 110 if (!special_storage_policy->IsStorageSessionOnly(*origin)) |
| 113 !special_storage_policy->IsStorageSessionOnly(*origin)) | |
| 114 continue; | 111 continue; |
| 115 if (special_storage_policy && | 112 if (special_storage_policy && |
| 116 special_storage_policy->IsStorageProtected(*origin)) | 113 special_storage_policy->IsStorageProtected(*origin)) |
| 117 continue; | 114 continue; |
| 118 | 115 |
| 119 std::vector<AppCacheDatabase::GroupRecord> groups; | 116 std::vector<AppCacheDatabase::GroupRecord> groups; |
| 120 database->FindGroupsForOrigin(*origin, &groups); | 117 database->FindGroupsForOrigin(*origin, &groups); |
| 121 std::vector<AppCacheDatabase::GroupRecord>::const_iterator group; | 118 std::vector<AppCacheDatabase::GroupRecord>::const_iterator group; |
| 122 for (group = groups.begin(); group != groups.end(); ++group) { | 119 for (group = groups.begin(); group != groups.end(); ++group) { |
| 123 sql::Transaction transaction(connection); | 120 sql::Transaction transaction(connection); |
| (...skipping 1184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1308 std::for_each(pending_quota_queries_.begin(), | 1305 std::for_each(pending_quota_queries_.begin(), |
| 1309 pending_quota_queries_.end(), | 1306 pending_quota_queries_.end(), |
| 1310 std::mem_fun(&DatabaseTask::CancelCompletion)); | 1307 std::mem_fun(&DatabaseTask::CancelCompletion)); |
| 1311 std::for_each(scheduled_database_tasks_.begin(), | 1308 std::for_each(scheduled_database_tasks_.begin(), |
| 1312 scheduled_database_tasks_.end(), | 1309 scheduled_database_tasks_.end(), |
| 1313 std::mem_fun(&DatabaseTask::CancelCompletion)); | 1310 std::mem_fun(&DatabaseTask::CancelCompletion)); |
| 1314 | 1311 |
| 1315 if (database_ && | 1312 if (database_ && |
| 1316 !db_thread_->PostTask( | 1313 !db_thread_->PostTask( |
| 1317 FROM_HERE, | 1314 FROM_HERE, |
| 1318 base::Bind(&CleanUpOnDatabaseThread, database_, | 1315 base::Bind(&ClearSessionOnlyOrigins, database_, |
| 1319 make_scoped_refptr(service_->special_storage_policy()), | 1316 make_scoped_refptr(service_->special_storage_policy()), |
| 1320 service()->clear_local_state_on_exit(), | 1317 service()->force_keep_session_state()))) { |
| 1321 service()->save_session_state()))) { | |
| 1322 delete database_; | 1318 delete database_; |
| 1323 } | 1319 } |
| 1324 } | 1320 } |
| 1325 | 1321 |
| 1326 void AppCacheStorageImpl::Initialize(const FilePath& cache_directory, | 1322 void AppCacheStorageImpl::Initialize(const FilePath& cache_directory, |
| 1327 base::MessageLoopProxy* db_thread, | 1323 base::MessageLoopProxy* db_thread, |
| 1328 base::MessageLoopProxy* cache_thread) { | 1324 base::MessageLoopProxy* cache_thread) { |
| 1329 DCHECK(db_thread); | 1325 DCHECK(db_thread); |
| 1330 | 1326 |
| 1331 cache_directory_ = cache_directory; | 1327 cache_directory_ = cache_directory; |
| (...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1813 Disable(); | 1809 Disable(); |
| 1814 if (!is_incognito_) { | 1810 if (!is_incognito_) { |
| 1815 VLOG(1) << "Deleting existing appcache data and starting over."; | 1811 VLOG(1) << "Deleting existing appcache data and starting over."; |
| 1816 db_thread_->PostTask( | 1812 db_thread_->PostTask( |
| 1817 FROM_HERE, base::Bind(&DeleteDirectory, cache_directory_)); | 1813 FROM_HERE, base::Bind(&DeleteDirectory, cache_directory_)); |
| 1818 } | 1814 } |
| 1819 } | 1815 } |
| 1820 } | 1816 } |
| 1821 | 1817 |
| 1822 } // namespace appcache | 1818 } // namespace appcache |
| OLD | NEW |