| 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 |