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

Side by Side Diff: content/browser/service_worker/service_worker_url_request_job.cc

Issue 1795863006: service worker: Attribute purpose to start worker attempts for UMA (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: patch for landing? Created 4 years, 9 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/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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698