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/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" |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
400 weak_factory_(this) { | 400 weak_factory_(this) { |
401 if (memory_only) | 401 if (memory_only) |
402 cache_loader_ = new MemoryLoader( | 402 cache_loader_ = new MemoryLoader( |
403 cache_task_runner_.get(), request_context, blob_context); | 403 cache_task_runner_.get(), request_context, blob_context); |
404 else | 404 else |
405 cache_loader_ = new SimpleCacheLoader( | 405 cache_loader_ = new SimpleCacheLoader( |
406 origin_path_, cache_task_runner_.get(), request_context, blob_context); | 406 origin_path_, cache_task_runner_.get(), request_context, blob_context); |
407 } | 407 } |
408 | 408 |
409 ServiceWorkerCacheStorage::~ServiceWorkerCacheStorage() { | 409 ServiceWorkerCacheStorage::~ServiceWorkerCacheStorage() { |
410 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
411 | |
412 // If init is running call any pending callbacks. Init will cease (due to | |
413 // checking the WeakPtr) once this object is deleted. | |
414 for (std::vector<base::Closure>::iterator it = init_callbacks_.begin(); | |
415 it != init_callbacks_.end(); | |
416 ++it) { | |
417 it->Run(); | |
michaeln
2014/08/27 22:00:54
This doesn't look quite right. The set of possible
| |
418 } | |
419 | |
410 STLDeleteContainerPairSecondPointers(cache_map_.begin(), cache_map_.end()); | 420 STLDeleteContainerPairSecondPointers(cache_map_.begin(), cache_map_.end()); |
411 } | 421 } |
412 | 422 |
413 void ServiceWorkerCacheStorage::CreateCache( | 423 void ServiceWorkerCacheStorage::CreateCache( |
414 const std::string& cache_name, | 424 const std::string& cache_name, |
415 const CacheAndErrorCallback& callback) { | 425 const CacheAndErrorCallback& callback) { |
416 if (!initialized_) { | 426 if (!initialized_) { |
417 LazyInit(base::Bind(&ServiceWorkerCacheStorage::CreateCache, | 427 LazyInit(base::Bind(&ServiceWorkerCacheStorage::CreateCache, |
418 weak_factory_.GetWeakPtr(), | 428 weak_factory_.GetWeakPtr(), |
419 cache_name, | 429 cache_name, |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
564 if (error != ServiceWorkerCache::ErrorTypeOK || !cache) { | 574 if (error != ServiceWorkerCache::ErrorTypeOK || !cache) { |
565 // TODO(jkarlin): This should delete the directory and try again in case | 575 // TODO(jkarlin): This should delete the directory and try again in case |
566 // the cache is simply corrupt. | 576 // the cache is simply corrupt. |
567 callback.Run(kInvalidCacheID, CACHE_STORAGE_ERROR_STORAGE); | 577 callback.Run(kInvalidCacheID, CACHE_STORAGE_ERROR_STORAGE); |
568 return; | 578 return; |
569 } | 579 } |
570 | 580 |
571 callback.Run(cache_id, CACHE_STORAGE_ERROR_NO_ERROR); | 581 callback.Run(cache_id, CACHE_STORAGE_ERROR_NO_ERROR); |
572 } | 582 } |
573 | 583 |
574 // Init is run lazily so that it is called on the proper MessageLoop. | |
575 void ServiceWorkerCacheStorage::LazyInit(const base::Closure& callback) { | 584 void ServiceWorkerCacheStorage::LazyInit(const base::Closure& callback) { |
576 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 585 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
577 DCHECK(!initialized_); | 586 DCHECK(!initialized_); |
578 | 587 |
579 init_callbacks_.push_back(callback); | 588 init_callbacks_.push_back(callback); |
580 | 589 |
581 // If this isn't the first call to LazyInit then return as the initialization | 590 // If this isn't the first call to LazyInit then return as the initialization |
582 // has already started. | 591 // has already started. |
583 if (init_callbacks_.size() > 1u) | 592 if (init_callbacks_.size() > 1u) |
584 return; | 593 return; |
585 | 594 |
586 // 1. Get the list of cache names (async call) | 595 // 1. Get the list of cache names (async call) |
587 // 2. For each cache name, load the cache (async call) | 596 // 2. For each cache name, load the cache (async call) |
588 // 3. Once each load is complete, update the map variables. | 597 // 3. Once each load is complete, update the map variables. |
589 // 4. Call the list of waiting callbacks. | 598 // 4. Call the list of waiting callbacks. |
590 | 599 |
591 scoped_ptr<std::vector<std::string> > indexed_cache_names( | 600 scoped_ptr<std::vector<std::string> > indexed_cache_names( |
592 new std::vector<std::string>()); | 601 new std::vector<std::string>()); |
593 | 602 |
594 cache_loader_->LoadIndex( | 603 cache_loader_->LoadIndex( |
595 indexed_cache_names.Pass(), | 604 indexed_cache_names.Pass(), |
596 base::Bind(&ServiceWorkerCacheStorage::LazyInitDidLoadIndex, | 605 base::Bind(&ServiceWorkerCacheStorage::LazyInitDidLoadIndex, |
597 weak_factory_.GetWeakPtr(), | 606 callback, |
598 callback)); | 607 weak_factory_.GetWeakPtr())); |
599 } | 608 } |
600 | 609 |
610 // static | |
601 void ServiceWorkerCacheStorage::LazyInitDidLoadIndex( | 611 void ServiceWorkerCacheStorage::LazyInitDidLoadIndex( |
602 const base::Closure& callback, | 612 const base::Closure& callback, |
613 base::WeakPtr<ServiceWorkerCacheStorage> storage, | |
603 scoped_ptr<std::vector<std::string> > indexed_cache_names) { | 614 scoped_ptr<std::vector<std::string> > indexed_cache_names) { |
604 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 615 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
605 | 616 |
606 if (indexed_cache_names->empty()) { | 617 if (!storage) |
607 LazyInitDone(); | 618 return; // The callbacks were already run by the destructor. |
608 return; | 619 |
609 } | 620 if (indexed_cache_names->empty()) |
621 return LazyInitDone(storage); | |
610 | 622 |
611 std::vector<std::string>::const_iterator iter = indexed_cache_names->begin(); | 623 std::vector<std::string>::const_iterator iter = indexed_cache_names->begin(); |
612 std::vector<std::string>::const_iterator iter_next = iter + 1; | 624 std::vector<std::string>::const_iterator iter_next = iter + 1; |
613 | 625 |
614 cache_loader_->LoadCache( | 626 storage->cache_loader_->LoadCache( |
615 *iter, | 627 *iter, |
616 base::Bind(&ServiceWorkerCacheStorage::LazyInitIterateAndLoadCacheName, | 628 base::Bind(&ServiceWorkerCacheStorage::LazyInitIterateAndLoadCacheName, |
617 weak_factory_.GetWeakPtr(), | |
618 callback, | 629 callback, |
630 storage, | |
619 base::Passed(indexed_cache_names.Pass()), | 631 base::Passed(indexed_cache_names.Pass()), |
620 iter_next, | 632 iter_next, |
621 *iter)); | 633 *iter)); |
622 } | 634 } |
623 | 635 |
636 // static | |
624 void ServiceWorkerCacheStorage::LazyInitIterateAndLoadCacheName( | 637 void ServiceWorkerCacheStorage::LazyInitIterateAndLoadCacheName( |
625 const base::Closure& callback, | 638 const base::Closure& callback, |
639 base::WeakPtr<ServiceWorkerCacheStorage> storage, | |
626 scoped_ptr<std::vector<std::string> > indexed_cache_names, | 640 scoped_ptr<std::vector<std::string> > indexed_cache_names, |
627 const std::vector<std::string>::const_iterator& iter, | 641 const std::vector<std::string>::const_iterator& iter, |
628 const std::string& cache_name, | 642 const std::string& cache_name, |
629 scoped_ptr<ServiceWorkerCache> cache) { | 643 scoped_ptr<ServiceWorkerCache> cache) { |
630 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 644 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
631 | 645 |
646 if (!storage) | |
647 return; // The callbacks were already run by the destructor. | |
648 | |
632 if (cache) | 649 if (cache) |
633 AddCacheToMaps(cache_name, cache.Pass()); | 650 storage->AddCacheToMaps(cache_name, cache.Pass()); |
634 | 651 |
635 if (iter == indexed_cache_names->end()) { | 652 if (iter == indexed_cache_names->end()) { |
636 LazyInitDone(); | 653 LazyInitDone(storage); |
637 return; | 654 return; |
638 } | 655 } |
639 | 656 |
640 std::vector<std::string>::const_iterator iter_next = iter + 1; | 657 std::vector<std::string>::const_iterator iter_next = iter + 1; |
641 cache_loader_->LoadCache( | 658 storage->cache_loader_->LoadCache( |
642 *iter, | 659 *iter, |
643 base::Bind(&ServiceWorkerCacheStorage::LazyInitIterateAndLoadCacheName, | 660 base::Bind(&ServiceWorkerCacheStorage::LazyInitIterateAndLoadCacheName, |
644 weak_factory_.GetWeakPtr(), | |
645 callback, | 661 callback, |
662 storage, | |
646 base::Passed(indexed_cache_names.Pass()), | 663 base::Passed(indexed_cache_names.Pass()), |
647 iter_next, | 664 iter_next, |
648 *iter)); | 665 *iter)); |
649 } | 666 } |
650 | 667 |
651 void ServiceWorkerCacheStorage::LazyInitDone() { | 668 // static |
652 initialized_ = true; | 669 void ServiceWorkerCacheStorage::LazyInitDone( |
653 for (std::vector<base::Closure>::iterator it = init_callbacks_.begin(); | 670 base::WeakPtr<ServiceWorkerCacheStorage> storage) { |
654 it != init_callbacks_.end(); | 671 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
672 if (!storage) | |
673 return; // The callbacks were already run by the destructor. | |
674 | |
675 storage->initialized_ = true; | |
676 for (std::vector<base::Closure>::iterator it = | |
677 storage->init_callbacks_.begin(); | |
678 it != storage->init_callbacks_.end(); | |
655 ++it) { | 679 ++it) { |
656 it->Run(); | 680 it->Run(); |
657 } | 681 } |
658 init_callbacks_.clear(); | 682 storage->init_callbacks_.clear(); |
659 } | 683 } |
660 | 684 |
661 ServiceWorkerCacheStorage::CacheContext* | 685 ServiceWorkerCacheStorage::CacheContext* |
662 ServiceWorkerCacheStorage::AddCacheToMaps( | 686 ServiceWorkerCacheStorage::AddCacheToMaps( |
663 const std::string& cache_name, | 687 const std::string& cache_name, |
664 scoped_ptr<ServiceWorkerCache> cache) { | 688 scoped_ptr<ServiceWorkerCache> cache) { |
665 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 689 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
666 | 690 |
667 CacheID id = next_cache_id_++; | 691 CacheID id = next_cache_id_++; |
668 CacheContext* cache_context = new CacheContext(cache_name, id, cache.Pass()); | 692 CacheContext* cache_context = new CacheContext(cache_name, id, cache.Pass()); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
740 NameMap::const_iterator name_iter = name_map_.find(cache_name); | 764 NameMap::const_iterator name_iter = name_map_.find(cache_name); |
741 if (name_iter == name_map_.end()) | 765 if (name_iter == name_map_.end()) |
742 return NULL; | 766 return NULL; |
743 | 767 |
744 CacheMap::const_iterator map_iter = cache_map_.find(name_iter->second); | 768 CacheMap::const_iterator map_iter = cache_map_.find(name_iter->second); |
745 DCHECK(map_iter != cache_map_.end()); | 769 DCHECK(map_iter != cache_map_.end()); |
746 return map_iter->second; | 770 return map_iter->second; |
747 } | 771 } |
748 | 772 |
749 } // namespace content | 773 } // namespace content |
OLD | NEW |