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_url_request_job.h" | 5 #include "content/browser/service_worker/service_worker_url_request_job.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | |
10 #include <limits> | 9 #include <limits> |
11 #include <map> | 10 #include <map> |
12 #include <string> | 11 #include <string> |
| 12 #include <utility> |
13 #include <vector> | 13 #include <vector> |
14 | 14 |
15 #include "base/bind.h" | 15 #include "base/bind.h" |
16 #include "base/guid.h" | 16 #include "base/guid.h" |
17 #include "base/location.h" | 17 #include "base/location.h" |
18 #include "base/memory/scoped_ptr.h" | 18 #include "base/memory/scoped_ptr.h" |
19 #include "base/single_thread_task_runner.h" | 19 #include "base/single_thread_task_runner.h" |
20 #include "base/strings/stringprintf.h" | 20 #include "base/strings/stringprintf.h" |
21 #include "base/thread_task_runner_handle.h" | 21 #include "base/thread_task_runner_handle.h" |
22 #include "base/time/time.h" | 22 #include "base/time/time.h" |
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 info->GetPageTransition(), ui::PAGE_TRANSITION_RELOAD); | 468 info->GetPageTransition(), ui::PAGE_TRANSITION_RELOAD); |
469 request->referrer = | 469 request->referrer = |
470 Referrer(GURL(request_->referrer()), info->GetReferrerPolicy()); | 470 Referrer(GURL(request_->referrer()), info->GetReferrerPolicy()); |
471 } else { | 471 } else { |
472 CHECK( | 472 CHECK( |
473 request_->referrer_policy() == | 473 request_->referrer_policy() == |
474 net::URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE); | 474 net::URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE); |
475 request->referrer = | 475 request->referrer = |
476 Referrer(GURL(request_->referrer()), blink::WebReferrerPolicyDefault); | 476 Referrer(GURL(request_->referrer()), blink::WebReferrerPolicyDefault); |
477 } | 477 } |
478 return request.Pass(); | 478 return request; |
479 } | 479 } |
480 | 480 |
481 bool ServiceWorkerURLRequestJob::CreateRequestBodyBlob(std::string* blob_uuid, | 481 bool ServiceWorkerURLRequestJob::CreateRequestBodyBlob(std::string* blob_uuid, |
482 uint64_t* blob_size) { | 482 uint64_t* blob_size) { |
483 if (!body_.get() || !blob_storage_context_) | 483 if (!body_.get() || !blob_storage_context_) |
484 return false; | 484 return false; |
485 | 485 |
486 // To ensure the blobs stick around until the end of the reading. | 486 // To ensure the blobs stick around until the end of the reading. |
487 std::vector<scoped_ptr<storage::BlobDataHandle>> handles; | 487 std::vector<scoped_ptr<storage::BlobDataHandle>> handles; |
488 std::vector<scoped_ptr<storage::BlobDataSnapshot>> snapshots; | 488 std::vector<scoped_ptr<storage::BlobDataSnapshot>> snapshots; |
489 // TODO(dmurph): Allow blobs to be added below, so that the context can | 489 // TODO(dmurph): Allow blobs to be added below, so that the context can |
490 // efficiently re-use blob items for the new blob. | 490 // efficiently re-use blob items for the new blob. |
491 std::vector<const ResourceRequestBody::Element*> resolved_elements; | 491 std::vector<const ResourceRequestBody::Element*> resolved_elements; |
492 for (const ResourceRequestBody::Element& element : (*body_->elements())) { | 492 for (const ResourceRequestBody::Element& element : (*body_->elements())) { |
493 if (element.type() != ResourceRequestBody::Element::TYPE_BLOB) { | 493 if (element.type() != ResourceRequestBody::Element::TYPE_BLOB) { |
494 resolved_elements.push_back(&element); | 494 resolved_elements.push_back(&element); |
495 continue; | 495 continue; |
496 } | 496 } |
497 scoped_ptr<storage::BlobDataHandle> handle = | 497 scoped_ptr<storage::BlobDataHandle> handle = |
498 blob_storage_context_->GetBlobDataFromUUID(element.blob_uuid()); | 498 blob_storage_context_->GetBlobDataFromUUID(element.blob_uuid()); |
499 scoped_ptr<storage::BlobDataSnapshot> snapshot = handle->CreateSnapshot(); | 499 scoped_ptr<storage::BlobDataSnapshot> snapshot = handle->CreateSnapshot(); |
500 if (snapshot->items().empty()) | 500 if (snapshot->items().empty()) |
501 continue; | 501 continue; |
502 const auto& items = snapshot->items(); | 502 const auto& items = snapshot->items(); |
503 for (const auto& item : items) { | 503 for (const auto& item : items) { |
504 DCHECK_NE(storage::DataElement::TYPE_BLOB, item->type()); | 504 DCHECK_NE(storage::DataElement::TYPE_BLOB, item->type()); |
505 resolved_elements.push_back(item->data_element_ptr()); | 505 resolved_elements.push_back(item->data_element_ptr()); |
506 } | 506 } |
507 handles.push_back(handle.Pass()); | 507 handles.push_back(std::move(handle)); |
508 snapshots.push_back(snapshot.Pass()); | 508 snapshots.push_back(std::move(snapshot)); |
509 } | 509 } |
510 | 510 |
511 const std::string uuid(base::GenerateGUID()); | 511 const std::string uuid(base::GenerateGUID()); |
512 uint64_t total_size = 0; | 512 uint64_t total_size = 0; |
513 | 513 |
514 storage::BlobDataBuilder blob_builder(uuid); | 514 storage::BlobDataBuilder blob_builder(uuid); |
515 for (size_t i = 0; i < resolved_elements.size(); ++i) { | 515 for (size_t i = 0; i < resolved_elements.size(); ++i) { |
516 const ResourceRequestBody::Element& element = *resolved_elements[i]; | 516 const ResourceRequestBody::Element& element = *resolved_elements[i]; |
517 if (total_size != std::numeric_limits<uint64_t>::max() && | 517 if (total_size != std::numeric_limits<uint64_t>::max() && |
518 element.length() != std::numeric_limits<uint64_t>::max()) | 518 element.length() != std::numeric_limits<uint64_t>::max()) |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
677 SetResponseBodyType(BLOB); | 677 SetResponseBodyType(BLOB); |
678 scoped_ptr<storage::BlobDataHandle> blob_data_handle = | 678 scoped_ptr<storage::BlobDataHandle> blob_data_handle = |
679 blob_storage_context_->GetBlobDataFromUUID(response.blob_uuid); | 679 blob_storage_context_->GetBlobDataFromUUID(response.blob_uuid); |
680 if (!blob_data_handle) { | 680 if (!blob_data_handle) { |
681 // The renderer gave us a bad blob UUID. | 681 // The renderer gave us a bad blob UUID. |
682 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_BAD_BLOB); | 682 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_BAD_BLOB); |
683 DeliverErrorResponse(); | 683 DeliverErrorResponse(); |
684 return; | 684 return; |
685 } | 685 } |
686 blob_request_ = storage::BlobProtocolHandler::CreateBlobRequest( | 686 blob_request_ = storage::BlobProtocolHandler::CreateBlobRequest( |
687 blob_data_handle.Pass(), request()->context(), this); | 687 std::move(blob_data_handle), request()->context(), this); |
688 blob_request_->Start(); | 688 blob_request_->Start(); |
689 } | 689 } |
690 | 690 |
691 response_url_ = response.url; | 691 response_url_ = response.url; |
692 service_worker_response_type_ = response.response_type; | 692 service_worker_response_type_ = response.response_type; |
693 CreateResponseHeader( | 693 CreateResponseHeader( |
694 response.status_code, response.status_text, response.headers); | 694 response.status_code, response.status_text, response.headers); |
695 load_timing_info_.receive_headers_end = base::TimeTicks::Now(); | 695 load_timing_info_.receive_headers_end = base::TimeTicks::Now(); |
696 if (!blob_request_) { | 696 if (!blob_request_) { |
697 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_HEADERS_ONLY_RESPONSE); | 697 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_HEADERS_ONLY_RESPONSE); |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
822 base::TimeTicks() /* service_worker_ready_time */); | 822 base::TimeTicks() /* service_worker_ready_time */); |
823 return; | 823 return; |
824 } | 824 } |
825 delegate_->OnStartCompleted(true /* was_fetched_via_service_worker */, | 825 delegate_->OnStartCompleted(true /* was_fetched_via_service_worker */, |
826 fall_back_required_, response_url_, | 826 fall_back_required_, response_url_, |
827 service_worker_response_type_, worker_start_time_, | 827 service_worker_response_type_, worker_start_time_, |
828 worker_ready_time_); | 828 worker_ready_time_); |
829 } | 829 } |
830 | 830 |
831 } // namespace content | 831 } // namespace content |
OLD | NEW |