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

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

Issue 511893002: Guarantees ServiceWorkerCacheStorage callbacks are called. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@guarantee_init
Patch Set: Rebase 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
« no previous file with comments | « content/browser/service_worker/service_worker_cache_storage.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 } 437 }
438 438
439 if (GetLoadedCache(cache_name)) { 439 if (GetLoadedCache(cache_name)) {
440 callback.Run(kInvalidCacheID, CACHE_STORAGE_ERROR_EXISTS); 440 callback.Run(kInvalidCacheID, CACHE_STORAGE_ERROR_EXISTS);
441 return; 441 return;
442 } 442 }
443 443
444 cache_loader_->CreateCache( 444 cache_loader_->CreateCache(
445 cache_name, 445 cache_name,
446 base::Bind(&ServiceWorkerCacheStorage::CreateCacheDidCreateCache, 446 base::Bind(&ServiceWorkerCacheStorage::CreateCacheDidCreateCache,
447 weak_factory_.GetWeakPtr(),
448 cache_name, 447 cache_name,
449 callback)); 448 callback,
449 weak_factory_.GetWeakPtr()));
450 } 450 }
451 451
452 void ServiceWorkerCacheStorage::GetCache( 452 void ServiceWorkerCacheStorage::GetCache(
453 const std::string& cache_name, 453 const std::string& cache_name,
454 const CacheAndErrorCallback& callback) { 454 const CacheAndErrorCallback& callback) {
455 DCHECK_CURRENTLY_ON(BrowserThread::IO); 455 DCHECK_CURRENTLY_ON(BrowserThread::IO);
456 456
457 if (!initialized_) { 457 if (!initialized_) {
458 LazyInit(base::Bind(&ServiceWorkerCacheStorage::GetCache, 458 LazyInit(base::Bind(&ServiceWorkerCacheStorage::GetCache,
459 weak_factory_.GetWeakPtr(), 459 weak_factory_.GetWeakPtr(),
(...skipping 12 matching lines...) Expand all
472 callback.Run(kInvalidCacheID, CACHE_STORAGE_ERROR_NOT_FOUND); 472 callback.Run(kInvalidCacheID, CACHE_STORAGE_ERROR_NOT_FOUND);
473 return; 473 return;
474 } 474 }
475 475
476 ServiceWorkerCache* cache = cache_context->cache.get(); 476 ServiceWorkerCache* cache = cache_context->cache.get();
477 477
478 if (cache->HasCreatedBackend()) 478 if (cache->HasCreatedBackend())
479 return callback.Run(cache_context->id, CACHE_STORAGE_ERROR_NO_ERROR); 479 return callback.Run(cache_context->id, CACHE_STORAGE_ERROR_NO_ERROR);
480 480
481 cache->CreateBackend(base::Bind(&ServiceWorkerCacheStorage::DidCreateBackend, 481 cache->CreateBackend(base::Bind(&ServiceWorkerCacheStorage::DidCreateBackend,
482 weak_factory_.GetWeakPtr(),
483 cache->AsWeakPtr(), 482 cache->AsWeakPtr(),
484 cache_context->id, 483 cache_context->id,
485 callback)); 484 callback));
486 } 485 }
487 486
488 void ServiceWorkerCacheStorage::HasCache(const std::string& cache_name, 487 void ServiceWorkerCacheStorage::HasCache(const std::string& cache_name,
489 const BoolAndErrorCallback& callback) { 488 const BoolAndErrorCallback& callback) {
490 DCHECK_CURRENTLY_ON(BrowserThread::IO); 489 DCHECK_CURRENTLY_ON(BrowserThread::IO);
491 490
492 if (!initialized_) { 491 if (!initialized_) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 } 531 }
533 532
534 name_map_.erase(cache_name); 533 name_map_.erase(cache_name);
535 cache_map_.erase(cache_context->id); 534 cache_map_.erase(cache_context->id);
536 cache_context.reset(); 535 cache_context.reset();
537 536
538 // Update the Index 537 // Update the Index
539 cache_loader_->WriteIndex( 538 cache_loader_->WriteIndex(
540 cache_map_, 539 cache_map_,
541 base::Bind(&ServiceWorkerCacheStorage::DeleteCacheDidWriteIndex, 540 base::Bind(&ServiceWorkerCacheStorage::DeleteCacheDidWriteIndex,
542 weak_factory_.GetWeakPtr(),
543 cache_name, 541 cache_name,
544 callback)); 542 callback,
543 weak_factory_.GetWeakPtr()));
545 } 544 }
546 545
547 void ServiceWorkerCacheStorage::EnumerateCaches( 546 void ServiceWorkerCacheStorage::EnumerateCaches(
548 const StringsAndErrorCallback& callback) { 547 const StringsAndErrorCallback& callback) {
549 DCHECK_CURRENTLY_ON(BrowserThread::IO); 548 DCHECK_CURRENTLY_ON(BrowserThread::IO);
550 549
551 if (!initialized_) { 550 if (!initialized_) {
552 LazyInit(base::Bind(&ServiceWorkerCacheStorage::EnumerateCaches, 551 LazyInit(base::Bind(&ServiceWorkerCacheStorage::EnumerateCaches,
553 weak_factory_.GetWeakPtr(), 552 weak_factory_.GetWeakPtr(),
554 callback)); 553 callback));
555 return; 554 return;
556 } 555 }
557 556
558 std::vector<std::string> names; 557 std::vector<std::string> names;
559 for (NameMap::const_iterator it = name_map_.begin(); it != name_map_.end(); 558 for (NameMap::const_iterator it = name_map_.begin(); it != name_map_.end();
560 ++it) { 559 ++it) {
561 names.push_back(it->first); 560 names.push_back(it->first);
562 } 561 }
563 562
564 callback.Run(names, CACHE_STORAGE_ERROR_NO_ERROR); 563 callback.Run(names, CACHE_STORAGE_ERROR_NO_ERROR);
565 } 564 }
566 565
566 // static
567 void ServiceWorkerCacheStorage::DidCreateBackend( 567 void ServiceWorkerCacheStorage::DidCreateBackend(
568 base::WeakPtr<ServiceWorkerCache> cache, 568 base::WeakPtr<ServiceWorkerCache> cache,
569 CacheID cache_id, 569 CacheID cache_id,
570 const CacheAndErrorCallback& callback, 570 const CacheAndErrorCallback& callback,
571 ServiceWorkerCache::ErrorType error) { 571 ServiceWorkerCache::ErrorType error) {
572 DCHECK_CURRENTLY_ON(BrowserThread::IO); 572 DCHECK_CURRENTLY_ON(BrowserThread::IO);
573 573
574 if (error != ServiceWorkerCache::ErrorTypeOK || !cache) { 574 if (error != ServiceWorkerCache::ErrorTypeOK || !cache) {
575 // 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
576 // the cache is simply corrupt. 576 // the cache is simply corrupt.
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 scoped_ptr<ServiceWorkerCache> cache) { 688 scoped_ptr<ServiceWorkerCache> cache) {
689 DCHECK_CURRENTLY_ON(BrowserThread::IO); 689 DCHECK_CURRENTLY_ON(BrowserThread::IO);
690 690
691 CacheID id = next_cache_id_++; 691 CacheID id = next_cache_id_++;
692 CacheContext* cache_context = new CacheContext(cache_name, id, cache.Pass()); 692 CacheContext* cache_context = new CacheContext(cache_name, id, cache.Pass());
693 cache_map_.insert(std::make_pair(id, cache_context)); // Takes ownership 693 cache_map_.insert(std::make_pair(id, cache_context)); // Takes ownership
694 name_map_.insert(std::make_pair(cache_name, id)); 694 name_map_.insert(std::make_pair(cache_name, id));
695 return cache_context; 695 return cache_context;
696 } 696 }
697 697
698 // static
698 void ServiceWorkerCacheStorage::CreateCacheDidCreateCache( 699 void ServiceWorkerCacheStorage::CreateCacheDidCreateCache(
699 const std::string& cache_name, 700 const std::string& cache_name,
700 const CacheAndErrorCallback& callback, 701 const CacheAndErrorCallback& callback,
702 base::WeakPtr<ServiceWorkerCacheStorage> storage,
701 scoped_ptr<ServiceWorkerCache> cache) { 703 scoped_ptr<ServiceWorkerCache> cache) {
702 DCHECK_CURRENTLY_ON(BrowserThread::IO); 704 DCHECK_CURRENTLY_ON(BrowserThread::IO);
703 705
704 if (!cache) { 706 if (!cache || !storage) {
705 callback.Run(kInvalidCacheID, CACHE_STORAGE_ERROR_CLOSING); 707 callback.Run(kInvalidCacheID, CACHE_STORAGE_ERROR_CLOSING);
706 return; 708 return;
707 } 709 }
708 710
709 CacheContext* cache_context = AddCacheToMaps(cache_name, cache.Pass()); 711 CacheContext* cache_context =
712 storage->AddCacheToMaps(cache_name, cache.Pass());
710 713
711 cache_loader_->WriteIndex( 714 storage->cache_loader_->WriteIndex(
712 cache_map_, 715 storage->cache_map_,
713 base::Bind(&ServiceWorkerCacheStorage::CreateCacheDidWriteIndex, 716 base::Bind(&ServiceWorkerCacheStorage::CreateCacheDidWriteIndex,
714 weak_factory_.GetWeakPtr(),
715 callback, 717 callback,
716 cache_context->cache->AsWeakPtr(), 718 cache_context->cache->AsWeakPtr(),
717 cache_context->id)); 719 cache_context->id));
718 } 720 }
719 721
722 // static
720 void ServiceWorkerCacheStorage::CreateCacheDidWriteIndex( 723 void ServiceWorkerCacheStorage::CreateCacheDidWriteIndex(
721 const CacheAndErrorCallback& callback, 724 const CacheAndErrorCallback& callback,
722 base::WeakPtr<ServiceWorkerCache> cache, 725 base::WeakPtr<ServiceWorkerCache> cache,
723 CacheID id, 726 CacheID id,
724 bool success) { 727 bool success) {
725 DCHECK_CURRENTLY_ON(BrowserThread::IO); 728 DCHECK_CURRENTLY_ON(BrowserThread::IO);
726 if (!cache) { 729 if (!cache) {
727 callback.Run(false, CACHE_STORAGE_ERROR_CLOSING); 730 callback.Run(false, CACHE_STORAGE_ERROR_CLOSING);
728 return; 731 return;
729 } 732 }
730 733
731 cache->CreateBackend(base::Bind(&ServiceWorkerCacheStorage::DidCreateBackend, 734 cache->CreateBackend(base::Bind(&ServiceWorkerCacheStorage::DidCreateBackend,
732 weak_factory_.GetWeakPtr(),
733 cache, 735 cache,
734 id, 736 id,
735 callback)); 737 callback));
736 } 738 }
737 739
740 // static
738 void ServiceWorkerCacheStorage::DeleteCacheDidWriteIndex( 741 void ServiceWorkerCacheStorage::DeleteCacheDidWriteIndex(
739 const std::string& cache_name, 742 const std::string& cache_name,
740 const BoolAndErrorCallback& callback, 743 const BoolAndErrorCallback& callback,
744 base::WeakPtr<ServiceWorkerCacheStorage> storage,
741 bool success) { 745 bool success) {
742 DCHECK_CURRENTLY_ON(BrowserThread::IO); 746 DCHECK_CURRENTLY_ON(BrowserThread::IO);
743 747
744 cache_loader_->CleanUpDeletedCache( 748 if (!storage)
749 return callback.Run(false, CACHE_STORAGE_ERROR_CLOSING);
750
751 storage->cache_loader_->CleanUpDeletedCache(
745 cache_name, 752 cache_name,
746 base::Bind(&ServiceWorkerCacheStorage::DeleteCacheDidCleanUp, 753 base::Bind(&ServiceWorkerCacheStorage::DeleteCacheDidCleanUp, callback));
747 weak_factory_.GetWeakPtr(),
748 callback));
749 } 754 }
750 755
756 // static
751 void ServiceWorkerCacheStorage::DeleteCacheDidCleanUp( 757 void ServiceWorkerCacheStorage::DeleteCacheDidCleanUp(
752 const BoolAndErrorCallback& callback, 758 const BoolAndErrorCallback& callback,
753 bool success) { 759 bool success) {
754 DCHECK_CURRENTLY_ON(BrowserThread::IO); 760 DCHECK_CURRENTLY_ON(BrowserThread::IO);
755 761
756 callback.Run(true, CACHE_STORAGE_ERROR_NO_ERROR); 762 callback.Run(true, CACHE_STORAGE_ERROR_NO_ERROR);
757 } 763 }
758 764
759 ServiceWorkerCacheStorage::CacheContext* 765 ServiceWorkerCacheStorage::CacheContext*
760 ServiceWorkerCacheStorage::GetLoadedCache(const std::string& cache_name) const { 766 ServiceWorkerCacheStorage::GetLoadedCache(const std::string& cache_name) const {
761 DCHECK_CURRENTLY_ON(BrowserThread::IO); 767 DCHECK_CURRENTLY_ON(BrowserThread::IO);
762 DCHECK(initialized_); 768 DCHECK(initialized_);
763 769
764 NameMap::const_iterator name_iter = name_map_.find(cache_name); 770 NameMap::const_iterator name_iter = name_map_.find(cache_name);
765 if (name_iter == name_map_.end()) 771 if (name_iter == name_map_.end())
766 return NULL; 772 return NULL;
767 773
768 CacheMap::const_iterator map_iter = cache_map_.find(name_iter->second); 774 CacheMap::const_iterator map_iter = cache_map_.find(name_iter->second);
769 DCHECK(map_iter != cache_map_.end()); 775 DCHECK(map_iter != cache_map_.end());
770 return map_iter->second; 776 return map_iter->second;
771 } 777 }
772 778
773 } // namespace content 779 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/service_worker/service_worker_cache_storage.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698