| 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 | 9 |
| 10 #include <map> | 10 #include <map> |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "base/threading/sequenced_worker_pool.h" | 26 #include "base/threading/sequenced_worker_pool.h" |
| 27 #include "base/threading/thread_task_runner_handle.h" | 27 #include "base/threading/thread_task_runner_handle.h" |
| 28 #include "base/time/time.h" | 28 #include "base/time/time.h" |
| 29 #include "content/browser/resource_context_impl.h" | 29 #include "content/browser/resource_context_impl.h" |
| 30 #include "content/browser/service_worker/embedded_worker_instance.h" | 30 #include "content/browser/service_worker/embedded_worker_instance.h" |
| 31 #include "content/browser/service_worker/service_worker_blob_reader.h" | 31 #include "content/browser/service_worker/service_worker_blob_reader.h" |
| 32 #include "content/browser/service_worker/service_worker_data_pipe_reader.h" | 32 #include "content/browser/service_worker/service_worker_data_pipe_reader.h" |
| 33 #include "content/browser/service_worker/service_worker_fetch_dispatcher.h" | 33 #include "content/browser/service_worker/service_worker_fetch_dispatcher.h" |
| 34 #include "content/browser/service_worker/service_worker_provider_host.h" | 34 #include "content/browser/service_worker/service_worker_provider_host.h" |
| 35 #include "content/browser/service_worker/service_worker_response_info.h" | 35 #include "content/browser/service_worker/service_worker_response_info.h" |
| 36 #include "content/common/resource_request_body_impl.h" | |
| 37 #include "content/common/service_worker/service_worker_types.h" | 36 #include "content/common/service_worker/service_worker_types.h" |
| 38 #include "content/common/service_worker/service_worker_utils.h" | 37 #include "content/common/service_worker/service_worker_utils.h" |
| 39 #include "content/public/browser/blob_handle.h" | 38 #include "content/public/browser/blob_handle.h" |
| 40 #include "content/public/browser/browser_thread.h" | 39 #include "content/public/browser/browser_thread.h" |
| 41 #include "content/public/browser/resource_request_info.h" | 40 #include "content/public/browser/resource_request_info.h" |
| 42 #include "content/public/browser/service_worker_context.h" | 41 #include "content/public/browser/service_worker_context.h" |
| 43 #include "content/public/common/referrer.h" | 42 #include "content/public/common/referrer.h" |
| 43 #include "content/public/common/resource_request_body.h" |
| 44 #include "net/base/net_errors.h" | 44 #include "net/base/net_errors.h" |
| 45 #include "net/http/http_request_headers.h" | 45 #include "net/http/http_request_headers.h" |
| 46 #include "net/http/http_response_headers.h" | 46 #include "net/http/http_response_headers.h" |
| 47 #include "net/http/http_response_info.h" | 47 #include "net/http/http_response_info.h" |
| 48 #include "net/http/http_util.h" | 48 #include "net/http/http_util.h" |
| 49 #include "net/log/net_log.h" | 49 #include "net/log/net_log.h" |
| 50 #include "net/log/net_log_event_type.h" | 50 #include "net/log/net_log_event_type.h" |
| 51 #include "net/log/net_log_with_source.h" | 51 #include "net/log/net_log_with_source.h" |
| 52 #include "storage/browser/blob/blob_data_builder.h" | 52 #include "storage/browser/blob/blob_data_builder.h" |
| 53 #include "storage/browser/blob/blob_data_handle.h" | 53 #include "storage/browser/blob/blob_data_handle.h" |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 | 150 |
| 151 void Resolve(base::TaskRunner* file_runner, | 151 void Resolve(base::TaskRunner* file_runner, |
| 152 const base::Callback<void(bool)>& callback) { | 152 const base::Callback<void(bool)>& callback) { |
| 153 DCHECK_EQ(static_cast<int>(Phase::INITIAL), static_cast<int>(phase_)); | 153 DCHECK_EQ(static_cast<int>(Phase::INITIAL), static_cast<int>(phase_)); |
| 154 DCHECK(file_elements_.empty()); | 154 DCHECK(file_elements_.empty()); |
| 155 phase_ = Phase::WAITING; | 155 phase_ = Phase::WAITING; |
| 156 body_ = owner_->body_; | 156 body_ = owner_->body_; |
| 157 callback_ = callback; | 157 callback_ = callback; |
| 158 | 158 |
| 159 std::vector<base::FilePath> file_paths; | 159 std::vector<base::FilePath> file_paths; |
| 160 for (ResourceRequestBodyImpl::Element& element : | 160 for (ResourceRequestBody::Element& element : *body_->elements_mutable()) { |
| 161 *body_->elements_mutable()) { | 161 if (element.type() == ResourceRequestBody::Element::TYPE_FILE && |
| 162 if (element.type() == ResourceRequestBodyImpl::Element::TYPE_FILE && | 162 element.length() == ResourceRequestBody::Element::kUnknownSize) { |
| 163 element.length() == ResourceRequestBodyImpl::Element::kUnknownSize) { | |
| 164 file_elements_.push_back(&element); | 163 file_elements_.push_back(&element); |
| 165 file_paths.push_back(element.path()); | 164 file_paths.push_back(element.path()); |
| 166 } | 165 } |
| 167 } | 166 } |
| 168 if (file_elements_.empty()) { | 167 if (file_elements_.empty()) { |
| 169 Complete(true); | 168 Complete(true); |
| 170 return; | 169 return; |
| 171 } | 170 } |
| 172 | 171 |
| 173 PostTaskAndReplyWithResult( | 172 PostTaskAndReplyWithResult( |
| 174 file_runner, FROM_HERE, | 173 file_runner, FROM_HERE, |
| 175 base::Bind(&GetFileSizesOnBlockingPool, base::Passed(&file_paths)), | 174 base::Bind(&GetFileSizesOnBlockingPool, base::Passed(&file_paths)), |
| 176 base::Bind( | 175 base::Bind( |
| 177 &ServiceWorkerURLRequestJob::FileSizeResolver::OnFileSizesResolved, | 176 &ServiceWorkerURLRequestJob::FileSizeResolver::OnFileSizesResolved, |
| 178 weak_factory_.GetWeakPtr())); | 177 weak_factory_.GetWeakPtr())); |
| 179 } | 178 } |
| 180 | 179 |
| 181 private: | 180 private: |
| 182 enum class Phase { INITIAL, WAITING, SUCCESS, FAIL }; | 181 enum class Phase { INITIAL, WAITING, SUCCESS, FAIL }; |
| 183 | 182 |
| 184 void OnFileSizesResolved(std::vector<int64_t> sizes) { | 183 void OnFileSizesResolved(std::vector<int64_t> sizes) { |
| 185 bool success = !sizes.empty(); | 184 bool success = !sizes.empty(); |
| 186 if (success) { | 185 if (success) { |
| 187 DCHECK_EQ(sizes.size(), file_elements_.size()); | 186 DCHECK_EQ(sizes.size(), file_elements_.size()); |
| 188 size_t num_elements = file_elements_.size(); | 187 size_t num_elements = file_elements_.size(); |
| 189 for (size_t i = 0; i < num_elements; i++) { | 188 for (size_t i = 0; i < num_elements; i++) { |
| 190 ResourceRequestBodyImpl::Element* element = file_elements_[i]; | 189 ResourceRequestBody::Element* element = file_elements_[i]; |
| 191 element->SetToFilePathRange(element->path(), element->offset(), | 190 element->SetToFilePathRange(element->path(), element->offset(), |
| 192 base::checked_cast<uint64_t>(sizes[i]), | 191 base::checked_cast<uint64_t>(sizes[i]), |
| 193 element->expected_modification_time()); | 192 element->expected_modification_time()); |
| 194 } | 193 } |
| 195 file_elements_.clear(); | 194 file_elements_.clear(); |
| 196 } | 195 } |
| 197 Complete(success); | 196 Complete(success); |
| 198 } | 197 } |
| 199 | 198 |
| 200 void Complete(bool success) { | 199 void Complete(bool success) { |
| 201 DCHECK_EQ(static_cast<int>(Phase::WAITING), static_cast<int>(phase_)); | 200 DCHECK_EQ(static_cast<int>(Phase::WAITING), static_cast<int>(phase_)); |
| 202 phase_ = success ? Phase::SUCCESS : Phase::FAIL; | 201 phase_ = success ? Phase::SUCCESS : Phase::FAIL; |
| 203 // Destroys |this|, so we use a copy. | 202 // Destroys |this|, so we use a copy. |
| 204 base::ResetAndReturn(&callback_).Run(success); | 203 base::ResetAndReturn(&callback_).Run(success); |
| 205 } | 204 } |
| 206 | 205 |
| 207 // Owns and must outlive |this|. | 206 // Owns and must outlive |this|. |
| 208 ServiceWorkerURLRequestJob* owner_; | 207 ServiceWorkerURLRequestJob* owner_; |
| 209 | 208 |
| 210 scoped_refptr<ResourceRequestBodyImpl> body_; | 209 scoped_refptr<ResourceRequestBody> body_; |
| 211 std::vector<ResourceRequestBodyImpl::Element*> file_elements_; | 210 std::vector<ResourceRequestBody::Element*> file_elements_; |
| 212 base::Callback<void(bool)> callback_; | 211 base::Callback<void(bool)> callback_; |
| 213 Phase phase_ = Phase::INITIAL; | 212 Phase phase_ = Phase::INITIAL; |
| 214 base::WeakPtrFactory<FileSizeResolver> weak_factory_; | 213 base::WeakPtrFactory<FileSizeResolver> weak_factory_; |
| 215 | 214 |
| 216 DISALLOW_COPY_AND_ASSIGN(FileSizeResolver); | 215 DISALLOW_COPY_AND_ASSIGN(FileSizeResolver); |
| 217 }; | 216 }; |
| 218 | 217 |
| 219 // A helper for recording navigation preload UMA. The UMA is recorded | 218 // A helper for recording navigation preload UMA. The UMA is recorded |
| 220 // after both service worker preparation finished and the | 219 // after both service worker preparation finished and the |
| 221 // navigation preload response arrived. | 220 // navigation preload response arrived. |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 net::NetworkDelegate* network_delegate, | 311 net::NetworkDelegate* network_delegate, |
| 313 const std::string& client_id, | 312 const std::string& client_id, |
| 314 base::WeakPtr<storage::BlobStorageContext> blob_storage_context, | 313 base::WeakPtr<storage::BlobStorageContext> blob_storage_context, |
| 315 const ResourceContext* resource_context, | 314 const ResourceContext* resource_context, |
| 316 FetchRequestMode request_mode, | 315 FetchRequestMode request_mode, |
| 317 FetchCredentialsMode credentials_mode, | 316 FetchCredentialsMode credentials_mode, |
| 318 FetchRedirectMode redirect_mode, | 317 FetchRedirectMode redirect_mode, |
| 319 ResourceType resource_type, | 318 ResourceType resource_type, |
| 320 RequestContextType request_context_type, | 319 RequestContextType request_context_type, |
| 321 RequestContextFrameType frame_type, | 320 RequestContextFrameType frame_type, |
| 322 scoped_refptr<ResourceRequestBodyImpl> body, | 321 scoped_refptr<ResourceRequestBody> body, |
| 323 ServiceWorkerFetchType fetch_type, | 322 ServiceWorkerFetchType fetch_type, |
| 324 const base::Optional<base::TimeDelta>& timeout, | 323 const base::Optional<base::TimeDelta>& timeout, |
| 325 Delegate* delegate) | 324 Delegate* delegate) |
| 326 : net::URLRequestJob(request, network_delegate), | 325 : net::URLRequestJob(request, network_delegate), |
| 327 delegate_(delegate), | 326 delegate_(delegate), |
| 328 response_type_(NOT_DETERMINED), | 327 response_type_(NOT_DETERMINED), |
| 329 is_started_(false), | 328 is_started_(false), |
| 330 service_worker_response_type_( | 329 service_worker_response_type_( |
| 331 blink::kWebServiceWorkerResponseTypeDefault), | 330 blink::kWebServiceWorkerResponseTypeDefault), |
| 332 client_id_(client_id), | 331 client_id_(client_id), |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 587 Referrer(GURL(request_->referrer()), blink::kWebReferrerPolicyDefault); | 586 Referrer(GURL(request_->referrer()), blink::kWebReferrerPolicyDefault); |
| 588 } | 587 } |
| 589 request->fetch_type = fetch_type_; | 588 request->fetch_type = fetch_type_; |
| 590 return request; | 589 return request; |
| 591 } | 590 } |
| 592 | 591 |
| 593 void ServiceWorkerURLRequestJob::CreateRequestBodyBlob(std::string* blob_uuid, | 592 void ServiceWorkerURLRequestJob::CreateRequestBodyBlob(std::string* blob_uuid, |
| 594 uint64_t* blob_size) { | 593 uint64_t* blob_size) { |
| 595 DCHECK(HasRequestBody()); | 594 DCHECK(HasRequestBody()); |
| 596 storage::BlobDataBuilder blob_builder(base::GenerateGUID()); | 595 storage::BlobDataBuilder blob_builder(base::GenerateGUID()); |
| 597 for (const ResourceRequestBodyImpl::Element& element : (*body_->elements())) { | 596 for (const ResourceRequestBody::Element& element : (*body_->elements())) { |
| 598 blob_builder.AppendIPCDataElement(element); | 597 blob_builder.AppendIPCDataElement(element); |
| 599 } | 598 } |
| 600 | 599 |
| 601 request_body_blob_data_handle_ = | 600 request_body_blob_data_handle_ = |
| 602 blob_storage_context_->AddFinishedBlob(&blob_builder); | 601 blob_storage_context_->AddFinishedBlob(&blob_builder); |
| 603 *blob_uuid = blob_builder.uuid(); | 602 *blob_uuid = blob_builder.uuid(); |
| 604 *blob_size = request_body_blob_data_handle_->size(); | 603 *blob_size = request_body_blob_data_handle_->size(); |
| 605 } | 604 } |
| 606 | 605 |
| 607 bool ServiceWorkerURLRequestJob::ShouldRecordNavigationMetrics( | 606 bool ServiceWorkerURLRequestJob::ShouldRecordNavigationMetrics( |
| (...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 993 weak_factory_.GetWeakPtr())); | 992 weak_factory_.GetWeakPtr())); |
| 994 } | 993 } |
| 995 fetch_dispatcher_->Run(); | 994 fetch_dispatcher_->Run(); |
| 996 } | 995 } |
| 997 | 996 |
| 998 void ServiceWorkerURLRequestJob::OnNavigationPreloadResponse() { | 997 void ServiceWorkerURLRequestJob::OnNavigationPreloadResponse() { |
| 999 nav_preload_metrics_->ReportNavigationPreloadFinished(); | 998 nav_preload_metrics_->ReportNavigationPreloadFinished(); |
| 1000 } | 999 } |
| 1001 | 1000 |
| 1002 } // namespace content | 1001 } // namespace content |
| OLD | NEW |