| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "content/browser/cache_storage/cache_storage_cache.h" | 5 #include "content/browser/cache_storage/cache_storage_cache.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 | 236 |
| 237 // The context holding open entries. | 237 // The context holding open entries. |
| 238 scoped_ptr<OpenAllEntriesContext> entries_context; | 238 scoped_ptr<OpenAllEntriesContext> entries_context; |
| 239 | 239 |
| 240 private: | 240 private: |
| 241 DISALLOW_COPY_AND_ASSIGN(MatchAllContext); | 241 DISALLOW_COPY_AND_ASSIGN(MatchAllContext); |
| 242 }; | 242 }; |
| 243 | 243 |
| 244 // The state needed to pass between CacheStorageCache::Keys callbacks. | 244 // The state needed to pass between CacheStorageCache::Keys callbacks. |
| 245 struct CacheStorageCache::KeysContext { | 245 struct CacheStorageCache::KeysContext { |
| 246 explicit KeysContext(const CacheStorageCache::RequestsCallback& callback) | 246 explicit KeysContext(scoped_ptr<ServiceWorkerFetchRequest> request, |
| 247 : original_callback(callback), out_keys(new Requests()) {} | 247 const CacheStorageCacheQueryParams& match_params, |
| 248 const CacheStorageCache::RequestsCallback& callback) |
| 249 : request(std::move(request)), |
| 250 options(match_params), |
| 251 original_callback(callback), |
| 252 out_keys(new Requests()) {} |
| 248 ~KeysContext() {} | 253 ~KeysContext() {} |
| 249 | 254 |
| 255 scoped_ptr<ServiceWorkerFetchRequest> request; |
| 256 |
| 257 CacheStorageCacheQueryParams options; |
| 258 |
| 250 // The callback passed to the Keys() function. | 259 // The callback passed to the Keys() function. |
| 251 RequestsCallback original_callback; | 260 RequestsCallback original_callback; |
| 252 | 261 |
| 253 // The output of the Keys function. | 262 // The output of the Keys function. |
| 254 scoped_ptr<Requests> out_keys; | 263 scoped_ptr<Requests> out_keys; |
| 255 | 264 |
| 256 // The context holding open entries. | 265 // The context holding open entries. |
| 257 scoped_ptr<OpenAllEntriesContext> entries_context; | 266 scoped_ptr<OpenAllEntriesContext> entries_context; |
| 258 | 267 |
| 259 private: | 268 private: |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 barrier_closure.Run(); | 410 barrier_closure.Run(); |
| 402 } | 411 } |
| 403 | 412 |
| 404 void CacheStorageCache::BatchDidAllOperations( | 413 void CacheStorageCache::BatchDidAllOperations( |
| 405 scoped_ptr<ErrorCallback> callback) { | 414 scoped_ptr<ErrorCallback> callback) { |
| 406 if (callback->is_null()) | 415 if (callback->is_null()) |
| 407 return; | 416 return; |
| 408 callback->Run(CACHE_STORAGE_OK); | 417 callback->Run(CACHE_STORAGE_OK); |
| 409 } | 418 } |
| 410 | 419 |
| 411 void CacheStorageCache::Keys(const RequestsCallback& callback) { | 420 void CacheStorageCache::Keys(scoped_ptr<ServiceWorkerFetchRequest> request, |
| 421 const CacheStorageCacheQueryParams& match_params, |
| 422 const RequestsCallback& callback) { |
| 412 if (!LazyInitialize()) { | 423 if (!LazyInitialize()) { |
| 413 callback.Run(CACHE_STORAGE_ERROR_STORAGE, scoped_ptr<Requests>()); | 424 callback.Run(CACHE_STORAGE_ERROR_STORAGE, scoped_ptr<Requests>()); |
| 414 return; | 425 return; |
| 415 } | 426 } |
| 416 | 427 |
| 417 RequestsCallback pending_callback = | 428 RequestsCallback pending_callback = |
| 418 base::Bind(&CacheStorageCache::PendingRequestsCallback, | 429 base::Bind(&CacheStorageCache::PendingRequestsCallback, |
| 419 weak_ptr_factory_.GetWeakPtr(), callback); | 430 weak_ptr_factory_.GetWeakPtr(), callback); |
| 420 scheduler_->ScheduleOperation(base::Bind(&CacheStorageCache::KeysImpl, | 431 |
| 421 weak_ptr_factory_.GetWeakPtr(), | 432 scoped_ptr<KeysContext> keys_context( |
| 422 pending_callback)); | 433 new KeysContext(std::move(request), match_params, pending_callback)); |
| 434 scheduler_->ScheduleOperation( |
| 435 base::Bind(&CacheStorageCache::KeysImpl, weak_ptr_factory_.GetWeakPtr(), |
| 436 base::Passed(std::move(keys_context)))); |
| 423 } | 437 } |
| 424 | 438 |
| 425 void CacheStorageCache::Close(const base::Closure& callback) { | 439 void CacheStorageCache::Close(const base::Closure& callback) { |
| 426 DCHECK_NE(BACKEND_CLOSED, backend_state_) | 440 DCHECK_NE(BACKEND_CLOSED, backend_state_) |
| 427 << "Was CacheStorageCache::Close() called twice?"; | 441 << "Was CacheStorageCache::Close() called twice?"; |
| 428 | 442 |
| 429 base::Closure pending_callback = | 443 base::Closure pending_callback = |
| 430 base::Bind(&CacheStorageCache::PendingClosure, | 444 base::Bind(&CacheStorageCache::PendingClosure, |
| 431 weak_ptr_factory_.GetWeakPtr(), callback); | 445 weak_ptr_factory_.GetWeakPtr(), callback); |
| 432 | 446 |
| (...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1111 DCHECK(entry_ptr); | 1125 DCHECK(entry_ptr); |
| 1112 disk_cache::ScopedEntryPtr entry(*entry_ptr); | 1126 disk_cache::ScopedEntryPtr entry(*entry_ptr); |
| 1113 | 1127 |
| 1114 entry->Doom(); | 1128 entry->Doom(); |
| 1115 entry.reset(); | 1129 entry.reset(); |
| 1116 | 1130 |
| 1117 UpdateCacheSize(); | 1131 UpdateCacheSize(); |
| 1118 callback.Run(CACHE_STORAGE_OK); | 1132 callback.Run(CACHE_STORAGE_OK); |
| 1119 } | 1133 } |
| 1120 | 1134 |
| 1121 void CacheStorageCache::KeysImpl(const RequestsCallback& callback) { | 1135 void CacheStorageCache::KeysImpl(scoped_ptr<KeysContext> keys_context) { |
| 1122 DCHECK_NE(BACKEND_UNINITIALIZED, backend_state_); | 1136 DCHECK_NE(BACKEND_UNINITIALIZED, backend_state_); |
| 1123 if (backend_state_ != BACKEND_OPEN) { | 1137 if (backend_state_ != BACKEND_OPEN) { |
| 1124 callback.Run(CACHE_STORAGE_ERROR_STORAGE, scoped_ptr<Requests>()); | 1138 keys_context->original_callback.Run(CACHE_STORAGE_ERROR_STORAGE, |
| 1139 scoped_ptr<Requests>()); |
| 1125 return; | 1140 return; |
| 1126 } | 1141 } |
| 1127 | 1142 |
| 1128 // 1. Iterate through all of the entries, open them, and add them to a vector. | 1143 // 1. Iterate through all of the entries, open them, and add them to a vector. |
| 1129 // 2. For each open entry: | 1144 // 2. For each open entry: |
| 1130 // 2.1. Read the headers into a protobuf. | 1145 // 2.1. Read the headers into a protobuf. |
| 1131 // 2.2. Copy the protobuf into a ServiceWorkerFetchRequest (a "key"). | 1146 // 2.2. Copy the protobuf into a ServiceWorkerFetchRequest (a "key"). |
| 1132 // 2.3. Push the response into a vector of requests to be returned. | 1147 // 2.3. Push the response into a vector of requests to be returned. |
| 1133 // 3. Return the vector of requests (keys). | 1148 // 3. Return the vector of requests (keys). |
| 1134 | 1149 |
| 1135 // The entries have to be loaded into a vector first because enumeration loops | 1150 // The entries have to be loaded into a vector first because enumeration loops |
| 1136 // forever if you read data from a cache entry while enumerating. | 1151 // forever if you read data from a cache entry while enumerating. |
| 1137 | 1152 |
| 1138 OpenAllEntries(base::Bind(&CacheStorageCache::KeysDidOpenAllEntries, | 1153 OpenAllEntries(base::Bind(&CacheStorageCache::KeysDidOpenAllEntries, |
| 1139 weak_ptr_factory_.GetWeakPtr(), callback)); | 1154 weak_ptr_factory_.GetWeakPtr(), |
| 1155 base::Passed(std::move(keys_context)))); |
| 1140 } | 1156 } |
| 1141 | 1157 |
| 1142 void CacheStorageCache::KeysDidOpenAllEntries( | 1158 void CacheStorageCache::KeysDidOpenAllEntries( |
| 1143 const RequestsCallback& callback, | 1159 scoped_ptr<KeysContext> keys_context, |
| 1144 scoped_ptr<OpenAllEntriesContext> entries_context, | 1160 scoped_ptr<OpenAllEntriesContext> entries_context, |
| 1145 CacheStorageError error) { | 1161 CacheStorageError error) { |
| 1146 if (error != CACHE_STORAGE_OK) { | 1162 if (error != CACHE_STORAGE_OK) { |
| 1147 callback.Run(error, scoped_ptr<Requests>()); | 1163 keys_context->original_callback.Run(error, scoped_ptr<Requests>()); |
| 1148 return; | 1164 return; |
| 1149 } | 1165 } |
| 1150 | 1166 |
| 1151 scoped_ptr<KeysContext> keys_context(new KeysContext(callback)); | |
| 1152 keys_context->entries_context.swap(entries_context); | 1167 keys_context->entries_context.swap(entries_context); |
| 1153 Entries::iterator iter = keys_context->entries_context->entries.begin(); | 1168 Entries::iterator iter = keys_context->entries_context->entries.begin(); |
| 1154 KeysProcessNextEntry(std::move(keys_context), iter); | 1169 KeysProcessNextEntry(std::move(keys_context), iter); |
| 1155 } | 1170 } |
| 1156 | 1171 |
| 1157 void CacheStorageCache::KeysProcessNextEntry( | 1172 void CacheStorageCache::KeysProcessNextEntry( |
| 1158 scoped_ptr<KeysContext> keys_context, | 1173 scoped_ptr<KeysContext> keys_context, |
| 1159 const Entries::iterator& iter) { | 1174 const Entries::iterator& iter) { |
| 1160 if (iter == keys_context->entries_context->entries.end()) { | 1175 if (iter == keys_context->entries_context->entries.end()) { |
| 1161 // All done. Return all of the keys. | 1176 // All done. Return all of the keys. |
| 1162 keys_context->original_callback.Run(CACHE_STORAGE_OK, | 1177 keys_context->original_callback.Run(CACHE_STORAGE_OK, |
| 1163 std::move(keys_context->out_keys)); | 1178 std::move(keys_context->out_keys)); |
| 1164 return; | 1179 return; |
| 1165 } | 1180 } |
| 1166 | 1181 |
| 1182 if (keys_context->options.ignore_search) { |
| 1183 DCHECK(keys_context->request); |
| 1184 disk_cache::Entry* entry(*iter); |
| 1185 if (RemoveQueryParam(keys_context->request->url) != |
| 1186 RemoveQueryParam(GURL(entry->GetKey()))) { |
| 1187 KeysProcessNextEntry(std::move(keys_context), iter + 1); |
| 1188 return; |
| 1189 } |
| 1190 } |
| 1191 |
| 1167 ReadMetadata(*iter, base::Bind(&CacheStorageCache::KeysDidReadMetadata, | 1192 ReadMetadata(*iter, base::Bind(&CacheStorageCache::KeysDidReadMetadata, |
| 1168 weak_ptr_factory_.GetWeakPtr(), | 1193 weak_ptr_factory_.GetWeakPtr(), |
| 1169 base::Passed(std::move(keys_context)), iter)); | 1194 base::Passed(std::move(keys_context)), iter)); |
| 1170 } | 1195 } |
| 1171 | 1196 |
| 1172 void CacheStorageCache::KeysDidReadMetadata( | 1197 void CacheStorageCache::KeysDidReadMetadata( |
| 1173 scoped_ptr<KeysContext> keys_context, | 1198 scoped_ptr<KeysContext> keys_context, |
| 1174 const Entries::iterator& iter, | 1199 const Entries::iterator& iter, |
| 1175 scoped_ptr<CacheMetadata> metadata) { | 1200 scoped_ptr<CacheMetadata> metadata) { |
| 1176 disk_cache::Entry* entry = *iter; | 1201 disk_cache::Entry* entry = *iter; |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1392 storage::BlobDataBuilder blob_data(response->blob_uuid); | 1417 storage::BlobDataBuilder blob_data(response->blob_uuid); |
| 1393 | 1418 |
| 1394 disk_cache::Entry* temp_entry = entry.get(); | 1419 disk_cache::Entry* temp_entry = entry.get(); |
| 1395 blob_data.AppendDiskCacheEntry( | 1420 blob_data.AppendDiskCacheEntry( |
| 1396 new CacheStorageCacheDataHandle(this, std::move(entry)), temp_entry, | 1421 new CacheStorageCacheDataHandle(this, std::move(entry)), temp_entry, |
| 1397 INDEX_RESPONSE_BODY); | 1422 INDEX_RESPONSE_BODY); |
| 1398 return blob_storage_context_->AddFinishedBlob(&blob_data); | 1423 return blob_storage_context_->AddFinishedBlob(&blob_data); |
| 1399 } | 1424 } |
| 1400 | 1425 |
| 1401 } // namespace content | 1426 } // namespace content |
| OLD | NEW |