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 #include <limits> | 9 #include <limits> |
10 #include <map> | 10 #include <map> |
(...skipping 10 matching lines...) Expand all Loading... |
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" |
23 #include "content/browser/resource_context_impl.h" | 23 #include "content/browser/resource_context_impl.h" |
24 #include "content/browser/service_worker/service_worker_fetch_dispatcher.h" | 24 #include "content/browser/service_worker/service_worker_fetch_dispatcher.h" |
25 #include "content/browser/service_worker/service_worker_provider_host.h" | 25 #include "content/browser/service_worker/service_worker_provider_host.h" |
26 #include "content/browser/streams/stream.h" | 26 #include "content/browser/streams/stream.h" |
27 #include "content/browser/streams/stream_context.h" | 27 #include "content/browser/streams/stream_context.h" |
28 #include "content/browser/streams/stream_registry.h" | 28 #include "content/browser/streams/stream_registry.h" |
29 #include "content/common/resource_request_body.h" | 29 #include "content/common/resource_request_body.h" |
30 #include "content/common/service_worker/service_worker_types.h" | 30 #include "content/common/service_worker/service_worker_types.h" |
| 31 #include "content/common/service_worker/service_worker_utils.h" |
31 #include "content/public/browser/blob_handle.h" | 32 #include "content/public/browser/blob_handle.h" |
32 #include "content/public/browser/resource_request_info.h" | 33 #include "content/public/browser/resource_request_info.h" |
33 #include "content/public/browser/service_worker_context.h" | 34 #include "content/public/browser/service_worker_context.h" |
34 #include "content/public/common/referrer.h" | 35 #include "content/public/common/referrer.h" |
35 #include "net/base/net_errors.h" | 36 #include "net/base/net_errors.h" |
36 #include "net/http/http_request_headers.h" | 37 #include "net/http/http_request_headers.h" |
37 #include "net/http/http_response_headers.h" | 38 #include "net/http/http_response_headers.h" |
38 #include "net/http/http_response_info.h" | 39 #include "net/http/http_response_info.h" |
39 #include "net/http/http_util.h" | 40 #include "net/http/http_util.h" |
40 #include "net/log/net_log.h" | 41 #include "net/log/net_log.h" |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 | 109 |
109 ServiceWorkerURLRequestJob::ServiceWorkerURLRequestJob( | 110 ServiceWorkerURLRequestJob::ServiceWorkerURLRequestJob( |
110 net::URLRequest* request, | 111 net::URLRequest* request, |
111 net::NetworkDelegate* network_delegate, | 112 net::NetworkDelegate* network_delegate, |
112 const std::string& client_id, | 113 const std::string& client_id, |
113 base::WeakPtr<storage::BlobStorageContext> blob_storage_context, | 114 base::WeakPtr<storage::BlobStorageContext> blob_storage_context, |
114 const ResourceContext* resource_context, | 115 const ResourceContext* resource_context, |
115 FetchRequestMode request_mode, | 116 FetchRequestMode request_mode, |
116 FetchCredentialsMode credentials_mode, | 117 FetchCredentialsMode credentials_mode, |
117 FetchRedirectMode redirect_mode, | 118 FetchRedirectMode redirect_mode, |
118 bool is_main_resource_load, | 119 ResourceType resource_type, |
119 RequestContextType request_context_type, | 120 RequestContextType request_context_type, |
120 RequestContextFrameType frame_type, | 121 RequestContextFrameType frame_type, |
121 scoped_refptr<ResourceRequestBody> body, | 122 scoped_refptr<ResourceRequestBody> body, |
122 ServiceWorkerFetchType fetch_type, | 123 ServiceWorkerFetchType fetch_type, |
123 Delegate* delegate) | 124 Delegate* delegate) |
124 : net::URLRequestJob(request, network_delegate), | 125 : net::URLRequestJob(request, network_delegate), |
125 delegate_(delegate), | 126 delegate_(delegate), |
126 response_type_(NOT_DETERMINED), | 127 response_type_(NOT_DETERMINED), |
127 is_started_(false), | 128 is_started_(false), |
128 service_worker_response_type_(blink::WebServiceWorkerResponseTypeDefault), | 129 service_worker_response_type_(blink::WebServiceWorkerResponseTypeDefault), |
129 client_id_(client_id), | 130 client_id_(client_id), |
130 blob_storage_context_(blob_storage_context), | 131 blob_storage_context_(blob_storage_context), |
131 resource_context_(resource_context), | 132 resource_context_(resource_context), |
132 stream_pending_buffer_size_(0), | 133 stream_pending_buffer_size_(0), |
133 request_mode_(request_mode), | 134 request_mode_(request_mode), |
134 credentials_mode_(credentials_mode), | 135 credentials_mode_(credentials_mode), |
135 redirect_mode_(redirect_mode), | 136 redirect_mode_(redirect_mode), |
136 is_main_resource_load_(is_main_resource_load), | 137 resource_type_(resource_type), |
137 request_context_type_(request_context_type), | 138 request_context_type_(request_context_type), |
138 frame_type_(frame_type), | 139 frame_type_(frame_type), |
139 fall_back_required_(false), | 140 fall_back_required_(false), |
140 body_(body), | 141 body_(body), |
141 fetch_type_(fetch_type), | 142 fetch_type_(fetch_type), |
142 weak_factory_(this) { | 143 weak_factory_(this) { |
143 DCHECK(delegate_) << "ServiceWorkerURLRequestJob requires a delegate"; | 144 DCHECK(delegate_) << "ServiceWorkerURLRequestJob requires a delegate"; |
144 } | 145 } |
145 | 146 |
146 ServiceWorkerURLRequestJob::~ServiceWorkerURLRequestJob() { | 147 ServiceWorkerURLRequestJob::~ServiceWorkerURLRequestJob() { |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
425 if (!active_worker) { | 426 if (!active_worker) { |
426 RecordResult(result); | 427 RecordResult(result); |
427 DeliverErrorResponse(); | 428 DeliverErrorResponse(); |
428 return; | 429 return; |
429 } | 430 } |
430 | 431 |
431 DCHECK(!fetch_dispatcher_); | 432 DCHECK(!fetch_dispatcher_); |
432 // Send a fetch event to the ServiceWorker associated to the | 433 // Send a fetch event to the ServiceWorker associated to the |
433 // provider_host. | 434 // provider_host. |
434 fetch_dispatcher_.reset(new ServiceWorkerFetchDispatcher( | 435 fetch_dispatcher_.reset(new ServiceWorkerFetchDispatcher( |
435 CreateFetchRequest(), active_worker, | 436 CreateFetchRequest(), active_worker, resource_type_, |
436 base::Bind(&ServiceWorkerURLRequestJob::DidPrepareFetchEvent, | 437 base::Bind(&ServiceWorkerURLRequestJob::DidPrepareFetchEvent, |
437 weak_factory_.GetWeakPtr()), | 438 weak_factory_.GetWeakPtr()), |
438 base::Bind(&ServiceWorkerURLRequestJob::DidDispatchFetchEvent, | 439 base::Bind(&ServiceWorkerURLRequestJob::DidDispatchFetchEvent, |
439 weak_factory_.GetWeakPtr()))); | 440 weak_factory_.GetWeakPtr()))); |
440 worker_start_time_ = base::TimeTicks::Now(); | 441 worker_start_time_ = base::TimeTicks::Now(); |
441 fetch_dispatcher_->Run(); | 442 fetch_dispatcher_->Run(); |
442 return; | 443 return; |
443 } | 444 } |
444 | 445 |
445 NOTREACHED(); | 446 NOTREACHED(); |
446 } | 447 } |
447 | 448 |
448 scoped_ptr<ServiceWorkerFetchRequest> | 449 scoped_ptr<ServiceWorkerFetchRequest> |
449 ServiceWorkerURLRequestJob::CreateFetchRequest() { | 450 ServiceWorkerURLRequestJob::CreateFetchRequest() { |
450 std::string blob_uuid; | 451 std::string blob_uuid; |
451 uint64_t blob_size = 0; | 452 uint64_t blob_size = 0; |
452 // The upload data in URLRequest may have been cleared while handing redirect. | 453 // The upload data in URLRequest may have been cleared while handing redirect. |
453 if (request_->has_upload()) | 454 if (request_->has_upload()) |
454 CreateRequestBodyBlob(&blob_uuid, &blob_size); | 455 CreateRequestBodyBlob(&blob_uuid, &blob_size); |
455 scoped_ptr<ServiceWorkerFetchRequest> request( | 456 scoped_ptr<ServiceWorkerFetchRequest> request( |
456 new ServiceWorkerFetchRequest()); | 457 new ServiceWorkerFetchRequest()); |
457 request->mode = request_mode_; | 458 request->mode = request_mode_; |
458 request->is_main_resource_load = is_main_resource_load_; | 459 request->is_main_resource_load = IsMainResourceLoad(); |
459 request->request_context_type = request_context_type_; | 460 request->request_context_type = request_context_type_; |
460 request->frame_type = frame_type_; | 461 request->frame_type = frame_type_; |
461 request->url = request_->url(); | 462 request->url = request_->url(); |
462 request->method = request_->method(); | 463 request->method = request_->method(); |
463 const net::HttpRequestHeaders& headers = request_->extra_request_headers(); | 464 const net::HttpRequestHeaders& headers = request_->extra_request_headers(); |
464 for (net::HttpRequestHeaders::Iterator it(headers); it.GetNext();) { | 465 for (net::HttpRequestHeaders::Iterator it(headers); it.GetNext();) { |
465 if (ServiceWorkerContext::IsExcludedHeaderNameForFetchEvent(it.name())) | 466 if (ServiceWorkerContext::IsExcludedHeaderNameForFetchEvent(it.name())) |
466 continue; | 467 continue; |
467 request->headers[it.name()] = it.value(); | 468 request->headers[it.name()] = it.value(); |
468 } | 469 } |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
563 worker_ready_time_ = base::TimeTicks::Now(); | 564 worker_ready_time_ = base::TimeTicks::Now(); |
564 load_timing_info_.send_start = worker_ready_time_; | 565 load_timing_info_.send_start = worker_ready_time_; |
565 } | 566 } |
566 | 567 |
567 void ServiceWorkerURLRequestJob::DidDispatchFetchEvent( | 568 void ServiceWorkerURLRequestJob::DidDispatchFetchEvent( |
568 ServiceWorkerStatusCode status, | 569 ServiceWorkerStatusCode status, |
569 ServiceWorkerFetchEventResult fetch_result, | 570 ServiceWorkerFetchEventResult fetch_result, |
570 const ServiceWorkerResponse& response, | 571 const ServiceWorkerResponse& response, |
571 const scoped_refptr<ServiceWorkerVersion>& version) { | 572 const scoped_refptr<ServiceWorkerVersion>& version) { |
572 fetch_dispatcher_.reset(); | 573 fetch_dispatcher_.reset(); |
573 ServiceWorkerMetrics::RecordFetchEventStatus(is_main_resource_load_, status); | 574 ServiceWorkerMetrics::RecordFetchEventStatus(IsMainResourceLoad(), status); |
574 | 575 |
575 // Check if we're not orphaned. | 576 // Check if we're not orphaned. |
576 if (!request()) { | 577 if (!request()) { |
577 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_NO_REQUEST); | 578 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_NO_REQUEST); |
578 return; | 579 return; |
579 } | 580 } |
580 | 581 |
581 ServiceWorkerMetrics::URLRequestJobResult result = | 582 ServiceWorkerMetrics::URLRequestJobResult result = |
582 ServiceWorkerMetrics::REQUEST_JOB_ERROR_BAD_DELEGATE; | 583 ServiceWorkerMetrics::REQUEST_JOB_ERROR_BAD_DELEGATE; |
583 if (!delegate_->RequestStillValid(&result)) { | 584 if (!delegate_->RequestStillValid(&result)) { |
584 RecordResult(result); | 585 RecordResult(result); |
585 DeliverErrorResponse(); | 586 DeliverErrorResponse(); |
586 return; | 587 return; |
587 } | 588 } |
588 | 589 |
589 if (status != SERVICE_WORKER_OK) { | 590 if (status != SERVICE_WORKER_OK) { |
590 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_FETCH_EVENT_DISPATCH); | 591 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_FETCH_EVENT_DISPATCH); |
591 if (is_main_resource_load_) { | 592 if (IsMainResourceLoad()) { |
592 // Using the service worker failed, so fallback to network. | 593 // Using the service worker failed, so fallback to network. |
593 delegate_->MainResourceLoadFailed(); | 594 delegate_->MainResourceLoadFailed(); |
594 response_type_ = FALLBACK_TO_NETWORK; | 595 response_type_ = FALLBACK_TO_NETWORK; |
595 NotifyRestartRequired(); | 596 NotifyRestartRequired(); |
596 } else { | 597 } else { |
597 DeliverErrorResponse(); | 598 DeliverErrorResponse(); |
598 } | 599 } |
599 return; | 600 return; |
600 } | 601 } |
601 | 602 |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
763 | 764 |
764 void ServiceWorkerURLRequestJob::RecordResult( | 765 void ServiceWorkerURLRequestJob::RecordResult( |
765 ServiceWorkerMetrics::URLRequestJobResult result) { | 766 ServiceWorkerMetrics::URLRequestJobResult result) { |
766 // It violates style guidelines to handle a NOTREACHED() failure but if there | 767 // It violates style guidelines to handle a NOTREACHED() failure but if there |
767 // is a bug don't let it corrupt UMA results by double-counting. | 768 // is a bug don't let it corrupt UMA results by double-counting. |
768 if (!ShouldRecordResult()) { | 769 if (!ShouldRecordResult()) { |
769 NOTREACHED(); | 770 NOTREACHED(); |
770 return; | 771 return; |
771 } | 772 } |
772 did_record_result_ = true; | 773 did_record_result_ = true; |
773 ServiceWorkerMetrics::RecordURLRequestJobResult(is_main_resource_load_, | 774 ServiceWorkerMetrics::RecordURLRequestJobResult(IsMainResourceLoad(), result); |
774 result); | |
775 if (request()) | 775 if (request()) |
776 request()->net_log().AddEvent(RequestJobResultToNetEventType(result)); | 776 request()->net_log().AddEvent(RequestJobResultToNetEventType(result)); |
777 } | 777 } |
778 | 778 |
779 void ServiceWorkerURLRequestJob::RecordStatusZeroResponseError( | 779 void ServiceWorkerURLRequestJob::RecordStatusZeroResponseError( |
780 blink::WebServiceWorkerResponseError error) { | 780 blink::WebServiceWorkerResponseError error) { |
781 // It violates style guidelines to handle a NOTREACHED() failure but if there | 781 // It violates style guidelines to handle a NOTREACHED() failure but if there |
782 // is a bug don't let it corrupt UMA results by double-counting. | 782 // is a bug don't let it corrupt UMA results by double-counting. |
783 if (!ShouldRecordResult()) { | 783 if (!ShouldRecordResult()) { |
784 NOTREACHED(); | 784 NOTREACHED(); |
785 return; | 785 return; |
786 } | 786 } |
787 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_RESPONSE_STATUS_ZERO); | 787 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_RESPONSE_STATUS_ZERO); |
788 ServiceWorkerMetrics::RecordStatusZeroResponseError(is_main_resource_load_, | 788 ServiceWorkerMetrics::RecordStatusZeroResponseError(IsMainResourceLoad(), |
789 error); | 789 error); |
790 } | 790 } |
791 | 791 |
792 void ServiceWorkerURLRequestJob::ClearStream() { | 792 void ServiceWorkerURLRequestJob::ClearStream() { |
793 if (streaming_version_) { | 793 if (streaming_version_) { |
794 streaming_version_->RemoveStreamingURLRequestJob(this); | 794 streaming_version_->RemoveStreamingURLRequestJob(this); |
795 streaming_version_ = nullptr; | 795 streaming_version_ = nullptr; |
796 } | 796 } |
797 if (stream_) { | 797 if (stream_) { |
798 stream_->RemoveReadObserver(this); | 798 stream_->RemoveReadObserver(this); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
833 base::TimeTicks() /* service_worker_start_time */, | 833 base::TimeTicks() /* service_worker_start_time */, |
834 base::TimeTicks() /* service_worker_ready_time */); | 834 base::TimeTicks() /* service_worker_ready_time */); |
835 return; | 835 return; |
836 } | 836 } |
837 delegate_->OnStartCompleted(true /* was_fetched_via_service_worker */, | 837 delegate_->OnStartCompleted(true /* was_fetched_via_service_worker */, |
838 fall_back_required_, response_url_, | 838 fall_back_required_, response_url_, |
839 service_worker_response_type_, worker_start_time_, | 839 service_worker_response_type_, worker_start_time_, |
840 worker_ready_time_); | 840 worker_ready_time_); |
841 } | 841 } |
842 | 842 |
| 843 bool ServiceWorkerURLRequestJob::IsMainResourceLoad() const { |
| 844 return ServiceWorkerUtils::IsMainResourceType(resource_type_); |
| 845 } |
| 846 |
843 } // namespace content | 847 } // namespace content |
OLD | NEW |