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

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

Issue 985053002: [ServiceWorkerCache] Cache and CacheStorage creation UMA (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Also monitor cache storage creation Created 5 years, 9 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.h" 5 #include "content/browser/service_worker/service_worker_cache.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/guid.h" 10 #include "base/guid.h"
11 #include "base/message_loop/message_loop_proxy.h" 11 #include "base/message_loop/message_loop_proxy.h"
12 #include "base/metrics/histogram.h"
Ilya Sherman 2015/03/13 22:58:19 Please include histogram_macros instead.
jkarlin 2015/03/14 01:47:19 Done.
12 #include "base/profiler/scoped_tracker.h" 13 #include "base/profiler/scoped_tracker.h"
13 #include "base/strings/string_util.h" 14 #include "base/strings/string_util.h"
14 #include "content/browser/service_worker/service_worker_cache.pb.h" 15 #include "content/browser/service_worker/service_worker_cache.pb.h"
15 #include "content/browser/service_worker/service_worker_cache_scheduler.h" 16 #include "content/browser/service_worker/service_worker_cache_scheduler.h"
16 #include "content/public/browser/browser_thread.h" 17 #include "content/public/browser/browser_thread.h"
17 #include "content/public/common/referrer.h" 18 #include "content/public/common/referrer.h"
18 #include "net/base/io_buffer.h" 19 #include "net/base/io_buffer.h"
19 #include "net/base/net_errors.h" 20 #include "net/base/net_errors.h"
20 #include "net/disk_cache/disk_cache.h" 21 #include "net/disk_cache/disk_cache.h"
21 #include "net/url_request/url_request_context.h" 22 #include "net/url_request/url_request_context.h"
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 return weak_ptr_factory_.GetWeakPtr(); 429 return weak_ptr_factory_.GetWeakPtr();
429 } 430 }
430 431
431 void ServiceWorkerCache::Put(scoped_ptr<ServiceWorkerFetchRequest> request, 432 void ServiceWorkerCache::Put(scoped_ptr<ServiceWorkerFetchRequest> request,
432 scoped_ptr<ServiceWorkerResponse> response, 433 scoped_ptr<ServiceWorkerResponse> response,
433 const ResponseCallback& callback) { 434 const ResponseCallback& callback) {
434 scoped_ptr<storage::BlobDataHandle> blob_data_handle; 435 scoped_ptr<storage::BlobDataHandle> blob_data_handle;
435 436
436 if (!response->blob_uuid.empty()) { 437 if (!response->blob_uuid.empty()) {
437 if (!blob_storage_context_) { 438 if (!blob_storage_context_) {
438 callback.Run(ErrorTypeStorage, scoped_ptr<ServiceWorkerResponse>(), 439 callback.Run(ERROR_TYPE_STORAGE, scoped_ptr<ServiceWorkerResponse>(),
439 scoped_ptr<storage::BlobDataHandle>()); 440 scoped_ptr<storage::BlobDataHandle>());
440 return; 441 return;
441 } 442 }
442 blob_data_handle = 443 blob_data_handle =
443 blob_storage_context_->GetBlobDataFromUUID(response->blob_uuid); 444 blob_storage_context_->GetBlobDataFromUUID(response->blob_uuid);
444 if (!blob_data_handle) { 445 if (!blob_data_handle) {
445 callback.Run(ErrorTypeStorage, scoped_ptr<ServiceWorkerResponse>(), 446 callback.Run(ERROR_TYPE_STORAGE, scoped_ptr<ServiceWorkerResponse>(),
446 scoped_ptr<storage::BlobDataHandle>()); 447 scoped_ptr<storage::BlobDataHandle>());
447 return; 448 return;
448 } 449 }
449 } 450 }
450 451
451 ResponseCallback pending_callback = 452 ResponseCallback pending_callback =
452 base::Bind(&ServiceWorkerCache::PendingResponseCallback, 453 base::Bind(&ServiceWorkerCache::PendingResponseCallback,
453 weak_ptr_factory_.GetWeakPtr(), callback); 454 weak_ptr_factory_.GetWeakPtr(), callback);
454 455
455 scoped_ptr<PutContext> put_context(new PutContext( 456 scoped_ptr<PutContext> put_context(new PutContext(
(...skipping 15 matching lines...) Expand all
471 base::Passed(put_context.Pass()))); 472 base::Passed(put_context.Pass())));
472 } 473 }
473 474
474 void ServiceWorkerCache::Match(scoped_ptr<ServiceWorkerFetchRequest> request, 475 void ServiceWorkerCache::Match(scoped_ptr<ServiceWorkerFetchRequest> request,
475 const ResponseCallback& callback) { 476 const ResponseCallback& callback) {
476 switch (backend_state_) { 477 switch (backend_state_) {
477 case BACKEND_UNINITIALIZED: 478 case BACKEND_UNINITIALIZED:
478 InitBackend(); 479 InitBackend();
479 break; 480 break;
480 case BACKEND_CLOSED: 481 case BACKEND_CLOSED:
481 callback.Run(ErrorTypeStorage, scoped_ptr<ServiceWorkerResponse>(), 482 callback.Run(ERROR_TYPE_STORAGE, scoped_ptr<ServiceWorkerResponse>(),
482 scoped_ptr<storage::BlobDataHandle>()); 483 scoped_ptr<storage::BlobDataHandle>());
483 return; 484 return;
484 case BACKEND_OPEN: 485 case BACKEND_OPEN:
485 DCHECK(backend_); 486 DCHECK(backend_);
486 break; 487 break;
487 } 488 }
488 489
489 ResponseCallback pending_callback = 490 ResponseCallback pending_callback =
490 base::Bind(&ServiceWorkerCache::PendingResponseCallback, 491 base::Bind(&ServiceWorkerCache::PendingResponseCallback,
491 weak_ptr_factory_.GetWeakPtr(), callback); 492 weak_ptr_factory_.GetWeakPtr(), callback);
492 scheduler_->ScheduleOperation( 493 scheduler_->ScheduleOperation(
493 base::Bind(&ServiceWorkerCache::MatchImpl, weak_ptr_factory_.GetWeakPtr(), 494 base::Bind(&ServiceWorkerCache::MatchImpl, weak_ptr_factory_.GetWeakPtr(),
494 base::Passed(request.Pass()), pending_callback)); 495 base::Passed(request.Pass()), pending_callback));
495 } 496 }
496 497
497 void ServiceWorkerCache::Delete(scoped_ptr<ServiceWorkerFetchRequest> request, 498 void ServiceWorkerCache::Delete(scoped_ptr<ServiceWorkerFetchRequest> request,
498 const ErrorCallback& callback) { 499 const ErrorCallback& callback) {
499 switch (backend_state_) { 500 switch (backend_state_) {
500 case BACKEND_UNINITIALIZED: 501 case BACKEND_UNINITIALIZED:
501 InitBackend(); 502 InitBackend();
502 break; 503 break;
503 case BACKEND_CLOSED: 504 case BACKEND_CLOSED:
504 callback.Run(ErrorTypeStorage); 505 callback.Run(ERROR_TYPE_STORAGE);
505 return; 506 return;
506 case BACKEND_OPEN: 507 case BACKEND_OPEN:
507 DCHECK(backend_); 508 DCHECK(backend_);
508 break; 509 break;
509 } 510 }
510 ErrorCallback pending_callback = 511 ErrorCallback pending_callback =
511 base::Bind(&ServiceWorkerCache::PendingErrorCallback, 512 base::Bind(&ServiceWorkerCache::PendingErrorCallback,
512 weak_ptr_factory_.GetWeakPtr(), callback); 513 weak_ptr_factory_.GetWeakPtr(), callback);
513 scheduler_->ScheduleOperation(base::Bind( 514 scheduler_->ScheduleOperation(base::Bind(
514 &ServiceWorkerCache::DeleteImpl, weak_ptr_factory_.GetWeakPtr(), 515 &ServiceWorkerCache::DeleteImpl, weak_ptr_factory_.GetWeakPtr(),
515 base::Passed(request.Pass()), pending_callback)); 516 base::Passed(request.Pass()), pending_callback));
516 } 517 }
517 518
518 void ServiceWorkerCache::Keys(const RequestsCallback& callback) { 519 void ServiceWorkerCache::Keys(const RequestsCallback& callback) {
519 switch (backend_state_) { 520 switch (backend_state_) {
520 case BACKEND_UNINITIALIZED: 521 case BACKEND_UNINITIALIZED:
521 InitBackend(); 522 InitBackend();
522 break; 523 break;
523 case BACKEND_CLOSED: 524 case BACKEND_CLOSED:
524 callback.Run(ErrorTypeStorage, scoped_ptr<Requests>()); 525 callback.Run(ERROR_TYPE_STORAGE, scoped_ptr<Requests>());
525 return; 526 return;
526 case BACKEND_OPEN: 527 case BACKEND_OPEN:
527 DCHECK(backend_); 528 DCHECK(backend_);
528 break; 529 break;
529 } 530 }
530 531
531 RequestsCallback pending_callback = 532 RequestsCallback pending_callback =
532 base::Bind(&ServiceWorkerCache::PendingRequestsCallback, 533 base::Bind(&ServiceWorkerCache::PendingRequestsCallback,
533 weak_ptr_factory_.GetWeakPtr(), callback); 534 weak_ptr_factory_.GetWeakPtr(), callback);
534 scheduler_->ScheduleOperation(base::Bind(&ServiceWorkerCache::KeysImpl, 535 scheduler_->ScheduleOperation(base::Bind(&ServiceWorkerCache::KeysImpl,
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
593 initializing_(false), 594 initializing_(false),
594 memory_only_(path.empty()), 595 memory_only_(path.empty()),
595 weak_ptr_factory_(this) { 596 weak_ptr_factory_(this) {
596 } 597 }
597 598
598 void ServiceWorkerCache::MatchImpl( 599 void ServiceWorkerCache::MatchImpl(
599 scoped_ptr<ServiceWorkerFetchRequest> request, 600 scoped_ptr<ServiceWorkerFetchRequest> request,
600 const ResponseCallback& callback) { 601 const ResponseCallback& callback) {
601 DCHECK(backend_state_ != BACKEND_UNINITIALIZED); 602 DCHECK(backend_state_ != BACKEND_UNINITIALIZED);
602 if (backend_state_ != BACKEND_OPEN) { 603 if (backend_state_ != BACKEND_OPEN) {
603 callback.Run(ErrorTypeStorage, scoped_ptr<ServiceWorkerResponse>(), 604 callback.Run(ERROR_TYPE_STORAGE, scoped_ptr<ServiceWorkerResponse>(),
604 scoped_ptr<storage::BlobDataHandle>()); 605 scoped_ptr<storage::BlobDataHandle>());
605 return; 606 return;
606 } 607 }
607 608
608 scoped_ptr<MatchContext> match_context( 609 scoped_ptr<MatchContext> match_context(
609 new MatchContext(request.Pass(), callback, blob_storage_context_)); 610 new MatchContext(request.Pass(), callback, blob_storage_context_));
610 611
611 disk_cache::Entry** entry_ptr = &match_context->entry; 612 disk_cache::Entry** entry_ptr = &match_context->entry;
612 ServiceWorkerFetchRequest* request_ptr = match_context->request.get(); 613 ServiceWorkerFetchRequest* request_ptr = match_context->request.get();
613 614
614 net::CompletionCallback open_entry_callback = base::Bind( 615 net::CompletionCallback open_entry_callback = base::Bind(
615 &ServiceWorkerCache::MatchDidOpenEntry, weak_ptr_factory_.GetWeakPtr(), 616 &ServiceWorkerCache::MatchDidOpenEntry, weak_ptr_factory_.GetWeakPtr(),
616 base::Passed(match_context.Pass())); 617 base::Passed(match_context.Pass()));
617 618
618 int rv = backend_->OpenEntry(request_ptr->url.spec(), entry_ptr, 619 int rv = backend_->OpenEntry(request_ptr->url.spec(), entry_ptr,
619 open_entry_callback); 620 open_entry_callback);
620 if (rv != net::ERR_IO_PENDING) 621 if (rv != net::ERR_IO_PENDING)
621 open_entry_callback.Run(rv); 622 open_entry_callback.Run(rv);
622 } 623 }
623 624
624 void ServiceWorkerCache::MatchDidOpenEntry( 625 void ServiceWorkerCache::MatchDidOpenEntry(
625 scoped_ptr<MatchContext> match_context, 626 scoped_ptr<MatchContext> match_context,
626 int rv) { 627 int rv) {
627 if (rv != net::OK) { 628 if (rv != net::OK) {
628 match_context->original_callback.Run(ServiceWorkerCache::ErrorTypeNotFound, 629 match_context->original_callback.Run(
629 scoped_ptr<ServiceWorkerResponse>(), 630 ServiceWorkerCache::ERROR_TYPE_NOT_FOUND,
630 scoped_ptr<storage::BlobDataHandle>()); 631 scoped_ptr<ServiceWorkerResponse>(),
632 scoped_ptr<storage::BlobDataHandle>());
631 return; 633 return;
632 } 634 }
633 635
634 // Copy the entry pointer before passing it in base::Bind. 636 // Copy the entry pointer before passing it in base::Bind.
635 disk_cache::Entry* tmp_entry_ptr = match_context->entry; 637 disk_cache::Entry* tmp_entry_ptr = match_context->entry;
636 DCHECK(tmp_entry_ptr); 638 DCHECK(tmp_entry_ptr);
637 639
638 MetadataCallback headers_callback = base::Bind( 640 MetadataCallback headers_callback = base::Bind(
639 &ServiceWorkerCache::MatchDidReadMetadata, weak_ptr_factory_.GetWeakPtr(), 641 &ServiceWorkerCache::MatchDidReadMetadata, weak_ptr_factory_.GetWeakPtr(),
640 base::Passed(match_context.Pass())); 642 base::Passed(match_context.Pass()));
641 643
642 ReadMetadata(tmp_entry_ptr, headers_callback); 644 ReadMetadata(tmp_entry_ptr, headers_callback);
643 } 645 }
644 646
645 void ServiceWorkerCache::MatchDidReadMetadata( 647 void ServiceWorkerCache::MatchDidReadMetadata(
646 scoped_ptr<MatchContext> match_context, 648 scoped_ptr<MatchContext> match_context,
647 scoped_ptr<ServiceWorkerCacheMetadata> metadata) { 649 scoped_ptr<ServiceWorkerCacheMetadata> metadata) {
648 if (!metadata) { 650 if (!metadata) {
649 match_context->original_callback.Run(ServiceWorkerCache::ErrorTypeStorage, 651 match_context->original_callback.Run(ServiceWorkerCache::ERROR_TYPE_STORAGE,
650 scoped_ptr<ServiceWorkerResponse>(), 652 scoped_ptr<ServiceWorkerResponse>(),
651 scoped_ptr<storage::BlobDataHandle>()); 653 scoped_ptr<storage::BlobDataHandle>());
652 return; 654 return;
653 } 655 }
654 656
655 match_context->response.reset(new ServiceWorkerResponse( 657 match_context->response.reset(new ServiceWorkerResponse(
656 match_context->request->url, metadata->response().status_code(), 658 match_context->request->url, metadata->response().status_code(),
657 metadata->response().status_text(), 659 metadata->response().status_text(),
658 ProtoResponseTypeToWebResponseType(metadata->response().response_type()), 660 ProtoResponseTypeToWebResponseType(metadata->response().response_type()),
659 ServiceWorkerHeaderMap(), "", 0, GURL())); 661 ServiceWorkerHeaderMap(), "", 0, GURL()));
(...skipping 13 matching lines...) Expand all
673 ServiceWorkerHeaderMap cached_request_headers; 675 ServiceWorkerHeaderMap cached_request_headers;
674 for (int i = 0; i < metadata->request().headers_size(); ++i) { 676 for (int i = 0; i < metadata->request().headers_size(); ++i) {
675 const ServiceWorkerCacheHeaderMap header = metadata->request().headers(i); 677 const ServiceWorkerCacheHeaderMap header = metadata->request().headers(i);
676 DCHECK(header.name().find('\0') == std::string::npos); 678 DCHECK(header.name().find('\0') == std::string::npos);
677 DCHECK(header.value().find('\0') == std::string::npos); 679 DCHECK(header.value().find('\0') == std::string::npos);
678 cached_request_headers[header.name()] = header.value(); 680 cached_request_headers[header.name()] = header.value();
679 } 681 }
680 682
681 if (!VaryMatches(match_context->request->headers, cached_request_headers, 683 if (!VaryMatches(match_context->request->headers, cached_request_headers,
682 response->headers)) { 684 response->headers)) {
683 match_context->original_callback.Run(ServiceWorkerCache::ErrorTypeNotFound, 685 match_context->original_callback.Run(
684 scoped_ptr<ServiceWorkerResponse>(), 686 ServiceWorkerCache::ERROR_TYPE_NOT_FOUND,
685 scoped_ptr<storage::BlobDataHandle>()); 687 scoped_ptr<ServiceWorkerResponse>(),
688 scoped_ptr<storage::BlobDataHandle>());
686 return; 689 return;
687 } 690 }
688 691
689 if (match_context->entry->GetDataSize(INDEX_RESPONSE_BODY) == 0) { 692 if (match_context->entry->GetDataSize(INDEX_RESPONSE_BODY) == 0) {
690 match_context->original_callback.Run(ServiceWorkerCache::ErrorTypeOK, 693 match_context->original_callback.Run(ServiceWorkerCache::ERROR_TYPE_OK,
691 match_context->response.Pass(), 694 match_context->response.Pass(),
692 scoped_ptr<storage::BlobDataHandle>()); 695 scoped_ptr<storage::BlobDataHandle>());
693 return; 696 return;
694 } 697 }
695 698
696 // Stream the response body into a blob. 699 // Stream the response body into a blob.
697 if (!match_context->blob_storage_context) { 700 if (!match_context->blob_storage_context) {
698 match_context->original_callback.Run(ServiceWorkerCache::ErrorTypeStorage, 701 match_context->original_callback.Run(ServiceWorkerCache::ERROR_TYPE_STORAGE,
699 scoped_ptr<ServiceWorkerResponse>(), 702 scoped_ptr<ServiceWorkerResponse>(),
700 scoped_ptr<storage::BlobDataHandle>()); 703 scoped_ptr<storage::BlobDataHandle>());
701 return; 704 return;
702 } 705 }
703 706
704 response->blob_uuid = base::GenerateGUID(); 707 response->blob_uuid = base::GenerateGUID();
705 708
706 match_context->blob_data.reset( 709 match_context->blob_data.reset(
707 new storage::BlobDataBuilder(response->blob_uuid)); 710 new storage::BlobDataBuilder(response->blob_uuid));
708 match_context->response_body_buffer = new net::IOBufferWithSize(kBufferSize); 711 match_context->response_body_buffer = new net::IOBufferWithSize(kBufferSize);
(...skipping 16 matching lines...) Expand all
725 728
726 void ServiceWorkerCache::MatchDidReadResponseBodyData( 729 void ServiceWorkerCache::MatchDidReadResponseBodyData(
727 scoped_ptr<MatchContext> match_context, 730 scoped_ptr<MatchContext> match_context,
728 int rv) { 731 int rv) {
729 // TODO(vadimt): Remove ScopedTracker below once crbug.com/422516 is fixed. 732 // TODO(vadimt): Remove ScopedTracker below once crbug.com/422516 is fixed.
730 tracked_objects::ScopedTracker tracking_profile( 733 tracked_objects::ScopedTracker tracking_profile(
731 FROM_HERE_WITH_EXPLICIT_FUNCTION( 734 FROM_HERE_WITH_EXPLICIT_FUNCTION(
732 "422516 ServiceWorkerCache::MatchDidReadResponseBodyData")); 735 "422516 ServiceWorkerCache::MatchDidReadResponseBodyData"));
733 736
734 if (rv < 0) { 737 if (rv < 0) {
735 match_context->original_callback.Run(ServiceWorkerCache::ErrorTypeStorage, 738 match_context->original_callback.Run(ServiceWorkerCache::ERROR_TYPE_STORAGE,
736 scoped_ptr<ServiceWorkerResponse>(), 739 scoped_ptr<ServiceWorkerResponse>(),
737 scoped_ptr<storage::BlobDataHandle>()); 740 scoped_ptr<storage::BlobDataHandle>());
738 return; 741 return;
739 } 742 }
740 743
741 if (rv == 0) { 744 if (rv == 0) {
742 match_context->response->blob_uuid = match_context->blob_data->uuid(); 745 match_context->response->blob_uuid = match_context->blob_data->uuid();
743 match_context->response->blob_size = match_context->total_bytes_read; 746 match_context->response->blob_size = match_context->total_bytes_read;
744 MatchDoneWithBody(match_context.Pass()); 747 MatchDoneWithBody(match_context.Pass());
745 return; 748 return;
(...skipping 18 matching lines...) Expand all
764 int read_rv = tmp_entry_ptr->ReadData(INDEX_RESPONSE_BODY, total_bytes_read, 767 int read_rv = tmp_entry_ptr->ReadData(INDEX_RESPONSE_BODY, total_bytes_read,
765 buffer, buffer->size(), read_callback); 768 buffer, buffer->size(), read_callback);
766 769
767 if (read_rv != net::ERR_IO_PENDING) 770 if (read_rv != net::ERR_IO_PENDING)
768 read_callback.Run(read_rv); 771 read_callback.Run(read_rv);
769 } 772 }
770 773
771 void ServiceWorkerCache::MatchDoneWithBody( 774 void ServiceWorkerCache::MatchDoneWithBody(
772 scoped_ptr<MatchContext> match_context) { 775 scoped_ptr<MatchContext> match_context) {
773 if (!match_context->blob_storage_context) { 776 if (!match_context->blob_storage_context) {
774 match_context->original_callback.Run(ServiceWorkerCache::ErrorTypeStorage, 777 match_context->original_callback.Run(ServiceWorkerCache::ERROR_TYPE_STORAGE,
775 scoped_ptr<ServiceWorkerResponse>(), 778 scoped_ptr<ServiceWorkerResponse>(),
776 scoped_ptr<storage::BlobDataHandle>()); 779 scoped_ptr<storage::BlobDataHandle>());
777 return; 780 return;
778 } 781 }
779 782
780 scoped_ptr<storage::BlobDataHandle> blob_data_handle( 783 scoped_ptr<storage::BlobDataHandle> blob_data_handle(
781 match_context->blob_storage_context->AddFinishedBlob( 784 match_context->blob_storage_context->AddFinishedBlob(
782 match_context->blob_data.get())); 785 match_context->blob_data.get()));
783 786
784 match_context->original_callback.Run(ServiceWorkerCache::ErrorTypeOK, 787 match_context->original_callback.Run(ServiceWorkerCache::ERROR_TYPE_OK,
785 match_context->response.Pass(), 788 match_context->response.Pass(),
786 blob_data_handle.Pass()); 789 blob_data_handle.Pass());
787 } 790 }
788 791
789 void ServiceWorkerCache::PutImpl(scoped_ptr<PutContext> put_context) { 792 void ServiceWorkerCache::PutImpl(scoped_ptr<PutContext> put_context) {
790 DCHECK(backend_state_ != BACKEND_UNINITIALIZED); 793 DCHECK(backend_state_ != BACKEND_UNINITIALIZED);
791 if (backend_state_ != BACKEND_OPEN) { 794 if (backend_state_ != BACKEND_OPEN) {
792 put_context->callback.Run(ErrorTypeStorage, 795 put_context->callback.Run(ERROR_TYPE_STORAGE,
793 scoped_ptr<ServiceWorkerResponse>(), 796 scoped_ptr<ServiceWorkerResponse>(),
794 scoped_ptr<storage::BlobDataHandle>()); 797 scoped_ptr<storage::BlobDataHandle>());
795 return; 798 return;
796 } 799 }
797 800
798 scoped_ptr<ServiceWorkerFetchRequest> request_copy( 801 scoped_ptr<ServiceWorkerFetchRequest> request_copy(
799 new ServiceWorkerFetchRequest(*put_context->request)); 802 new ServiceWorkerFetchRequest(*put_context->request));
800 803
801 DeleteImpl(request_copy.Pass(), base::Bind(&ServiceWorkerCache::PutDidDelete, 804 DeleteImpl(request_copy.Pass(), base::Bind(&ServiceWorkerCache::PutDidDelete,
802 weak_ptr_factory_.GetWeakPtr(), 805 weak_ptr_factory_.GetWeakPtr(),
803 base::Passed(put_context.Pass()))); 806 base::Passed(put_context.Pass())));
804 } 807 }
805 808
806 void ServiceWorkerCache::PutDidDelete(scoped_ptr<PutContext> put_context, 809 void ServiceWorkerCache::PutDidDelete(scoped_ptr<PutContext> put_context,
807 ErrorType delete_error) { 810 ErrorType delete_error) {
808 if (backend_state_ != BACKEND_OPEN) { 811 if (backend_state_ != BACKEND_OPEN) {
809 put_context->callback.Run(ErrorTypeStorage, 812 put_context->callback.Run(ERROR_TYPE_STORAGE,
810 scoped_ptr<ServiceWorkerResponse>(), 813 scoped_ptr<ServiceWorkerResponse>(),
811 scoped_ptr<storage::BlobDataHandle>()); 814 scoped_ptr<storage::BlobDataHandle>());
812 return; 815 return;
813 } 816 }
814 817
815 disk_cache::Entry** entry_ptr = &put_context->cache_entry; 818 disk_cache::Entry** entry_ptr = &put_context->cache_entry;
816 ServiceWorkerFetchRequest* request_ptr = put_context->request.get(); 819 ServiceWorkerFetchRequest* request_ptr = put_context->request.get();
817 disk_cache::Backend* backend_ptr = backend_.get(); 820 disk_cache::Backend* backend_ptr = backend_.get();
818 821
819 net::CompletionCallback create_entry_callback = base::Bind( 822 net::CompletionCallback create_entry_callback = base::Bind(
820 &ServiceWorkerCache::PutDidCreateEntry, weak_ptr_factory_.GetWeakPtr(), 823 &ServiceWorkerCache::PutDidCreateEntry, weak_ptr_factory_.GetWeakPtr(),
821 base::Passed(put_context.Pass())); 824 base::Passed(put_context.Pass()));
822 825
823 int create_rv = backend_ptr->CreateEntry( 826 int create_rv = backend_ptr->CreateEntry(
824 request_ptr->url.spec(), entry_ptr, create_entry_callback); 827 request_ptr->url.spec(), entry_ptr, create_entry_callback);
825 828
826 if (create_rv != net::ERR_IO_PENDING) 829 if (create_rv != net::ERR_IO_PENDING)
827 create_entry_callback.Run(create_rv); 830 create_entry_callback.Run(create_rv);
828 } 831 }
829 832
830 void ServiceWorkerCache::PutDidCreateEntry(scoped_ptr<PutContext> put_context, 833 void ServiceWorkerCache::PutDidCreateEntry(scoped_ptr<PutContext> put_context,
831 int rv) { 834 int rv) {
832 if (rv != net::OK) { 835 if (rv != net::OK) {
833 put_context->callback.Run(ServiceWorkerCache::ErrorTypeExists, 836 put_context->callback.Run(ServiceWorkerCache::ERROR_TYPE_EXISTS,
834 scoped_ptr<ServiceWorkerResponse>(), 837 scoped_ptr<ServiceWorkerResponse>(),
835 scoped_ptr<storage::BlobDataHandle>()); 838 scoped_ptr<storage::BlobDataHandle>());
836 return; 839 return;
837 } 840 }
838 841
839 DCHECK(put_context->cache_entry); 842 DCHECK(put_context->cache_entry);
840 843
841 ServiceWorkerCacheMetadata metadata; 844 ServiceWorkerCacheMetadata metadata;
842 ServiceWorkerCacheRequest* request_metadata = metadata.mutable_request(); 845 ServiceWorkerCacheRequest* request_metadata = metadata.mutable_request();
843 request_metadata->set_method(put_context->request->method); 846 request_metadata->set_method(put_context->request->method);
(...skipping 20 matching lines...) Expand all
864 ++it) { 867 ++it) {
865 DCHECK(it->first.find('\0') == std::string::npos); 868 DCHECK(it->first.find('\0') == std::string::npos);
866 DCHECK(it->second.find('\0') == std::string::npos); 869 DCHECK(it->second.find('\0') == std::string::npos);
867 ServiceWorkerCacheHeaderMap* header_map = response_metadata->add_headers(); 870 ServiceWorkerCacheHeaderMap* header_map = response_metadata->add_headers();
868 header_map->set_name(it->first); 871 header_map->set_name(it->first);
869 header_map->set_value(it->second); 872 header_map->set_value(it->second);
870 } 873 }
871 874
872 scoped_ptr<std::string> serialized(new std::string()); 875 scoped_ptr<std::string> serialized(new std::string());
873 if (!metadata.SerializeToString(serialized.get())) { 876 if (!metadata.SerializeToString(serialized.get())) {
874 put_context->callback.Run(ServiceWorkerCache::ErrorTypeStorage, 877 put_context->callback.Run(ServiceWorkerCache::ERROR_TYPE_STORAGE,
875 scoped_ptr<ServiceWorkerResponse>(), 878 scoped_ptr<ServiceWorkerResponse>(),
876 scoped_ptr<storage::BlobDataHandle>()); 879 scoped_ptr<storage::BlobDataHandle>());
877 return; 880 return;
878 } 881 }
879 882
880 scoped_refptr<net::StringIOBuffer> buffer( 883 scoped_refptr<net::StringIOBuffer> buffer(
881 new net::StringIOBuffer(serialized.Pass())); 884 new net::StringIOBuffer(serialized.Pass()));
882 885
883 // Get a temporary copy of the entry pointer before passing it in base::Bind. 886 // Get a temporary copy of the entry pointer before passing it in base::Bind.
884 disk_cache::Entry* tmp_entry_ptr = put_context->cache_entry; 887 disk_cache::Entry* tmp_entry_ptr = put_context->cache_entry;
(...skipping 11 matching lines...) Expand all
896 899
897 if (rv != net::ERR_IO_PENDING) 900 if (rv != net::ERR_IO_PENDING)
898 write_headers_callback.Run(rv); 901 write_headers_callback.Run(rv);
899 } 902 }
900 903
901 void ServiceWorkerCache::PutDidWriteHeaders(scoped_ptr<PutContext> put_context, 904 void ServiceWorkerCache::PutDidWriteHeaders(scoped_ptr<PutContext> put_context,
902 int expected_bytes, 905 int expected_bytes,
903 int rv) { 906 int rv) {
904 if (rv != expected_bytes) { 907 if (rv != expected_bytes) {
905 put_context->cache_entry->Doom(); 908 put_context->cache_entry->Doom();
906 put_context->callback.Run(ServiceWorkerCache::ErrorTypeStorage, 909 put_context->callback.Run(ServiceWorkerCache::ERROR_TYPE_STORAGE,
907 scoped_ptr<ServiceWorkerResponse>(), 910 scoped_ptr<ServiceWorkerResponse>(),
908 scoped_ptr<storage::BlobDataHandle>()); 911 scoped_ptr<storage::BlobDataHandle>());
909 return; 912 return;
910 } 913 }
911 914
912 // The metadata is written, now for the response content. The data is streamed 915 // The metadata is written, now for the response content. The data is streamed
913 // from the blob into the cache entry. 916 // from the blob into the cache entry.
914 917
915 if (put_context->response->blob_uuid.empty()) { 918 if (put_context->response->blob_uuid.empty()) {
916 if (put_context->quota_manager_proxy.get()) { 919 if (put_context->quota_manager_proxy.get()) {
917 put_context->quota_manager_proxy->NotifyStorageModified( 920 put_context->quota_manager_proxy->NotifyStorageModified(
918 storage::QuotaClient::kServiceWorkerCache, 921 storage::QuotaClient::kServiceWorkerCache,
919 put_context->origin, 922 put_context->origin,
920 storage::kStorageTypeTemporary, 923 storage::kStorageTypeTemporary,
921 put_context->cache_entry->GetDataSize(INDEX_HEADERS)); 924 put_context->cache_entry->GetDataSize(INDEX_HEADERS));
922 } 925 }
923 926
924 put_context->callback.Run(ServiceWorkerCache::ErrorTypeOK, 927 put_context->callback.Run(ServiceWorkerCache::ERROR_TYPE_OK,
925 put_context->response.Pass(), 928 put_context->response.Pass(),
926 scoped_ptr<storage::BlobDataHandle>()); 929 scoped_ptr<storage::BlobDataHandle>());
927 return; 930 return;
928 } 931 }
929 932
930 DCHECK(put_context->blob_data_handle); 933 DCHECK(put_context->blob_data_handle);
931 934
932 disk_cache::ScopedEntryPtr entry(put_context->cache_entry); 935 disk_cache::ScopedEntryPtr entry(put_context->cache_entry);
933 put_context->cache_entry = NULL; 936 put_context->cache_entry = NULL;
934 scoped_ptr<BlobReader> reader(new BlobReader()); 937 scoped_ptr<BlobReader> reader(new BlobReader());
(...skipping 15 matching lines...) Expand all
950 void ServiceWorkerCache::PutDidWriteBlobToCache( 953 void ServiceWorkerCache::PutDidWriteBlobToCache(
951 scoped_ptr<PutContext> put_context, 954 scoped_ptr<PutContext> put_context,
952 scoped_ptr<BlobReader> blob_reader, 955 scoped_ptr<BlobReader> blob_reader,
953 disk_cache::ScopedEntryPtr entry, 956 disk_cache::ScopedEntryPtr entry,
954 bool success) { 957 bool success) {
955 DCHECK(entry); 958 DCHECK(entry);
956 put_context->cache_entry = entry.release(); 959 put_context->cache_entry = entry.release();
957 960
958 if (!success) { 961 if (!success) {
959 put_context->cache_entry->Doom(); 962 put_context->cache_entry->Doom();
960 put_context->callback.Run(ServiceWorkerCache::ErrorTypeStorage, 963 put_context->callback.Run(ServiceWorkerCache::ERROR_TYPE_STORAGE,
961 scoped_ptr<ServiceWorkerResponse>(), 964 scoped_ptr<ServiceWorkerResponse>(),
962 scoped_ptr<storage::BlobDataHandle>()); 965 scoped_ptr<storage::BlobDataHandle>());
963 return; 966 return;
964 } 967 }
965 968
966 if (put_context->quota_manager_proxy.get()) { 969 if (put_context->quota_manager_proxy.get()) {
967 put_context->quota_manager_proxy->NotifyStorageModified( 970 put_context->quota_manager_proxy->NotifyStorageModified(
968 storage::QuotaClient::kServiceWorkerCache, 971 storage::QuotaClient::kServiceWorkerCache,
969 put_context->origin, 972 put_context->origin,
970 storage::kStorageTypeTemporary, 973 storage::kStorageTypeTemporary,
971 put_context->cache_entry->GetDataSize(INDEX_HEADERS) + 974 put_context->cache_entry->GetDataSize(INDEX_HEADERS) +
972 put_context->cache_entry->GetDataSize(INDEX_RESPONSE_BODY)); 975 put_context->cache_entry->GetDataSize(INDEX_RESPONSE_BODY));
973 } 976 }
974 977
975 put_context->callback.Run(ServiceWorkerCache::ErrorTypeOK, 978 put_context->callback.Run(ServiceWorkerCache::ERROR_TYPE_OK,
976 put_context->response.Pass(), 979 put_context->response.Pass(),
977 put_context->out_blob_data_handle.Pass()); 980 put_context->out_blob_data_handle.Pass());
978 } 981 }
979 982
980 void ServiceWorkerCache::DeleteImpl( 983 void ServiceWorkerCache::DeleteImpl(
981 scoped_ptr<ServiceWorkerFetchRequest> request, 984 scoped_ptr<ServiceWorkerFetchRequest> request,
982 const ErrorCallback& callback) { 985 const ErrorCallback& callback) {
983 DCHECK(backend_state_ != BACKEND_UNINITIALIZED); 986 DCHECK(backend_state_ != BACKEND_UNINITIALIZED);
984 if (backend_state_ != BACKEND_OPEN) { 987 if (backend_state_ != BACKEND_OPEN) {
985 callback.Run(ErrorTypeStorage); 988 callback.Run(ERROR_TYPE_STORAGE);
986 return; 989 return;
987 } 990 }
988 scoped_ptr<disk_cache::Entry*> entry(new disk_cache::Entry*); 991 scoped_ptr<disk_cache::Entry*> entry(new disk_cache::Entry*);
989 992
990 disk_cache::Entry** entry_ptr = entry.get(); 993 disk_cache::Entry** entry_ptr = entry.get();
991 994
992 ServiceWorkerFetchRequest* request_ptr = request.get(); 995 ServiceWorkerFetchRequest* request_ptr = request.get();
993 996
994 net::CompletionCallback open_entry_callback = base::Bind( 997 net::CompletionCallback open_entry_callback = base::Bind(
995 &ServiceWorkerCache::DeleteDidOpenEntry, weak_ptr_factory_.GetWeakPtr(), 998 &ServiceWorkerCache::DeleteDidOpenEntry, weak_ptr_factory_.GetWeakPtr(),
996 origin_, base::Passed(request.Pass()), callback, 999 origin_, base::Passed(request.Pass()), callback,
997 base::Passed(entry.Pass()), quota_manager_proxy_); 1000 base::Passed(entry.Pass()), quota_manager_proxy_);
998 1001
999 int rv = backend_->OpenEntry(request_ptr->url.spec(), entry_ptr, 1002 int rv = backend_->OpenEntry(request_ptr->url.spec(), entry_ptr,
1000 open_entry_callback); 1003 open_entry_callback);
1001 if (rv != net::ERR_IO_PENDING) 1004 if (rv != net::ERR_IO_PENDING)
1002 open_entry_callback.Run(rv); 1005 open_entry_callback.Run(rv);
1003 } 1006 }
1004 1007
1005 void ServiceWorkerCache::DeleteDidOpenEntry( 1008 void ServiceWorkerCache::DeleteDidOpenEntry(
1006 const GURL& origin, 1009 const GURL& origin,
1007 scoped_ptr<ServiceWorkerFetchRequest> request, 1010 scoped_ptr<ServiceWorkerFetchRequest> request,
1008 const ServiceWorkerCache::ErrorCallback& callback, 1011 const ServiceWorkerCache::ErrorCallback& callback,
1009 scoped_ptr<disk_cache::Entry*> entry_ptr, 1012 scoped_ptr<disk_cache::Entry*> entry_ptr,
1010 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy, 1013 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy,
1011 int rv) { 1014 int rv) {
1012 if (rv != net::OK) { 1015 if (rv != net::OK) {
1013 callback.Run(ServiceWorkerCache::ErrorTypeNotFound); 1016 callback.Run(ServiceWorkerCache::ERROR_TYPE_NOT_FOUND);
1014 return; 1017 return;
1015 } 1018 }
1016 1019
1017 DCHECK(entry_ptr); 1020 DCHECK(entry_ptr);
1018 disk_cache::ScopedEntryPtr entry(*entry_ptr); 1021 disk_cache::ScopedEntryPtr entry(*entry_ptr);
1019 1022
1020 if (quota_manager_proxy.get()) { 1023 if (quota_manager_proxy.get()) {
1021 quota_manager_proxy->NotifyStorageModified( 1024 quota_manager_proxy->NotifyStorageModified(
1022 storage::QuotaClient::kServiceWorkerCache, origin, 1025 storage::QuotaClient::kServiceWorkerCache, origin,
1023 storage::kStorageTypeTemporary, 1026 storage::kStorageTypeTemporary,
1024 -1 * (entry->GetDataSize(INDEX_HEADERS) + 1027 -1 * (entry->GetDataSize(INDEX_HEADERS) +
1025 entry->GetDataSize(INDEX_RESPONSE_BODY))); 1028 entry->GetDataSize(INDEX_RESPONSE_BODY)));
1026 } 1029 }
1027 1030
1028 entry->Doom(); 1031 entry->Doom();
1029 callback.Run(ServiceWorkerCache::ErrorTypeOK); 1032 callback.Run(ServiceWorkerCache::ERROR_TYPE_OK);
1030 } 1033 }
1031 1034
1032 void ServiceWorkerCache::KeysImpl(const RequestsCallback& callback) { 1035 void ServiceWorkerCache::KeysImpl(const RequestsCallback& callback) {
1033 DCHECK(backend_state_ != BACKEND_UNINITIALIZED); 1036 DCHECK(backend_state_ != BACKEND_UNINITIALIZED);
1034 if (backend_state_ != BACKEND_OPEN) { 1037 if (backend_state_ != BACKEND_OPEN) {
1035 callback.Run(ErrorTypeStorage, scoped_ptr<Requests>()); 1038 callback.Run(ERROR_TYPE_STORAGE, scoped_ptr<Requests>());
1036 return; 1039 return;
1037 } 1040 }
1038 1041
1039 // 1. Iterate through all of the entries, open them, and add them to a vector. 1042 // 1. Iterate through all of the entries, open them, and add them to a vector.
1040 // 2. For each open entry: 1043 // 2. For each open entry:
1041 // 2.1. Read the headers into a protobuf. 1044 // 2.1. Read the headers into a protobuf.
1042 // 2.2. Copy the protobuf into a ServiceWorkerFetchRequest (a "key"). 1045 // 2.2. Copy the protobuf into a ServiceWorkerFetchRequest (a "key").
1043 // 2.3. Push the response into a vector of requests to be returned. 1046 // 2.3. Push the response into a vector of requests to be returned.
1044 // 3. Return the vector of requests (keys). 1047 // 3. Return the vector of requests (keys).
1045 1048
(...skipping 21 matching lines...) Expand all
1067 int rv) { 1070 int rv) {
1068 if (rv == net::ERR_FAILED) { 1071 if (rv == net::ERR_FAILED) {
1069 DCHECK(!keys_context->enumerated_entry); 1072 DCHECK(!keys_context->enumerated_entry);
1070 // Enumeration is complete, extract the requests from the entries. 1073 // Enumeration is complete, extract the requests from the entries.
1071 Entries::iterator iter = keys_context->entries.begin(); 1074 Entries::iterator iter = keys_context->entries.begin();
1072 KeysProcessNextEntry(keys_context.Pass(), iter); 1075 KeysProcessNextEntry(keys_context.Pass(), iter);
1073 return; 1076 return;
1074 } 1077 }
1075 1078
1076 if (rv < 0) { 1079 if (rv < 0) {
1077 keys_context->original_callback.Run(ErrorTypeStorage, 1080 keys_context->original_callback.Run(ERROR_TYPE_STORAGE,
1078 scoped_ptr<Requests>()); 1081 scoped_ptr<Requests>());
1079 return; 1082 return;
1080 } 1083 }
1081 1084
1082 if (backend_state_ != BACKEND_OPEN) { 1085 if (backend_state_ != BACKEND_OPEN) {
1083 keys_context->original_callback.Run(ErrorTypeNotFound, 1086 keys_context->original_callback.Run(ERROR_TYPE_NOT_FOUND,
1084 scoped_ptr<Requests>()); 1087 scoped_ptr<Requests>());
1085 return; 1088 return;
1086 } 1089 }
1087 1090
1088 // Store the entry. 1091 // Store the entry.
1089 keys_context->entries.push_back(keys_context->enumerated_entry); 1092 keys_context->entries.push_back(keys_context->enumerated_entry);
1090 keys_context->enumerated_entry = NULL; 1093 keys_context->enumerated_entry = NULL;
1091 1094
1092 // Enumerate the next entry. 1095 // Enumerate the next entry.
1093 disk_cache::Backend::Iterator& iterator = *keys_context->backend_iterator; 1096 disk_cache::Backend::Iterator& iterator = *keys_context->backend_iterator;
1094 disk_cache::Entry** enumerated_entry = &keys_context->enumerated_entry; 1097 disk_cache::Entry** enumerated_entry = &keys_context->enumerated_entry;
1095 net::CompletionCallback open_entry_callback = base::Bind( 1098 net::CompletionCallback open_entry_callback = base::Bind(
1096 &ServiceWorkerCache::KeysDidOpenNextEntry, weak_ptr_factory_.GetWeakPtr(), 1099 &ServiceWorkerCache::KeysDidOpenNextEntry, weak_ptr_factory_.GetWeakPtr(),
1097 base::Passed(keys_context.Pass())); 1100 base::Passed(keys_context.Pass()));
1098 1101
1099 rv = iterator.OpenNextEntry(enumerated_entry, open_entry_callback); 1102 rv = iterator.OpenNextEntry(enumerated_entry, open_entry_callback);
1100 1103
1101 if (rv != net::ERR_IO_PENDING) 1104 if (rv != net::ERR_IO_PENDING)
1102 open_entry_callback.Run(rv); 1105 open_entry_callback.Run(rv);
1103 } 1106 }
1104 1107
1105 void ServiceWorkerCache::KeysProcessNextEntry( 1108 void ServiceWorkerCache::KeysProcessNextEntry(
1106 scoped_ptr<KeysContext> keys_context, 1109 scoped_ptr<KeysContext> keys_context,
1107 const Entries::iterator& iter) { 1110 const Entries::iterator& iter) {
1108 if (iter == keys_context->entries.end()) { 1111 if (iter == keys_context->entries.end()) {
1109 // All done. Return all of the keys. 1112 // All done. Return all of the keys.
1110 keys_context->original_callback.Run(ErrorTypeOK, 1113 keys_context->original_callback.Run(ERROR_TYPE_OK,
1111 keys_context->out_keys.Pass()); 1114 keys_context->out_keys.Pass());
1112 return; 1115 return;
1113 } 1116 }
1114 1117
1115 ReadMetadata(*iter, base::Bind(&ServiceWorkerCache::KeysDidReadMetadata, 1118 ReadMetadata(*iter, base::Bind(&ServiceWorkerCache::KeysDidReadMetadata,
1116 weak_ptr_factory_.GetWeakPtr(), 1119 weak_ptr_factory_.GetWeakPtr(),
1117 base::Passed(keys_context.Pass()), iter)); 1120 base::Passed(keys_context.Pass()), iter));
1118 } 1121 }
1119 1122
1120 void ServiceWorkerCache::KeysDidReadMetadata( 1123 void ServiceWorkerCache::KeysDidReadMetadata(
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1185 create_cache_callback); 1188 create_cache_callback);
1186 if (rv != net::ERR_IO_PENDING) 1189 if (rv != net::ERR_IO_PENDING)
1187 create_cache_callback.Run(rv); 1190 create_cache_callback.Run(rv);
1188 } 1191 }
1189 1192
1190 void ServiceWorkerCache::CreateBackendDidCreate( 1193 void ServiceWorkerCache::CreateBackendDidCreate(
1191 const ServiceWorkerCache::ErrorCallback& callback, 1194 const ServiceWorkerCache::ErrorCallback& callback,
1192 scoped_ptr<ScopedBackendPtr> backend_ptr, 1195 scoped_ptr<ScopedBackendPtr> backend_ptr,
1193 int rv) { 1196 int rv) {
1194 if (rv != net::OK) { 1197 if (rv != net::OK) {
1195 callback.Run(ServiceWorkerCache::ErrorTypeStorage); 1198 callback.Run(ServiceWorkerCache::ERROR_TYPE_STORAGE);
1196 return; 1199 return;
1197 } 1200 }
1198 1201
1199 backend_ = backend_ptr->Pass(); 1202 backend_ = backend_ptr->Pass();
1200 callback.Run(ServiceWorkerCache::ErrorTypeOK); 1203 callback.Run(ServiceWorkerCache::ERROR_TYPE_OK);
1201 } 1204 }
1202 1205
1203 void ServiceWorkerCache::InitBackend() { 1206 void ServiceWorkerCache::InitBackend() {
1204 DCHECK(backend_state_ == BACKEND_UNINITIALIZED); 1207 DCHECK(backend_state_ == BACKEND_UNINITIALIZED);
1205 1208
1206 if (initializing_) 1209 if (initializing_)
1207 return; 1210 return;
1208 1211
1209 DCHECK(scheduler_->Empty()); 1212 DCHECK(scheduler_->Empty());
1210 initializing_ = true; 1213 initializing_ = true;
1211 1214
1212 scheduler_->ScheduleOperation(base::Bind( 1215 scheduler_->ScheduleOperation(base::Bind(
1213 &ServiceWorkerCache::CreateBackend, weak_ptr_factory_.GetWeakPtr(), 1216 &ServiceWorkerCache::CreateBackend, weak_ptr_factory_.GetWeakPtr(),
1214 base::Bind(&ServiceWorkerCache::InitDone, 1217 base::Bind(&ServiceWorkerCache::InitDone,
1215 weak_ptr_factory_.GetWeakPtr()))); 1218 weak_ptr_factory_.GetWeakPtr())));
1216 } 1219 }
1217 1220
1218 void ServiceWorkerCache::InitDone(ErrorType error) { 1221 void ServiceWorkerCache::InitDone(ErrorType error) {
1219 initializing_ = false; 1222 initializing_ = false;
1220 backend_state_ = (error == ErrorTypeOK && backend_ && 1223 backend_state_ = (error == ERROR_TYPE_OK && backend_ &&
1221 backend_state_ == BACKEND_UNINITIALIZED) 1224 backend_state_ == BACKEND_UNINITIALIZED)
1222 ? BACKEND_OPEN 1225 ? BACKEND_OPEN
1223 : BACKEND_CLOSED; 1226 : BACKEND_CLOSED;
1227
1228 UMA_HISTOGRAM_ENUMERATION("ServiceWorkerCache.InitBackendResult",
1229 error, ErrorType::ERROR_TYPE_LAST);
Ilya Sherman 2015/03/13 22:58:19 The final argument should be larger than any valid
jkarlin 2015/03/14 01:47:19 Thanks!
1230
1224 scheduler_->CompleteOperationAndRunNext(); 1231 scheduler_->CompleteOperationAndRunNext();
1225 } 1232 }
1226 1233
1227 void ServiceWorkerCache::PendingClosure(const base::Closure& callback) { 1234 void ServiceWorkerCache::PendingClosure(const base::Closure& callback) {
1228 base::WeakPtr<ServiceWorkerCache> cache = weak_ptr_factory_.GetWeakPtr(); 1235 base::WeakPtr<ServiceWorkerCache> cache = weak_ptr_factory_.GetWeakPtr();
1229 1236
1230 callback.Run(); 1237 callback.Run();
1231 if (cache) 1238 if (cache)
1232 scheduler_->CompleteOperationAndRunNext(); 1239 scheduler_->CompleteOperationAndRunNext();
1233 } 1240 }
(...skipping 24 matching lines...) Expand all
1258 ErrorType error, 1265 ErrorType error,
1259 scoped_ptr<Requests> requests) { 1266 scoped_ptr<Requests> requests) {
1260 base::WeakPtr<ServiceWorkerCache> cache = weak_ptr_factory_.GetWeakPtr(); 1267 base::WeakPtr<ServiceWorkerCache> cache = weak_ptr_factory_.GetWeakPtr();
1261 1268
1262 callback.Run(error, requests.Pass()); 1269 callback.Run(error, requests.Pass());
1263 if (cache) 1270 if (cache)
1264 scheduler_->CompleteOperationAndRunNext(); 1271 scheduler_->CompleteOperationAndRunNext();
1265 } 1272 }
1266 1273
1267 } // namespace content 1274 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698