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

Side by Side Diff: content/browser/service_worker/service_worker_cache_storage.cc

Issue 503823002: Creates CacheContext for ServiceWorkerCacheStorage (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addresses comments from PS4 Created 6 years, 3 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
OLDNEW
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/service_worker/service_worker_cache_storage.h" 5 #include "content/browser/service_worker/service_worker_cache_storage.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/files/memory_mapped_file.h" 10 #include "base/files/memory_mapped_file.h"
11 #include "base/memory/ref_counted.h" 11 #include "base/memory/ref_counted.h"
12 #include "base/sha1.h" 12 #include "base/sha1.h"
13 #include "base/stl_util.h"
13 #include "base/strings/string_number_conversions.h" 14 #include "base/strings/string_number_conversions.h"
14 #include "base/strings/string_util.h" 15 #include "base/strings/string_util.h"
15 #include "content/browser/service_worker/service_worker_cache.h" 16 #include "content/browser/service_worker/service_worker_cache.h"
16 #include "content/browser/service_worker/service_worker_cache.pb.h" 17 #include "content/browser/service_worker/service_worker_cache.pb.h"
17 #include "content/public/browser/browser_thread.h" 18 #include "content/public/browser/browser_thread.h"
18 #include "net/base/directory_lister.h" 19 #include "net/base/directory_lister.h"
19 #include "net/base/net_errors.h" 20 #include "net/base/net_errors.h"
20 #include "webkit/browser/blob/blob_storage_context.h" 21 #include "webkit/browser/blob/blob_storage_context.h"
21 22
22 namespace content { 23 namespace content {
23 24
25 // static
26 const int ServiceWorkerCacheStorage::kInvalidCacheID = -1;
27
28 // The meta information related to each ServiceWorkerCache that the
29 // ServiceWorkerCacheManager needs to keep track of.
30 // TODO(jkarlin): Add reference counting so that the deletion of javascript
31 // objects can delete the ServiceWorkerCache.
32 struct ServiceWorkerCacheStorage::CacheContext {
33 CacheContext(const std::string& name,
34 CacheID id,
35 scoped_ptr<ServiceWorkerCache> cache)
36 : name(name), id(id), cache(cache.Pass()) {}
37 std::string name;
38 CacheID id;
39 scoped_ptr<ServiceWorkerCache> cache;
40 };
41
24 // Handles the loading and clean up of ServiceWorkerCache objects. 42 // Handles the loading and clean up of ServiceWorkerCache objects.
25 class ServiceWorkerCacheStorage::CacheLoader 43 class ServiceWorkerCacheStorage::CacheLoader
26 : public base::RefCountedThreadSafe< 44 : public base::RefCountedThreadSafe<
27 ServiceWorkerCacheStorage::CacheLoader> { 45 ServiceWorkerCacheStorage::CacheLoader> {
28 public: 46 public:
29 typedef base::Callback<void(scoped_ptr<ServiceWorkerCache>)> CacheCallback; 47 typedef base::Callback<void(scoped_ptr<ServiceWorkerCache>)> CacheCallback;
30 typedef base::Callback<void(bool)> BoolCallback; 48 typedef base::Callback<void(bool)> BoolCallback;
31 typedef base::Callback<void(scoped_ptr<std::vector<std::string> >)> 49 typedef base::Callback<void(scoped_ptr<std::vector<std::string> >)>
32 StringsCallback; 50 StringsCallback;
33 51
(...skipping 12 matching lines...) Expand all
46 // Deletes any pre-existing cache of the same name and then loads it. 64 // Deletes any pre-existing cache of the same name and then loads it.
47 virtual void CreateCache(const std::string& cache_name, 65 virtual void CreateCache(const std::string& cache_name,
48 const CacheCallback& callback) = 0; 66 const CacheCallback& callback) = 0;
49 67
50 // After the backend has been deleted, do any extra house keeping such as 68 // After the backend has been deleted, do any extra house keeping such as
51 // removing the cache's directory. 69 // removing the cache's directory.
52 virtual void CleanUpDeletedCache(const std::string& key, 70 virtual void CleanUpDeletedCache(const std::string& key,
53 const BoolCallback& callback) = 0; 71 const BoolCallback& callback) = 0;
54 72
55 // Writes the cache names (and sizes) to disk if applicable. 73 // Writes the cache names (and sizes) to disk if applicable.
56 virtual void WriteIndex(CacheMap* caches, const BoolCallback& callback) = 0; 74 virtual void WriteIndex(const CacheMap& caches,
75 const BoolCallback& callback) = 0;
57 76
58 // Loads the cache names from disk if applicable. 77 // Loads the cache names from disk if applicable.
59 virtual void LoadIndex(scoped_ptr<std::vector<std::string> > cache_names, 78 virtual void LoadIndex(scoped_ptr<std::vector<std::string> > cache_names,
60 const StringsCallback& callback) = 0; 79 const StringsCallback& callback) = 0;
61 80
62 protected: 81 protected:
63 friend class base::RefCountedThreadSafe< 82 friend class base::RefCountedThreadSafe<
64 ServiceWorkerCacheStorage::CacheLoader>; 83 ServiceWorkerCacheStorage::CacheLoader>;
65 84
66 virtual ~CacheLoader() {} 85 virtual ~CacheLoader() {}
(...skipping 12 matching lines...) Expand all
79 base::WeakPtr<storage::BlobStorageContext> blob_context) 98 base::WeakPtr<storage::BlobStorageContext> blob_context)
80 : CacheLoader(cache_task_runner, request_context, blob_context) {} 99 : CacheLoader(cache_task_runner, request_context, blob_context) {}
81 virtual void LoadCache(const std::string& cache_name, 100 virtual void LoadCache(const std::string& cache_name,
82 const CacheCallback& callback) OVERRIDE { 101 const CacheCallback& callback) OVERRIDE {
83 NOTREACHED(); 102 NOTREACHED();
84 } 103 }
85 104
86 virtual void CreateCache(const std::string& cache_name, 105 virtual void CreateCache(const std::string& cache_name,
87 const CacheCallback& callback) OVERRIDE { 106 const CacheCallback& callback) OVERRIDE {
88 scoped_ptr<ServiceWorkerCache> cache = 107 scoped_ptr<ServiceWorkerCache> cache =
89 ServiceWorkerCache::CreateMemoryCache( 108 ServiceWorkerCache::CreateMemoryCache(request_context_, blob_context_);
90 cache_name, request_context_, blob_context_);
91 callback.Run(cache.Pass()); 109 callback.Run(cache.Pass());
92 } 110 }
93 111
94 virtual void CleanUpDeletedCache(const std::string& cache_name, 112 virtual void CleanUpDeletedCache(const std::string& cache_name,
95 const BoolCallback& callback) OVERRIDE { 113 const BoolCallback& callback) OVERRIDE {
96 callback.Run(true); 114 callback.Run(true);
97 } 115 }
98 116
99 virtual void WriteIndex(CacheMap* caches, 117 virtual void WriteIndex(const CacheMap& caches,
100 const BoolCallback& callback) OVERRIDE { 118 const BoolCallback& callback) OVERRIDE {
101 callback.Run(false); 119 callback.Run(false);
102 } 120 }
103 121
104 virtual void LoadIndex(scoped_ptr<std::vector<std::string> > cache_names, 122 virtual void LoadIndex(scoped_ptr<std::vector<std::string> > cache_names,
105 const StringsCallback& callback) OVERRIDE { 123 const StringsCallback& callback) OVERRIDE {
106 callback.Run(cache_names.Pass()); 124 callback.Run(cache_names.Pass());
107 } 125 }
108 126
109 private: 127 private:
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 DCHECK_CURRENTLY_ON(BrowserThread::IO); 178 DCHECK_CURRENTLY_ON(BrowserThread::IO);
161 179
162 if (!dir_rv) { 180 if (!dir_rv) {
163 callback.Run(scoped_ptr<ServiceWorkerCache>()); 181 callback.Run(scoped_ptr<ServiceWorkerCache>());
164 return; 182 return;
165 } 183 }
166 184
167 scoped_ptr<ServiceWorkerCache> cache = 185 scoped_ptr<ServiceWorkerCache> cache =
168 ServiceWorkerCache::CreatePersistentCache( 186 ServiceWorkerCache::CreatePersistentCache(
169 CreatePersistentCachePath(origin_path_, cache_name), 187 CreatePersistentCachePath(origin_path_, cache_name),
170 cache_name,
171 request_context_, 188 request_context_,
172 blob_context_); 189 blob_context_);
173 callback.Run(cache.Pass()); 190 callback.Run(cache.Pass());
174 } 191 }
175 192
176 virtual void CreateCache(const std::string& cache_name, 193 virtual void CreateCache(const std::string& cache_name,
177 const CacheCallback& callback) OVERRIDE { 194 const CacheCallback& callback) OVERRIDE {
178 DCHECK_CURRENTLY_ON(BrowserThread::IO); 195 DCHECK_CURRENTLY_ON(BrowserThread::IO);
179 196
180 // 1. Delete the cache's directory if it exists. 197 // 1. Delete the cache's directory if it exists.
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 void CleanUpDeleteCacheDirInPool( 253 void CleanUpDeleteCacheDirInPool(
237 const base::FilePath& cache_path, 254 const base::FilePath& cache_path,
238 const BoolCallback& callback, 255 const BoolCallback& callback,
239 const scoped_refptr<base::MessageLoopProxy>& original_loop) { 256 const scoped_refptr<base::MessageLoopProxy>& original_loop) {
240 DCHECK(cache_task_runner_->RunsTasksOnCurrentThread()); 257 DCHECK(cache_task_runner_->RunsTasksOnCurrentThread());
241 258
242 bool rv = base::DeleteFile(cache_path, true); 259 bool rv = base::DeleteFile(cache_path, true);
243 original_loop->PostTask(FROM_HERE, base::Bind(callback, rv)); 260 original_loop->PostTask(FROM_HERE, base::Bind(callback, rv));
244 } 261 }
245 262
246 virtual void WriteIndex(CacheMap* caches, 263 virtual void WriteIndex(const CacheMap& caches,
247 const BoolCallback& callback) OVERRIDE { 264 const BoolCallback& callback) OVERRIDE {
248 DCHECK_CURRENTLY_ON(BrowserThread::IO); 265 DCHECK_CURRENTLY_ON(BrowserThread::IO);
249 266
250 // 1. Create the index file as a string. (WriteIndex) 267 // 1. Create the index file as a string. (WriteIndex)
251 // 2. Write the file to disk. (WriteIndexWriteToFileInPool) 268 // 2. Write the file to disk. (WriteIndexWriteToFileInPool)
252 269
253 ServiceWorkerCacheStorageIndex index; 270 ServiceWorkerCacheStorageIndex index;
254 271
255 for (CacheMap::const_iterator iter(caches); !iter.IsAtEnd(); 272 for (CacheMap::const_iterator it = caches.begin(); it != caches.end();
256 iter.Advance()) { 273 ++it) {
257 const ServiceWorkerCache* cache = iter.GetCurrentValue(); 274 const CacheContext* cache = it->second;
258 ServiceWorkerCacheStorageIndex::Cache* index_cache = index.add_cache(); 275 ServiceWorkerCacheStorageIndex::Cache* index_cache = index.add_cache();
259 index_cache->set_name(cache->name()); 276 index_cache->set_name(cache->name);
260 index_cache->set_size(0); // TODO(jkarlin): Make this real. 277 index_cache->set_size(0); // TODO(jkarlin): Make this real.
261 } 278 }
262 279
263 std::string serialized; 280 std::string serialized;
264 bool success = index.SerializeToString(&serialized); 281 bool success = index.SerializeToString(&serialized);
265 DCHECK(success); 282 DCHECK(success);
266 283
267 base::FilePath tmp_path = origin_path_.AppendASCII("index.txt.tmp"); 284 base::FilePath tmp_path = origin_path_.AppendASCII("index.txt.tmp");
268 base::FilePath index_path = origin_path_.AppendASCII("index.txt"); 285 base::FilePath index_path = origin_path_.AppendASCII("index.txt");
269 286
270 cache_task_runner_->PostTask( 287 cache_task_runner_->PostTask(
271 FROM_HERE, 288 FROM_HERE,
272 base::Bind(&SimpleCacheLoader::WriteIndexWriteToFileInPool, 289 base::Bind(&SimpleCacheLoader::WriteIndexWriteToFileInPool,
273 this, 290 this,
274 tmp_path, 291 tmp_path,
275 index_path, 292 index_path,
276 serialized, 293 serialized,
277 caches,
278 callback, 294 callback,
279 base::MessageLoopProxy::current())); 295 base::MessageLoopProxy::current()));
280 } 296 }
281 297
282 void WriteIndexWriteToFileInPool( 298 void WriteIndexWriteToFileInPool(
283 const base::FilePath& tmp_path, 299 const base::FilePath& tmp_path,
284 const base::FilePath& index_path, 300 const base::FilePath& index_path,
285 const std::string& data, 301 const std::string& data,
286 CacheMap* caches,
287 const BoolCallback& callback, 302 const BoolCallback& callback,
288 const scoped_refptr<base::MessageLoopProxy>& original_loop) { 303 const scoped_refptr<base::MessageLoopProxy>& original_loop) {
289 DCHECK(cache_task_runner_->RunsTasksOnCurrentThread()); 304 DCHECK(cache_task_runner_->RunsTasksOnCurrentThread());
290 305
291 int bytes_written = base::WriteFile(tmp_path, data.c_str(), data.size()); 306 int bytes_written = base::WriteFile(tmp_path, data.c_str(), data.size());
292 if (bytes_written != implicit_cast<int>(data.size())) { 307 if (bytes_written != implicit_cast<int>(data.size())) {
293 base::DeleteFile(tmp_path, /* recursive */ false); 308 base::DeleteFile(tmp_path, /* recursive */ false);
294 original_loop->PostTask(FROM_HERE, base::Bind(callback, false)); 309 original_loop->PostTask(FROM_HERE, base::Bind(callback, false));
295 } 310 }
296 311
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 const base::FilePath origin_path_; 387 const base::FilePath origin_path_;
373 }; 388 };
374 389
375 ServiceWorkerCacheStorage::ServiceWorkerCacheStorage( 390 ServiceWorkerCacheStorage::ServiceWorkerCacheStorage(
376 const base::FilePath& path, 391 const base::FilePath& path,
377 bool memory_only, 392 bool memory_only,
378 base::SequencedTaskRunner* cache_task_runner, 393 base::SequencedTaskRunner* cache_task_runner,
379 net::URLRequestContext* request_context, 394 net::URLRequestContext* request_context,
380 base::WeakPtr<storage::BlobStorageContext> blob_context) 395 base::WeakPtr<storage::BlobStorageContext> blob_context)
381 : initialized_(false), 396 : initialized_(false),
397 next_cache_id_(0),
382 origin_path_(path), 398 origin_path_(path),
383 cache_task_runner_(cache_task_runner), 399 cache_task_runner_(cache_task_runner),
384 weak_factory_(this) { 400 weak_factory_(this) {
385 if (memory_only) 401 if (memory_only)
386 cache_loader_ = new MemoryLoader( 402 cache_loader_ = new MemoryLoader(
387 cache_task_runner_.get(), request_context, blob_context); 403 cache_task_runner_.get(), request_context, blob_context);
388 else 404 else
389 cache_loader_ = new SimpleCacheLoader( 405 cache_loader_ = new SimpleCacheLoader(
390 origin_path_, cache_task_runner_.get(), request_context, blob_context); 406 origin_path_, cache_task_runner_.get(), request_context, blob_context);
391 } 407 }
392 408
393 ServiceWorkerCacheStorage::~ServiceWorkerCacheStorage() { 409 ServiceWorkerCacheStorage::~ServiceWorkerCacheStorage() {
410 STLDeleteContainerPairSecondPointers(cache_map_.begin(), cache_map_.end());
394 } 411 }
395 412
396 void ServiceWorkerCacheStorage::CreateCache( 413 void ServiceWorkerCacheStorage::CreateCache(
397 const std::string& cache_name, 414 const std::string& cache_name,
398 const CacheAndErrorCallback& callback) { 415 const CacheAndErrorCallback& callback) {
399 if (!initialized_) { 416 if (!initialized_) {
400 LazyInit(base::Bind(&ServiceWorkerCacheStorage::CreateCache, 417 LazyInit(base::Bind(&ServiceWorkerCacheStorage::CreateCache,
401 weak_factory_.GetWeakPtr(), 418 weak_factory_.GetWeakPtr(),
402 cache_name, 419 cache_name,
403 callback)); 420 callback));
404 return; 421 return;
405 } 422 }
406 423
407 if (cache_name.empty()) { 424 if (cache_name.empty()) {
408 callback.Run(0, CACHE_STORAGE_ERROR_EMPTY_KEY); 425 callback.Run(kInvalidCacheID, CACHE_STORAGE_ERROR_EMPTY_KEY);
409 return; 426 return;
410 } 427 }
411 428
412 if (GetLoadedCache(cache_name)) { 429 if (GetLoadedCache(cache_name)) {
413 callback.Run(0, CACHE_STORAGE_ERROR_EXISTS); 430 callback.Run(kInvalidCacheID, CACHE_STORAGE_ERROR_EXISTS);
414 return; 431 return;
415 } 432 }
416 433
417 cache_loader_->CreateCache( 434 cache_loader_->CreateCache(
418 cache_name, 435 cache_name,
419 base::Bind(&ServiceWorkerCacheStorage::CreateCacheDidCreateCache, 436 base::Bind(&ServiceWorkerCacheStorage::CreateCacheDidCreateCache,
420 weak_factory_.GetWeakPtr(), 437 weak_factory_.GetWeakPtr(),
421 cache_name, 438 cache_name,
422 callback)); 439 callback));
423 } 440 }
424 441
425 void ServiceWorkerCacheStorage::GetCache( 442 void ServiceWorkerCacheStorage::GetCache(
426 const std::string& cache_name, 443 const std::string& cache_name,
427 const CacheAndErrorCallback& callback) { 444 const CacheAndErrorCallback& callback) {
428 DCHECK_CURRENTLY_ON(BrowserThread::IO); 445 DCHECK_CURRENTLY_ON(BrowserThread::IO);
429 446
430 if (!initialized_) { 447 if (!initialized_) {
431 LazyInit(base::Bind(&ServiceWorkerCacheStorage::GetCache, 448 LazyInit(base::Bind(&ServiceWorkerCacheStorage::GetCache,
432 weak_factory_.GetWeakPtr(), 449 weak_factory_.GetWeakPtr(),
433 cache_name, 450 cache_name,
434 callback)); 451 callback));
435 return; 452 return;
436 } 453 }
437 454
438 if (cache_name.empty()) { 455 if (cache_name.empty()) {
439 callback.Run(0, CACHE_STORAGE_ERROR_EMPTY_KEY); 456 callback.Run(kInvalidCacheID, CACHE_STORAGE_ERROR_EMPTY_KEY);
440 return; 457 return;
441 } 458 }
442 459
443 ServiceWorkerCache* cache = GetLoadedCache(cache_name); 460 CacheContext* cache_context = GetLoadedCache(cache_name);
444 if (!cache) { 461 if (!cache_context) {
445 callback.Run(0, CACHE_STORAGE_ERROR_NOT_FOUND); 462 callback.Run(kInvalidCacheID, CACHE_STORAGE_ERROR_NOT_FOUND);
446 return; 463 return;
447 } 464 }
448 465
466 ServiceWorkerCache* cache = cache_context->cache.get();
467
449 if (cache->HasCreatedBackend()) 468 if (cache->HasCreatedBackend())
450 return callback.Run(cache->id(), CACHE_STORAGE_ERROR_NO_ERROR); 469 return callback.Run(cache_context->id, CACHE_STORAGE_ERROR_NO_ERROR);
451 470
452 cache->CreateBackend(base::Bind(&ServiceWorkerCacheStorage::DidCreateBackend, 471 cache->CreateBackend(base::Bind(&ServiceWorkerCacheStorage::DidCreateBackend,
453 weak_factory_.GetWeakPtr(), 472 weak_factory_.GetWeakPtr(),
454 cache->AsWeakPtr(), 473 cache->AsWeakPtr(),
474 cache_context->id,
455 callback)); 475 callback));
456 } 476 }
457 477
458 void ServiceWorkerCacheStorage::HasCache(const std::string& cache_name, 478 void ServiceWorkerCacheStorage::HasCache(const std::string& cache_name,
459 const BoolAndErrorCallback& callback) { 479 const BoolAndErrorCallback& callback) {
460 DCHECK_CURRENTLY_ON(BrowserThread::IO); 480 DCHECK_CURRENTLY_ON(BrowserThread::IO);
461 481
462 if (!initialized_) { 482 if (!initialized_) {
463 LazyInit(base::Bind(&ServiceWorkerCacheStorage::HasCache, 483 LazyInit(base::Bind(&ServiceWorkerCacheStorage::HasCache,
464 weak_factory_.GetWeakPtr(), 484 weak_factory_.GetWeakPtr(),
(...skipping 23 matching lines...) Expand all
488 cache_name, 508 cache_name,
489 callback)); 509 callback));
490 return; 510 return;
491 } 511 }
492 512
493 if (cache_name.empty()) { 513 if (cache_name.empty()) {
494 callback.Run(false, CACHE_STORAGE_ERROR_EMPTY_KEY); 514 callback.Run(false, CACHE_STORAGE_ERROR_EMPTY_KEY);
495 return; 515 return;
496 } 516 }
497 517
498 ServiceWorkerCache* cache = GetLoadedCache(cache_name); 518 scoped_ptr<CacheContext> cache_context(GetLoadedCache(cache_name));
499 if (!cache) { 519 if (!cache_context) {
500 callback.Run(false, CACHE_STORAGE_ERROR_NOT_FOUND); 520 callback.Run(false, CACHE_STORAGE_ERROR_NOT_FOUND);
501 return; 521 return;
502 } 522 }
503 523
504 name_map_.erase(cache_name); 524 name_map_.erase(cache_name);
505 cache_map_.Remove(cache->id()); // deletes cache 525 cache_map_.erase(cache_context->id);
526 cache_context.reset();
506 527
507 // Update the Index 528 // Update the Index
508 cache_loader_->WriteIndex( 529 cache_loader_->WriteIndex(
509 &cache_map_, 530 cache_map_,
510 base::Bind(&ServiceWorkerCacheStorage::DeleteCacheDidWriteIndex, 531 base::Bind(&ServiceWorkerCacheStorage::DeleteCacheDidWriteIndex,
511 weak_factory_.GetWeakPtr(), 532 weak_factory_.GetWeakPtr(),
512 cache_name, 533 cache_name,
513 callback)); 534 callback));
514 } 535 }
515 536
516 void ServiceWorkerCacheStorage::EnumerateCaches( 537 void ServiceWorkerCacheStorage::EnumerateCaches(
517 const StringsAndErrorCallback& callback) { 538 const StringsAndErrorCallback& callback) {
518 DCHECK_CURRENTLY_ON(BrowserThread::IO); 539 DCHECK_CURRENTLY_ON(BrowserThread::IO);
519 540
520 if (!initialized_) { 541 if (!initialized_) {
521 LazyInit(base::Bind(&ServiceWorkerCacheStorage::EnumerateCaches, 542 LazyInit(base::Bind(&ServiceWorkerCacheStorage::EnumerateCaches,
522 weak_factory_.GetWeakPtr(), 543 weak_factory_.GetWeakPtr(),
523 callback)); 544 callback));
524 return; 545 return;
525 } 546 }
526 547
527 std::vector<std::string> names; 548 std::vector<std::string> names;
528 for (NameMap::const_iterator it = name_map_.begin(); it != name_map_.end(); 549 for (NameMap::const_iterator it = name_map_.begin(); it != name_map_.end();
529 ++it) { 550 ++it) {
530 names.push_back(it->first); 551 names.push_back(it->first);
531 } 552 }
532 553
533 callback.Run(names, CACHE_STORAGE_ERROR_NO_ERROR); 554 callback.Run(names, CACHE_STORAGE_ERROR_NO_ERROR);
534 } 555 }
535 556
536 void ServiceWorkerCacheStorage::DidCreateBackend( 557 void ServiceWorkerCacheStorage::DidCreateBackend(
537 base::WeakPtr<ServiceWorkerCache> cache, 558 base::WeakPtr<ServiceWorkerCache> cache,
559 CacheID cache_id,
538 const CacheAndErrorCallback& callback, 560 const CacheAndErrorCallback& callback,
539 ServiceWorkerCache::ErrorType error) { 561 ServiceWorkerCache::ErrorType error) {
540 DCHECK_CURRENTLY_ON(BrowserThread::IO); 562 DCHECK_CURRENTLY_ON(BrowserThread::IO);
541 563
542 if (error != ServiceWorkerCache::ErrorTypeOK || !cache) { 564 if (error != ServiceWorkerCache::ErrorTypeOK || !cache) {
543 // TODO(jkarlin): This should delete the directory and try again in case 565 // TODO(jkarlin): This should delete the directory and try again in case
544 // the cache is simply corrupt. 566 // the cache is simply corrupt.
545 callback.Run(0, CACHE_STORAGE_ERROR_STORAGE); 567 callback.Run(kInvalidCacheID, CACHE_STORAGE_ERROR_STORAGE);
546 return; 568 return;
547 } 569 }
548 570
549 callback.Run(cache->id(), CACHE_STORAGE_ERROR_NO_ERROR); 571 callback.Run(cache_id, CACHE_STORAGE_ERROR_NO_ERROR);
550 } 572 }
551 573
552 // Init is run lazily so that it is called on the proper MessageLoop. 574 // Init is run lazily so that it is called on the proper MessageLoop.
553 void ServiceWorkerCacheStorage::LazyInit(const base::Closure& callback) { 575 void ServiceWorkerCacheStorage::LazyInit(const base::Closure& callback) {
554 DCHECK_CURRENTLY_ON(BrowserThread::IO); 576 DCHECK_CURRENTLY_ON(BrowserThread::IO);
555 DCHECK(!initialized_); 577 DCHECK(!initialized_);
556 578
557 init_callbacks_.push_back(callback); 579 init_callbacks_.push_back(callback);
558 580
559 // If this isn't the first call to LazyInit then return as the initialization 581 // If this isn't the first call to LazyInit then return as the initialization
(...skipping 28 matching lines...) Expand all
588 610
589 std::vector<std::string>::const_iterator iter = indexed_cache_names->begin(); 611 std::vector<std::string>::const_iterator iter = indexed_cache_names->begin();
590 std::vector<std::string>::const_iterator iter_next = iter + 1; 612 std::vector<std::string>::const_iterator iter_next = iter + 1;
591 613
592 cache_loader_->LoadCache( 614 cache_loader_->LoadCache(
593 *iter, 615 *iter,
594 base::Bind(&ServiceWorkerCacheStorage::LazyInitIterateAndLoadCacheName, 616 base::Bind(&ServiceWorkerCacheStorage::LazyInitIterateAndLoadCacheName,
595 weak_factory_.GetWeakPtr(), 617 weak_factory_.GetWeakPtr(),
596 callback, 618 callback,
597 base::Passed(indexed_cache_names.Pass()), 619 base::Passed(indexed_cache_names.Pass()),
598 iter_next)); 620 iter_next,
621 *iter));
599 } 622 }
600 623
601 void ServiceWorkerCacheStorage::LazyInitIterateAndLoadCacheName( 624 void ServiceWorkerCacheStorage::LazyInitIterateAndLoadCacheName(
602 const base::Closure& callback, 625 const base::Closure& callback,
603 scoped_ptr<std::vector<std::string> > indexed_cache_names, 626 scoped_ptr<std::vector<std::string> > indexed_cache_names,
604 const std::vector<std::string>::const_iterator& iter, 627 const std::vector<std::string>::const_iterator& iter,
628 const std::string& cache_name,
605 scoped_ptr<ServiceWorkerCache> cache) { 629 scoped_ptr<ServiceWorkerCache> cache) {
606 DCHECK_CURRENTLY_ON(BrowserThread::IO); 630 DCHECK_CURRENTLY_ON(BrowserThread::IO);
607 631
608 if (cache) 632 if (cache)
609 AddCacheToMaps(cache.Pass()); 633 AddCacheToMaps(cache_name, cache.Pass());
610 634
611 if (iter == indexed_cache_names->end()) { 635 if (iter == indexed_cache_names->end()) {
612 LazyInitDone(); 636 LazyInitDone();
613 return; 637 return;
614 } 638 }
615 639
616 std::vector<std::string>::const_iterator iter_next = iter + 1; 640 std::vector<std::string>::const_iterator iter_next = iter + 1;
617 cache_loader_->LoadCache( 641 cache_loader_->LoadCache(
618 *iter, 642 *iter,
619 base::Bind(&ServiceWorkerCacheStorage::LazyInitIterateAndLoadCacheName, 643 base::Bind(&ServiceWorkerCacheStorage::LazyInitIterateAndLoadCacheName,
620 weak_factory_.GetWeakPtr(), 644 weak_factory_.GetWeakPtr(),
621 callback, 645 callback,
622 base::Passed(indexed_cache_names.Pass()), 646 base::Passed(indexed_cache_names.Pass()),
623 iter_next)); 647 iter_next,
648 *iter));
624 } 649 }
625 650
626 void ServiceWorkerCacheStorage::LazyInitDone() { 651 void ServiceWorkerCacheStorage::LazyInitDone() {
627 initialized_ = true; 652 initialized_ = true;
628 for (std::vector<base::Closure>::iterator it = init_callbacks_.begin(); 653 for (std::vector<base::Closure>::iterator it = init_callbacks_.begin();
629 it != init_callbacks_.end(); 654 it != init_callbacks_.end();
630 ++it) { 655 ++it) {
631 it->Run(); 656 it->Run();
632 } 657 }
633 init_callbacks_.clear(); 658 init_callbacks_.clear();
634 } 659 }
635 660
636 void ServiceWorkerCacheStorage::AddCacheToMaps( 661 ServiceWorkerCacheStorage::CacheContext*
662 ServiceWorkerCacheStorage::AddCacheToMaps(
663 const std::string& cache_name,
637 scoped_ptr<ServiceWorkerCache> cache) { 664 scoped_ptr<ServiceWorkerCache> cache) {
638 DCHECK_CURRENTLY_ON(BrowserThread::IO); 665 DCHECK_CURRENTLY_ON(BrowserThread::IO);
639 666
640 ServiceWorkerCache* cache_ptr = cache.release(); 667 CacheID id = next_cache_id_++;
641 CacheID id = cache_map_.Add(cache_ptr); 668 CacheContext* cache_context = new CacheContext(cache_name, id, cache.Pass());
642 name_map_.insert(std::make_pair(cache_ptr->name(), id)); 669 cache_map_.insert(std::make_pair(id, cache_context)); // Takes ownership
643 cache_ptr->set_id(id); 670 name_map_.insert(std::make_pair(cache_name, id));
671 return cache_context;
644 } 672 }
645 673
646 void ServiceWorkerCacheStorage::CreateCacheDidCreateCache( 674 void ServiceWorkerCacheStorage::CreateCacheDidCreateCache(
647 const std::string& cache_name, 675 const std::string& cache_name,
648 const CacheAndErrorCallback& callback, 676 const CacheAndErrorCallback& callback,
649 scoped_ptr<ServiceWorkerCache> cache) { 677 scoped_ptr<ServiceWorkerCache> cache) {
650 DCHECK_CURRENTLY_ON(BrowserThread::IO); 678 DCHECK_CURRENTLY_ON(BrowserThread::IO);
651 679
652 if (!cache) { 680 if (!cache) {
653 callback.Run(0, CACHE_STORAGE_ERROR_STORAGE); 681 callback.Run(kInvalidCacheID, CACHE_STORAGE_ERROR_CLOSING);
654 return; 682 return;
655 } 683 }
656 684
657 base::WeakPtr<ServiceWorkerCache> cache_ptr = cache->AsWeakPtr(); 685 CacheContext* cache_context = AddCacheToMaps(cache_name, cache.Pass());
658
659 AddCacheToMaps(cache.Pass());
660 686
661 cache_loader_->WriteIndex( 687 cache_loader_->WriteIndex(
662 &cache_map_, 688 cache_map_,
663 base::Bind( 689 base::Bind(&ServiceWorkerCacheStorage::CreateCacheDidWriteIndex,
664 &ServiceWorkerCacheStorage::CreateCacheDidWriteIndex, 690 weak_factory_.GetWeakPtr(),
665 weak_factory_.GetWeakPtr(), 691 callback,
666 callback, 692 cache_context->cache->AsWeakPtr(),
667 cache_ptr)); // cache is owned by this->CacheMap and won't be deleted 693 cache_context->id));
668 } 694 }
669 695
670 void ServiceWorkerCacheStorage::CreateCacheDidWriteIndex( 696 void ServiceWorkerCacheStorage::CreateCacheDidWriteIndex(
671 const CacheAndErrorCallback& callback, 697 const CacheAndErrorCallback& callback,
672 base::WeakPtr<ServiceWorkerCache> cache, 698 base::WeakPtr<ServiceWorkerCache> cache,
699 CacheID id,
673 bool success) { 700 bool success) {
674 DCHECK_CURRENTLY_ON(BrowserThread::IO); 701 DCHECK_CURRENTLY_ON(BrowserThread::IO);
675 if (!cache) { 702 if (!cache) {
676 callback.Run(false, CACHE_STORAGE_ERROR_STORAGE); 703 callback.Run(false, CACHE_STORAGE_ERROR_CLOSING);
677 return; 704 return;
678 } 705 }
679 706
680 cache->CreateBackend(base::Bind(&ServiceWorkerCacheStorage::DidCreateBackend, 707 cache->CreateBackend(base::Bind(&ServiceWorkerCacheStorage::DidCreateBackend,
681 weak_factory_.GetWeakPtr(), 708 weak_factory_.GetWeakPtr(),
682 cache, 709 cache,
710 id,
683 callback)); 711 callback));
684 } 712 }
685 713
686 void ServiceWorkerCacheStorage::DeleteCacheDidWriteIndex( 714 void ServiceWorkerCacheStorage::DeleteCacheDidWriteIndex(
687 const std::string& cache_name, 715 const std::string& cache_name,
688 const BoolAndErrorCallback& callback, 716 const BoolAndErrorCallback& callback,
689 bool success) { 717 bool success) {
690 DCHECK_CURRENTLY_ON(BrowserThread::IO); 718 DCHECK_CURRENTLY_ON(BrowserThread::IO);
691 719
692 cache_loader_->CleanUpDeletedCache( 720 cache_loader_->CleanUpDeletedCache(
693 cache_name, 721 cache_name,
694 base::Bind(&ServiceWorkerCacheStorage::DeleteCacheDidCleanUp, 722 base::Bind(&ServiceWorkerCacheStorage::DeleteCacheDidCleanUp,
695 weak_factory_.GetWeakPtr(), 723 weak_factory_.GetWeakPtr(),
696 callback)); 724 callback));
697 } 725 }
698 726
699 void ServiceWorkerCacheStorage::DeleteCacheDidCleanUp( 727 void ServiceWorkerCacheStorage::DeleteCacheDidCleanUp(
700 const BoolAndErrorCallback& callback, 728 const BoolAndErrorCallback& callback,
701 bool success) { 729 bool success) {
702 DCHECK_CURRENTLY_ON(BrowserThread::IO); 730 DCHECK_CURRENTLY_ON(BrowserThread::IO);
703 731
704 callback.Run(true, CACHE_STORAGE_ERROR_NO_ERROR); 732 callback.Run(true, CACHE_STORAGE_ERROR_NO_ERROR);
705 } 733 }
706 734
707 ServiceWorkerCache* ServiceWorkerCacheStorage::GetLoadedCache( 735 ServiceWorkerCacheStorage::CacheContext*
708 const std::string& cache_name) const { 736 ServiceWorkerCacheStorage::GetLoadedCache(const std::string& cache_name) const {
709 DCHECK_CURRENTLY_ON(BrowserThread::IO); 737 DCHECK_CURRENTLY_ON(BrowserThread::IO);
710 DCHECK(initialized_); 738 DCHECK(initialized_);
711 739
712 NameMap::const_iterator it = name_map_.find(cache_name); 740 NameMap::const_iterator name_iter = name_map_.find(cache_name);
713 if (it == name_map_.end()) 741 if (name_iter == name_map_.end())
714 return NULL; 742 return NULL;
715 743
716 ServiceWorkerCache* cache = cache_map_.Lookup(it->second); 744 CacheMap::const_iterator map_iter = cache_map_.find(name_iter->second);
717 DCHECK(cache); 745 DCHECK(map_iter != cache_map_.end());
718 return cache; 746 return map_iter->second;
719 } 747 }
720 748
721 } // namespace content 749 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698