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

Side by Side Diff: content/browser/cache_storage/cache_storage_cache.cc

Issue 2315253002: [CacheStorage] Sort QueryCache results by time entered into cache (Closed)
Patch Set: Address comments from PS5 Created 4 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/cache_storage/cache_storage_cache.h" 5 #include "content/browser/cache_storage/cache_storage_cache.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 std::unique_ptr<ServiceWorkerFetchRequest> request; 207 std::unique_ptr<ServiceWorkerFetchRequest> request;
208 std::unique_ptr<ServiceWorkerResponse> response; 208 std::unique_ptr<ServiceWorkerResponse> response;
209 std::unique_ptr<storage::BlobDataHandle> blob_data_handle; 209 std::unique_ptr<storage::BlobDataHandle> blob_data_handle;
210 CacheStorageCache::ErrorCallback callback; 210 CacheStorageCache::ErrorCallback callback;
211 disk_cache::ScopedEntryPtr cache_entry; 211 disk_cache::ScopedEntryPtr cache_entry;
212 212
213 private: 213 private:
214 DISALLOW_COPY_AND_ASSIGN(PutContext); 214 DISALLOW_COPY_AND_ASSIGN(PutContext);
215 }; 215 };
216 216
217 struct CacheStorageCache::QueryCacheResults { 217 struct CacheStorageCache::QueryCacheResult {
218 QueryCacheResults(std::unique_ptr<ServiceWorkerFetchRequest> request, 218 explicit QueryCacheResult(base::Time entry_time) : entry_time(entry_time) {}
219
220 std::unique_ptr<ServiceWorkerFetchRequest> request;
221 std::unique_ptr<ServiceWorkerResponse> response;
222 std::unique_ptr<storage::BlobDataHandle> blob_handle;
223 disk_cache::ScopedEntryPtr entry;
224 base::Time entry_time;
225 };
226
227 struct CacheStorageCache::QueryCacheContext {
228 QueryCacheContext(std::unique_ptr<ServiceWorkerFetchRequest> request,
219 const CacheStorageCacheQueryParams& options, 229 const CacheStorageCacheQueryParams& options,
220 const QueryCacheResultsCallback& callback) 230 const QueryCacheCallback& callback)
221 : request(std::move(request)), 231 : request(std::move(request)),
222 options(options), 232 options(options),
223 callback(callback), 233 callback(callback),
224 out_requests(new Requests), 234 matches(base::MakeUnique<QueryCacheResults>()) {}
225 out_responses(new Responses),
226 out_blob_data_handles(new BlobDataHandles) {}
227 235
236 // Input to QueryCache
228 std::unique_ptr<ServiceWorkerFetchRequest> request; 237 std::unique_ptr<ServiceWorkerFetchRequest> request;
229 CacheStorageCacheQueryParams options; 238 CacheStorageCacheQueryParams options;
230 QueryCacheResultsCallback callback; 239 QueryCacheCallback callback;
231 QueryCacheType query_type; 240 QueryCacheType query_type;
232 size_t estimated_out_bytes = 0; 241 size_t estimated_out_bytes = 0;
233 242
234 std::unique_ptr<Requests> out_requests; 243 // Iteration state
235 std::unique_ptr<Responses> out_responses;
236 std::unique_ptr<BlobDataHandles> out_blob_data_handles;
237 std::vector<disk_cache::ScopedEntryPtr> out_entries;
238
239 std::unique_ptr<disk_cache::Backend::Iterator> backend_iterator; 244 std::unique_ptr<disk_cache::Backend::Iterator> backend_iterator;
240 disk_cache::Entry* enumerated_entry = nullptr; 245 disk_cache::Entry* enumerated_entry = nullptr;
241 246
247 // Output of QueryCache
248 std::unique_ptr<std::vector<QueryCacheResult>> matches;
249
242 private: 250 private:
243 DISALLOW_COPY_AND_ASSIGN(QueryCacheResults); 251 DISALLOW_COPY_AND_ASSIGN(QueryCacheContext);
244 }; 252 };
245 253
246 // static 254 // static
247 std::unique_ptr<CacheStorageCache> CacheStorageCache::CreateMemoryCache( 255 std::unique_ptr<CacheStorageCache> CacheStorageCache::CreateMemoryCache(
248 const GURL& origin, 256 const GURL& origin,
249 const std::string& cache_name, 257 const std::string& cache_name,
250 CacheStorage* cache_storage, 258 CacheStorage* cache_storage,
251 scoped_refptr<net::URLRequestContextGetter> request_context_getter, 259 scoped_refptr<net::URLRequestContextGetter> request_context_getter,
252 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy, 260 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy,
253 base::WeakPtr<storage::BlobStorageContext> blob_context) { 261 base::WeakPtr<storage::BlobStorageContext> blob_context) {
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 DCHECK(!origin_.is_empty()); 521 DCHECK(!origin_.is_empty());
514 DCHECK(quota_manager_proxy_.get()); 522 DCHECK(quota_manager_proxy_.get());
515 523
516 quota_manager_proxy_->NotifyOriginInUse(origin_); 524 quota_manager_proxy_->NotifyOriginInUse(origin_);
517 } 525 }
518 526
519 void CacheStorageCache::QueryCache( 527 void CacheStorageCache::QueryCache(
520 std::unique_ptr<ServiceWorkerFetchRequest> request, 528 std::unique_ptr<ServiceWorkerFetchRequest> request,
521 const CacheStorageCacheQueryParams& options, 529 const CacheStorageCacheQueryParams& options,
522 QueryCacheType query_type, 530 QueryCacheType query_type,
523 const QueryCacheResultsCallback& callback) { 531 const QueryCacheCallback& callback) {
524 DCHECK_NE(BACKEND_UNINITIALIZED, backend_state_); 532 DCHECK_NE(BACKEND_UNINITIALIZED, backend_state_);
525 if (backend_state_ != BACKEND_OPEN) { 533 if (backend_state_ != BACKEND_OPEN) {
526 callback.Run(CACHE_STORAGE_ERROR_STORAGE, 534 callback.Run(CACHE_STORAGE_ERROR_STORAGE,
527 std::unique_ptr<QueryCacheResults>()); 535 std::unique_ptr<QueryCacheResults>());
528 return; 536 return;
529 } 537 }
530 538
531 if (!options.ignore_method && request && !request->method.empty() && 539 if (!options.ignore_method && request && !request->method.empty() &&
532 request->method != "GET") { 540 request->method != "GET") {
533 callback.Run(CACHE_STORAGE_OK, base::MakeUnique<QueryCacheResults>( 541 callback.Run(CACHE_STORAGE_OK, base::MakeUnique<QueryCacheResults>());
534 std::move(request), options, callback));
535 return; 542 return;
536 } 543 }
537 544
538 ServiceWorkerFetchRequest* request_ptr = request.get(); 545 ServiceWorkerFetchRequest* request_ptr = request.get();
539 std::unique_ptr<QueryCacheResults> query_cache_results( 546 std::unique_ptr<QueryCacheContext> query_cache_context(
540 new QueryCacheResults(std::move(request), options, callback)); 547 new QueryCacheContext(std::move(request), options, callback));
541 query_cache_results->query_type = query_type; 548 query_cache_context->query_type = query_type;
542 549
543 if (query_cache_results->request && 550 if (query_cache_context->request &&
544 !query_cache_results->request->url.is_empty() && !options.ignore_search) { 551 !query_cache_context->request->url.is_empty() && !options.ignore_search) {
545 // There is no need to scan the entire backend, just open the exact 552 // There is no need to scan the entire backend, just open the exact
546 // URL. 553 // URL.
547 disk_cache::Entry** entry_ptr = &query_cache_results->enumerated_entry; 554 disk_cache::Entry** entry_ptr = &query_cache_context->enumerated_entry;
548 net::CompletionCallback open_entry_callback = 555 net::CompletionCallback open_entry_callback =
549 base::Bind(&CacheStorageCache::QueryCacheDidOpenFastPath, 556 base::Bind(&CacheStorageCache::QueryCacheDidOpenFastPath,
550 weak_ptr_factory_.GetWeakPtr(), 557 weak_ptr_factory_.GetWeakPtr(),
551 base::Passed(std::move(query_cache_results))); 558 base::Passed(std::move(query_cache_context)));
552 int rv = backend_->OpenEntry(request_ptr->url.spec(), entry_ptr, 559 int rv = backend_->OpenEntry(request_ptr->url.spec(), entry_ptr,
553 open_entry_callback); 560 open_entry_callback);
554 if (rv != net::ERR_IO_PENDING) 561 if (rv != net::ERR_IO_PENDING)
555 open_entry_callback.Run(rv); 562 open_entry_callback.Run(rv);
556 return; 563 return;
557 } 564 }
558 565
559 query_cache_results->backend_iterator = backend_->CreateIterator(); 566 query_cache_context->backend_iterator = backend_->CreateIterator();
560 QueryCacheOpenNextEntry(std::move(query_cache_results)); 567 QueryCacheOpenNextEntry(std::move(query_cache_context));
561 } 568 }
562 569
563 void CacheStorageCache::QueryCacheDidOpenFastPath( 570 void CacheStorageCache::QueryCacheDidOpenFastPath(
564 std::unique_ptr<QueryCacheResults> query_cache_results, 571 std::unique_ptr<QueryCacheContext> query_cache_context,
565 int rv) { 572 int rv) {
566 if (rv != net::OK) { 573 if (rv != net::OK) {
567 QueryCacheResults* results = query_cache_results.get(); 574 QueryCacheContext* results = query_cache_context.get();
568 results->callback.Run(CACHE_STORAGE_OK, std::move(query_cache_results)); 575 results->callback.Run(CACHE_STORAGE_OK,
576 std::move(query_cache_context->matches));
569 return; 577 return;
570 } 578 }
571 QueryCacheFilterEntry(std::move(query_cache_results), rv); 579 QueryCacheFilterEntry(std::move(query_cache_context), rv);
572 } 580 }
573 581
574 void CacheStorageCache::QueryCacheOpenNextEntry( 582 void CacheStorageCache::QueryCacheOpenNextEntry(
575 std::unique_ptr<QueryCacheResults> query_cache_results) { 583 std::unique_ptr<QueryCacheContext> query_cache_context) {
576 DCHECK_EQ(nullptr, query_cache_results->enumerated_entry); 584 DCHECK_EQ(nullptr, query_cache_context->enumerated_entry);
577 585
578 if (!query_cache_results->backend_iterator) { 586 if (!query_cache_context->backend_iterator) {
579 // Iteration is complete. 587 // Iteration is complete.
580 QueryCacheResultsCallback callback = query_cache_results->callback; 588 std::sort(query_cache_context->matches->begin(),
581 callback.Run(CACHE_STORAGE_OK, std::move(query_cache_results)); 589 query_cache_context->matches->end(), QueryCacheResultCompare);
590
591 query_cache_context->callback.Run(CACHE_STORAGE_OK,
592 std::move(query_cache_context->matches));
582 return; 593 return;
583 } 594 }
584 595
585 disk_cache::Backend::Iterator& iterator = 596 disk_cache::Backend::Iterator& iterator =
586 *query_cache_results->backend_iterator; 597 *query_cache_context->backend_iterator;
587 disk_cache::Entry** enumerated_entry = &query_cache_results->enumerated_entry; 598 disk_cache::Entry** enumerated_entry = &query_cache_context->enumerated_entry;
588 net::CompletionCallback open_entry_callback = base::Bind( 599 net::CompletionCallback open_entry_callback = base::Bind(
589 &CacheStorageCache::QueryCacheFilterEntry, weak_ptr_factory_.GetWeakPtr(), 600 &CacheStorageCache::QueryCacheFilterEntry, weak_ptr_factory_.GetWeakPtr(),
590 base::Passed(std::move(query_cache_results))); 601 base::Passed(std::move(query_cache_context)));
591 602
592 int rv = iterator.OpenNextEntry(enumerated_entry, open_entry_callback); 603 int rv = iterator.OpenNextEntry(enumerated_entry, open_entry_callback);
593 604
594 if (rv != net::ERR_IO_PENDING) 605 if (rv != net::ERR_IO_PENDING)
595 open_entry_callback.Run(rv); 606 open_entry_callback.Run(rv);
596 } 607 }
597 608
598 void CacheStorageCache::QueryCacheFilterEntry( 609 void CacheStorageCache::QueryCacheFilterEntry(
599 std::unique_ptr<QueryCacheResults> query_cache_results, 610 std::unique_ptr<QueryCacheContext> query_cache_context,
600 int rv) { 611 int rv) {
601 if (rv == net::ERR_FAILED) { 612 if (rv == net::ERR_FAILED) {
602 // This is the indicator that iteration is complete. 613 // This is the indicator that iteration is complete.
603 query_cache_results->backend_iterator.reset(); 614 query_cache_context->backend_iterator.reset();
604 QueryCacheOpenNextEntry(std::move(query_cache_results)); 615 QueryCacheOpenNextEntry(std::move(query_cache_context));
605 return; 616 return;
606 } 617 }
607 618
608 if (rv < 0) { 619 if (rv < 0) {
609 QueryCacheResultsCallback callback = query_cache_results->callback; 620 QueryCacheCallback callback = query_cache_context->callback;
610 callback.Run(CACHE_STORAGE_ERROR_STORAGE, std::move(query_cache_results)); 621 callback.Run(CACHE_STORAGE_ERROR_STORAGE,
622 std::move(query_cache_context->matches));
611 return; 623 return;
612 } 624 }
613 625
614 disk_cache::ScopedEntryPtr entry(query_cache_results->enumerated_entry); 626 disk_cache::ScopedEntryPtr entry(query_cache_context->enumerated_entry);
615 query_cache_results->enumerated_entry = nullptr; 627 query_cache_context->enumerated_entry = nullptr;
616 628
617 if (backend_state_ != BACKEND_OPEN) { 629 if (backend_state_ != BACKEND_OPEN) {
618 QueryCacheResultsCallback callback = query_cache_results->callback; 630 QueryCacheCallback callback = query_cache_context->callback;
619 callback.Run(CACHE_STORAGE_ERROR_NOT_FOUND, std::move(query_cache_results)); 631 callback.Run(CACHE_STORAGE_ERROR_NOT_FOUND,
632 std::move(query_cache_context->matches));
620 return; 633 return;
621 } 634 }
622 635
623 if (query_cache_results->request && 636 if (query_cache_context->request &&
624 !query_cache_results->request->url.is_empty()) { 637 !query_cache_context->request->url.is_empty()) {
625 GURL requestURL = query_cache_results->request->url; 638 GURL requestURL = query_cache_context->request->url;
626 GURL cachedURL = GURL(entry->GetKey()); 639 GURL cachedURL = GURL(entry->GetKey());
627 640
628 if (query_cache_results->options.ignore_search) { 641 if (query_cache_context->options.ignore_search) {
629 requestURL = RemoveQueryParam(requestURL); 642 requestURL = RemoveQueryParam(requestURL);
630 cachedURL = RemoveQueryParam(cachedURL); 643 cachedURL = RemoveQueryParam(cachedURL);
631 } 644 }
632 645
633 if (cachedURL != requestURL) { 646 if (cachedURL != requestURL) {
634 QueryCacheOpenNextEntry(std::move(query_cache_results)); 647 QueryCacheOpenNextEntry(std::move(query_cache_context));
635 return; 648 return;
636 } 649 }
637 } 650 }
638 651
639 disk_cache::Entry* entry_ptr = entry.get(); 652 disk_cache::Entry* entry_ptr = entry.get();
640 ReadMetadata(entry_ptr, 653 ReadMetadata(entry_ptr,
641 base::Bind(&CacheStorageCache::QueryCacheDidReadMetadata, 654 base::Bind(&CacheStorageCache::QueryCacheDidReadMetadata,
642 weak_ptr_factory_.GetWeakPtr(), 655 weak_ptr_factory_.GetWeakPtr(),
643 base::Passed(std::move(query_cache_results)), 656 base::Passed(std::move(query_cache_context)),
644 base::Passed(std::move(entry)))); 657 base::Passed(std::move(entry))));
645 } 658 }
646 659
647 void CacheStorageCache::QueryCacheDidReadMetadata( 660 void CacheStorageCache::QueryCacheDidReadMetadata(
648 std::unique_ptr<QueryCacheResults> query_cache_results, 661 std::unique_ptr<QueryCacheContext> query_cache_context,
649 disk_cache::ScopedEntryPtr entry, 662 disk_cache::ScopedEntryPtr entry,
650 std::unique_ptr<CacheMetadata> metadata) { 663 std::unique_ptr<CacheMetadata> metadata) {
651 if (!metadata) { 664 if (!metadata) {
652 entry->Doom(); 665 entry->Doom();
653 QueryCacheOpenNextEntry(std::move(query_cache_results)); 666 QueryCacheOpenNextEntry(std::move(query_cache_context));
654 return; 667 return;
655 } 668 }
656 669
657 ServiceWorkerFetchRequest request; 670 // If the entry was created before we started adding entry times, then
658 PopulateRequestFromMetadata(*metadata, GURL(entry->GetKey()), &request); 671 // default to using the Response object's time for sorting purposes.
672 int64_t entry_time = metadata->has_entry_time()
673 ? metadata->entry_time()
674 : metadata->response().response_time();
659 675
660 ServiceWorkerResponse response; 676 query_cache_context->matches->push_back(
661 PopulateResponseMetadata(*metadata, &response); 677 QueryCacheResult(base::Time::FromInternalValue(entry_time)));
678 QueryCacheResult* match = &query_cache_context->matches->back();
679 match->request = base::MakeUnique<ServiceWorkerFetchRequest>();
680 match->response = base::MakeUnique<ServiceWorkerResponse>();
681 PopulateRequestFromMetadata(*metadata, GURL(entry->GetKey()),
682 match->request.get());
683 PopulateResponseMetadata(*metadata, match->response.get());
662 684
663 if (query_cache_results->request && 685 if (query_cache_context->request &&
664 !query_cache_results->options.ignore_vary && 686 !query_cache_context->options.ignore_vary &&
665 !VaryMatches(query_cache_results->request->headers, request.headers, 687 !VaryMatches(query_cache_context->request->headers,
666 response.headers)) { 688 match->request->headers, match->response->headers)) {
667 QueryCacheOpenNextEntry(std::move(query_cache_results)); 689 query_cache_context->matches->pop_back();
690 QueryCacheOpenNextEntry(std::move(query_cache_context));
668 return; 691 return;
669 } 692 }
670 693
671 if (query_cache_results->query_type == QueryCacheType::CACHE_ENTRIES) { 694 if (query_cache_context->query_type == QueryCacheType::CACHE_ENTRIES) {
672 query_cache_results->out_entries.push_back(std::move(entry)); 695 match->request.reset();
673 QueryCacheOpenNextEntry(std::move(query_cache_results)); 696 match->response.reset();
697 match->entry = std::move(entry);
698 QueryCacheOpenNextEntry(std::move(query_cache_context));
674 return; 699 return;
675 } 700 }
676 701
677 query_cache_results->estimated_out_bytes += request.EstimatedStructSize(); 702 query_cache_context->estimated_out_bytes +=
678 if (query_cache_results->estimated_out_bytes > max_query_size_bytes_) { 703 match->request->EstimatedStructSize();
679 query_cache_results->callback.Run(CACHE_STORAGE_ERROR_QUERY_TOO_LARGE, 704 if (query_cache_context->estimated_out_bytes > max_query_size_bytes_) {
705 query_cache_context->callback.Run(CACHE_STORAGE_ERROR_QUERY_TOO_LARGE,
680 std::unique_ptr<QueryCacheResults>()); 706 std::unique_ptr<QueryCacheResults>());
681 return; 707 return;
682 } 708 }
683 709
684 query_cache_results->out_requests->push_back(request); 710 if (query_cache_context->query_type == QueryCacheType::REQUESTS) {
685 if (query_cache_results->query_type == QueryCacheType::REQUESTS) { 711 match->response.reset();
686 QueryCacheOpenNextEntry(std::move(query_cache_results)); 712 QueryCacheOpenNextEntry(std::move(query_cache_context));
687 return; 713 return;
688 } 714 }
689 715
690 DCHECK_EQ(QueryCacheType::REQUESTS_AND_RESPONSES, 716 DCHECK_EQ(QueryCacheType::REQUESTS_AND_RESPONSES,
691 query_cache_results->query_type); 717 query_cache_context->query_type);
692 718
693 query_cache_results->estimated_out_bytes += response.EstimatedStructSize(); 719 query_cache_context->estimated_out_bytes +=
694 if (query_cache_results->estimated_out_bytes > max_query_size_bytes_) { 720 match->response->EstimatedStructSize();
695 query_cache_results->callback.Run(CACHE_STORAGE_ERROR_QUERY_TOO_LARGE, 721 if (query_cache_context->estimated_out_bytes > max_query_size_bytes_) {
722 query_cache_context->callback.Run(CACHE_STORAGE_ERROR_QUERY_TOO_LARGE,
696 std::unique_ptr<QueryCacheResults>()); 723 std::unique_ptr<QueryCacheResults>());
697 return; 724 return;
698 } 725 }
699 726
700 if (entry->GetDataSize(INDEX_RESPONSE_BODY) == 0) { 727 if (entry->GetDataSize(INDEX_RESPONSE_BODY) == 0) {
701 query_cache_results->out_responses->push_back(response); 728 QueryCacheOpenNextEntry(std::move(query_cache_context));
702 QueryCacheOpenNextEntry(std::move(query_cache_results));
703 return; 729 return;
704 } 730 }
705 731
706 if (!blob_storage_context_) { 732 if (!blob_storage_context_) {
707 query_cache_results->callback.Run(CACHE_STORAGE_ERROR_STORAGE, 733 query_cache_context->callback.Run(CACHE_STORAGE_ERROR_STORAGE,
708 std::unique_ptr<QueryCacheResults>()); 734 base::MakeUnique<QueryCacheResults>());
709 return; 735 return;
710 } 736 }
711 737
712 std::unique_ptr<storage::BlobDataHandle> blob_data_handle = 738 std::unique_ptr<storage::BlobDataHandle> blob_data_handle =
713 PopulateResponseBody(std::move(entry), &response); 739 PopulateResponseBody(std::move(entry), match->response.get());
740 match->blob_handle = std::move(blob_data_handle);
714 741
715 query_cache_results->out_responses->push_back(response); 742 QueryCacheOpenNextEntry(std::move(query_cache_context));
716 query_cache_results->out_blob_data_handles->push_back(*blob_data_handle); 743 }
717 QueryCacheOpenNextEntry(std::move(query_cache_results)); 744
745 // static
746 bool CacheStorageCache::QueryCacheResultCompare(const QueryCacheResult& lhs,
747 const QueryCacheResult& rhs) {
748 return lhs.entry_time < rhs.entry_time;
718 } 749 }
719 750
720 void CacheStorageCache::MatchImpl( 751 void CacheStorageCache::MatchImpl(
721 std::unique_ptr<ServiceWorkerFetchRequest> request, 752 std::unique_ptr<ServiceWorkerFetchRequest> request,
722 const CacheStorageCacheQueryParams& match_params, 753 const CacheStorageCacheQueryParams& match_params,
723 const ResponseCallback& callback) { 754 const ResponseCallback& callback) {
724 MatchAllImpl(std::move(request), match_params, 755 MatchAllImpl(std::move(request), match_params,
725 base::Bind(&CacheStorageCache::MatchDidMatchAll, 756 base::Bind(&CacheStorageCache::MatchDidMatchAll,
726 weak_ptr_factory_.GetWeakPtr(), callback)); 757 weak_ptr_factory_.GetWeakPtr(), callback));
727 } 758 }
(...skipping 12 matching lines...) Expand all
740 if (match_all_responses->empty()) { 771 if (match_all_responses->empty()) {
741 callback.Run(CACHE_STORAGE_ERROR_NOT_FOUND, 772 callback.Run(CACHE_STORAGE_ERROR_NOT_FOUND,
742 std::unique_ptr<ServiceWorkerResponse>(), 773 std::unique_ptr<ServiceWorkerResponse>(),
743 std::unique_ptr<storage::BlobDataHandle>()); 774 std::unique_ptr<storage::BlobDataHandle>());
744 return; 775 return;
745 } 776 }
746 777
747 std::unique_ptr<ServiceWorkerResponse> response = 778 std::unique_ptr<ServiceWorkerResponse> response =
748 base::MakeUnique<ServiceWorkerResponse>(match_all_responses->at(0)); 779 base::MakeUnique<ServiceWorkerResponse>(match_all_responses->at(0));
749 780
750 std::unique_ptr<storage::BlobDataHandle> data_handle; 781 callback.Run(CACHE_STORAGE_OK, std::move(response),
751 if (response->blob_size > 0) { 782 std::move(match_all_handles->at(0)));
752 // NOTE: This assumes that MatchAll returns the handles in the same order
753 // as the responses.
754 data_handle =
755 base::MakeUnique<storage::BlobDataHandle>(match_all_handles->at(0));
756 }
757
758 callback.Run(CACHE_STORAGE_OK, std::move(response), std::move(data_handle));
759 } 783 }
760 784
761 void CacheStorageCache::MatchAllImpl( 785 void CacheStorageCache::MatchAllImpl(
762 std::unique_ptr<ServiceWorkerFetchRequest> request, 786 std::unique_ptr<ServiceWorkerFetchRequest> request,
763 const CacheStorageCacheQueryParams& options, 787 const CacheStorageCacheQueryParams& options,
764 const ResponsesCallback& callback) { 788 const ResponsesCallback& callback) {
765 DCHECK_NE(BACKEND_UNINITIALIZED, backend_state_); 789 DCHECK_NE(BACKEND_UNINITIALIZED, backend_state_);
766 if (backend_state_ != BACKEND_OPEN) { 790 if (backend_state_ != BACKEND_OPEN) {
767 callback.Run(CACHE_STORAGE_ERROR_STORAGE, std::unique_ptr<Responses>(), 791 callback.Run(CACHE_STORAGE_ERROR_STORAGE, std::unique_ptr<Responses>(),
768 std::unique_ptr<BlobDataHandles>()); 792 std::unique_ptr<BlobDataHandles>());
769 return; 793 return;
770 } 794 }
771 795
772 QueryCache(std::move(request), options, 796 QueryCache(std::move(request), options,
773 QueryCacheType::REQUESTS_AND_RESPONSES, 797 QueryCacheType::REQUESTS_AND_RESPONSES,
774 base::Bind(&CacheStorageCache::MatchAllDidQueryCache, 798 base::Bind(&CacheStorageCache::MatchAllDidQueryCache,
775 weak_ptr_factory_.GetWeakPtr(), callback)); 799 weak_ptr_factory_.GetWeakPtr(), callback));
776 } 800 }
777 801
778 void CacheStorageCache::MatchAllDidQueryCache( 802 void CacheStorageCache::MatchAllDidQueryCache(
779 const ResponsesCallback& callback, 803 const ResponsesCallback& callback,
780 CacheStorageError error, 804 CacheStorageError error,
781 std::unique_ptr<QueryCacheResults> query_cache_results) { 805 std::unique_ptr<QueryCacheResults> query_cache_results) {
782 if (error != CACHE_STORAGE_OK) { 806 if (error != CACHE_STORAGE_OK) {
783 callback.Run(error, std::unique_ptr<Responses>(), 807 callback.Run(error, std::unique_ptr<Responses>(),
784 std::unique_ptr<BlobDataHandles>()); 808 std::unique_ptr<BlobDataHandles>());
785 return; 809 return;
786 } 810 }
787 811
788 callback.Run(CACHE_STORAGE_OK, std::move(query_cache_results->out_responses), 812 std::unique_ptr<Responses> out_responses = base::MakeUnique<Responses>();
789 std::move(query_cache_results->out_blob_data_handles)); 813 std::unique_ptr<BlobDataHandles> out_handles =
814 base::MakeUnique<BlobDataHandles>();
815 out_responses->reserve(query_cache_results->size());
816 out_handles->reserve(query_cache_results->size());
817
818 for (auto& result : *query_cache_results) {
819 out_responses->push_back(*result.response);
820 out_handles->push_back(std::move(result.blob_handle));
821 }
822
823 callback.Run(CACHE_STORAGE_OK, std::move(out_responses),
824 std::move(out_handles));
790 } 825 }
791 826
792 void CacheStorageCache::WriteSideDataDidGetQuota( 827 void CacheStorageCache::WriteSideDataDidGetQuota(
793 const ErrorCallback& callback, 828 const ErrorCallback& callback,
794 const GURL& url, 829 const GURL& url,
795 base::Time expected_response_time, 830 base::Time expected_response_time,
796 scoped_refptr<net::IOBuffer> buffer, 831 scoped_refptr<net::IOBuffer> buffer,
797 int buf_len, 832 int buf_len,
798 storage::QuotaStatusCode status_code, 833 storage::QuotaStatusCode status_code,
799 int64_t usage, 834 int64_t usage,
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
1004 std::unique_ptr<PutContext> put_context, 1039 std::unique_ptr<PutContext> put_context,
1005 int rv) { 1040 int rv) {
1006 put_context->cache_entry.reset(*entry_ptr); 1041 put_context->cache_entry.reset(*entry_ptr);
1007 1042
1008 if (rv != net::OK) { 1043 if (rv != net::OK) {
1009 put_context->callback.Run(CACHE_STORAGE_ERROR_EXISTS); 1044 put_context->callback.Run(CACHE_STORAGE_ERROR_EXISTS);
1010 return; 1045 return;
1011 } 1046 }
1012 1047
1013 CacheMetadata metadata; 1048 CacheMetadata metadata;
1049 metadata.set_entry_time(base::Time::Now().ToInternalValue());
1014 CacheRequest* request_metadata = metadata.mutable_request(); 1050 CacheRequest* request_metadata = metadata.mutable_request();
1015 request_metadata->set_method(put_context->request->method); 1051 request_metadata->set_method(put_context->request->method);
1016 for (ServiceWorkerHeaderMap::const_iterator it = 1052 for (ServiceWorkerHeaderMap::const_iterator it =
1017 put_context->request->headers.begin(); 1053 put_context->request->headers.begin();
1018 it != put_context->request->headers.end(); ++it) { 1054 it != put_context->request->headers.end(); ++it) {
1019 DCHECK_EQ(std::string::npos, it->first.find('\0')); 1055 DCHECK_EQ(std::string::npos, it->first.find('\0'));
1020 DCHECK_EQ(std::string::npos, it->second.find('\0')); 1056 DCHECK_EQ(std::string::npos, it->second.find('\0'));
1021 CacheHeaderMap* header_map = request_metadata->add_headers(); 1057 CacheHeaderMap* header_map = request_metadata->add_headers();
1022 header_map->set_name(it->first); 1058 header_map->set_name(it->first);
1023 header_map->set_value(it->second); 1059 header_map->set_value(it->second);
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1188 1224
1189 void CacheStorageCache::DeleteDidQueryCache( 1225 void CacheStorageCache::DeleteDidQueryCache(
1190 const ErrorCallback& callback, 1226 const ErrorCallback& callback,
1191 CacheStorageError error, 1227 CacheStorageError error,
1192 std::unique_ptr<QueryCacheResults> query_cache_results) { 1228 std::unique_ptr<QueryCacheResults> query_cache_results) {
1193 if (error != CACHE_STORAGE_OK) { 1229 if (error != CACHE_STORAGE_OK) {
1194 callback.Run(error); 1230 callback.Run(error);
1195 return; 1231 return;
1196 } 1232 }
1197 1233
1198 if (query_cache_results->out_entries.empty()) { 1234 if (query_cache_results->empty()) {
1199 callback.Run(CACHE_STORAGE_ERROR_NOT_FOUND); 1235 callback.Run(CACHE_STORAGE_ERROR_NOT_FOUND);
1200 return; 1236 return;
1201 } 1237 }
1202 1238
1203 for (auto& entry : query_cache_results->out_entries) { 1239 for (auto& result : *query_cache_results) {
1240 disk_cache::ScopedEntryPtr entry = std::move(result.entry);
1204 entry->Doom(); 1241 entry->Doom();
1205 entry.reset();
1206 } 1242 }
1207 1243
1208 UpdateCacheSize(); 1244 UpdateCacheSize();
1209 callback.Run(CACHE_STORAGE_OK); 1245 callback.Run(CACHE_STORAGE_OK);
1210 } 1246 }
1211 1247
1212 void CacheStorageCache::KeysImpl( 1248 void CacheStorageCache::KeysImpl(
1213 std::unique_ptr<ServiceWorkerFetchRequest> request, 1249 std::unique_ptr<ServiceWorkerFetchRequest> request,
1214 const CacheStorageCacheQueryParams& options, 1250 const CacheStorageCacheQueryParams& options,
1215 const RequestsCallback& callback) { 1251 const RequestsCallback& callback) {
(...skipping 10 matching lines...) Expand all
1226 1262
1227 void CacheStorageCache::KeysDidQueryCache( 1263 void CacheStorageCache::KeysDidQueryCache(
1228 const RequestsCallback& callback, 1264 const RequestsCallback& callback,
1229 CacheStorageError error, 1265 CacheStorageError error,
1230 std::unique_ptr<QueryCacheResults> query_cache_results) { 1266 std::unique_ptr<QueryCacheResults> query_cache_results) {
1231 if (error != CACHE_STORAGE_OK) { 1267 if (error != CACHE_STORAGE_OK) {
1232 callback.Run(error, std::unique_ptr<Requests>()); 1268 callback.Run(error, std::unique_ptr<Requests>());
1233 return; 1269 return;
1234 } 1270 }
1235 1271
1236 callback.Run(CACHE_STORAGE_OK, std::move(query_cache_results->out_requests)); 1272 std::unique_ptr<Requests> out_requests = base::MakeUnique<Requests>();
1273 out_requests->reserve(query_cache_results->size());
1274 for (const auto& result : *query_cache_results)
1275 out_requests->push_back(*result.request);
1276
1277 callback.Run(CACHE_STORAGE_OK, std::move(out_requests));
1237 } 1278 }
1238 1279
1239 void CacheStorageCache::CloseImpl(const base::Closure& callback) { 1280 void CacheStorageCache::CloseImpl(const base::Closure& callback) {
1240 DCHECK_NE(BACKEND_CLOSED, backend_state_); 1281 DCHECK_NE(BACKEND_CLOSED, backend_state_);
1241 1282
1242 backend_state_ = BACKEND_CLOSED; 1283 backend_state_ = BACKEND_CLOSED;
1243 backend_.reset(); 1284 backend_.reset();
1244 callback.Run(); 1285 callback.Run();
1245 } 1286 }
1246 1287
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
1398 temp_entry, INDEX_RESPONSE_BODY, INDEX_SIDE_DATA); 1439 temp_entry, INDEX_RESPONSE_BODY, INDEX_SIDE_DATA);
1399 return blob_storage_context_->AddFinishedBlob(&blob_data); 1440 return blob_storage_context_->AddFinishedBlob(&blob_data);
1400 } 1441 }
1401 1442
1402 std::unique_ptr<CacheStorageCacheHandle> 1443 std::unique_ptr<CacheStorageCacheHandle>
1403 CacheStorageCache::CreateCacheHandle() { 1444 CacheStorageCache::CreateCacheHandle() {
1404 return cache_storage_->CreateCacheHandle(this); 1445 return cache_storage_->CreateCacheHandle(this);
1405 } 1446 }
1406 1447
1407 } // namespace content 1448 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/cache_storage/cache_storage_cache.h ('k') | content/browser/cache_storage/cache_storage_cache_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698