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 <limits> | 10 #include <limits> |
11 #include <map> | 11 #include <map> |
12 #include <memory> | 12 #include <memory> |
13 #include <string> | 13 #include <string> |
14 #include <utility> | 14 #include <utility> |
15 #include <vector> | 15 #include <vector> |
16 | 16 |
17 #include "base/bind.h" | 17 #include "base/bind.h" |
18 #include "base/guid.h" | 18 #include "base/guid.h" |
19 #include "base/location.h" | 19 #include "base/location.h" |
20 #include "base/single_thread_task_runner.h" | 20 #include "base/single_thread_task_runner.h" |
21 #include "base/strings/stringprintf.h" | 21 #include "base/strings/stringprintf.h" |
22 #include "base/threading/thread_task_runner_handle.h" | 22 #include "base/threading/thread_task_runner_handle.h" |
23 #include "base/time/time.h" | 23 #include "base/time/time.h" |
24 #include "content/browser/resource_context_impl.h" | 24 #include "content/browser/resource_context_impl.h" |
| 25 #include "content/browser/service_worker/embedded_worker_instance.h" |
25 #include "content/browser/service_worker/service_worker_fetch_dispatcher.h" | 26 #include "content/browser/service_worker/service_worker_fetch_dispatcher.h" |
26 #include "content/browser/service_worker/service_worker_provider_host.h" | 27 #include "content/browser/service_worker/service_worker_provider_host.h" |
27 #include "content/browser/service_worker/service_worker_response_info.h" | 28 #include "content/browser/service_worker/service_worker_response_info.h" |
28 #include "content/browser/streams/stream.h" | 29 #include "content/browser/streams/stream.h" |
29 #include "content/browser/streams/stream_context.h" | 30 #include "content/browser/streams/stream_context.h" |
30 #include "content/browser/streams/stream_registry.h" | 31 #include "content/browser/streams/stream_registry.h" |
31 #include "content/common/resource_request_body.h" | 32 #include "content/common/resource_request_body.h" |
32 #include "content/common/service_worker/service_worker_types.h" | 33 #include "content/common/service_worker/service_worker_types.h" |
33 #include "content/common/service_worker/service_worker_utils.h" | 34 #include "content/common/service_worker/service_worker_utils.h" |
34 #include "content/public/browser/blob_handle.h" | 35 #include "content/public/browser/blob_handle.h" |
(...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
625 NOTIMPLEMENTED(); | 626 NOTIMPLEMENTED(); |
626 } | 627 } |
627 } | 628 } |
628 | 629 |
629 request_body_blob_data_handle_ = | 630 request_body_blob_data_handle_ = |
630 blob_storage_context_->AddFinishedBlob(&blob_builder); | 631 blob_storage_context_->AddFinishedBlob(&blob_builder); |
631 *blob_uuid = uuid; | 632 *blob_uuid = uuid; |
632 *blob_size = total_size; | 633 *blob_size = total_size; |
633 } | 634 } |
634 | 635 |
635 void ServiceWorkerURLRequestJob::DidPrepareFetchEvent() { | 636 void ServiceWorkerURLRequestJob::DidPrepareFetchEvent( |
| 637 scoped_refptr<ServiceWorkerVersion> version) { |
636 worker_ready_time_ = base::TimeTicks::Now(); | 638 worker_ready_time_ = base::TimeTicks::Now(); |
637 load_timing_info_.send_start = worker_ready_time_; | 639 load_timing_info_.send_start = worker_ready_time_; |
| 640 |
| 641 // Record the time taken to find a Service Worker registration and wait for a |
| 642 // worker started to send a FetchEvent request for a main frame resource. The |
| 643 // measurement starts when the browser process recieves the request and ends |
| 644 // when it finds a running worker or it successfully starts a worker. We |
| 645 // don't record it in the following situations: |
| 646 // 1) The worker was not activated yet. This is intended to avoid including |
| 647 // the time for the activation. |
| 648 // 2) The worker was started for the fetch AND DevTools was attached during |
| 649 // startup. This is intended to avoid including the time for debugging. |
| 650 // 3) The request is for New Tab Page. |
| 651 if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME) |
| 652 return; |
| 653 if (worker_already_activated_) |
| 654 return; |
| 655 if (version->skip_recording_startup_time() && |
| 656 initial_worker_status_ != EmbeddedWorkerStatus::RUNNING) { |
| 657 return; |
| 658 } |
| 659 if (ServiceWorkerMetrics::ShouldExcludeURLFromHistogram(request()->url())) |
| 660 return; |
| 661 ServiceWorkerMetrics::RecordActivatedWorkerPreparationTimeForMainFrame( |
| 662 worker_ready_time_ - request()->creation_time(), initial_worker_status_, |
| 663 version->embedded_worker()->start_situation()); |
638 } | 664 } |
639 | 665 |
640 void ServiceWorkerURLRequestJob::DidDispatchFetchEvent( | 666 void ServiceWorkerURLRequestJob::DidDispatchFetchEvent( |
641 ServiceWorkerStatusCode status, | 667 ServiceWorkerStatusCode status, |
642 ServiceWorkerFetchEventResult fetch_result, | 668 ServiceWorkerFetchEventResult fetch_result, |
643 const ServiceWorkerResponse& response, | 669 const ServiceWorkerResponse& response, |
644 const scoped_refptr<ServiceWorkerVersion>& version) { | 670 const scoped_refptr<ServiceWorkerVersion>& version) { |
645 fetch_dispatcher_.reset(); | 671 fetch_dispatcher_.reset(); |
646 ServiceWorkerMetrics::RecordFetchEventStatus(IsMainResourceLoad(), status); | 672 ServiceWorkerMetrics::RecordFetchEventStatus(IsMainResourceLoad(), status); |
647 | 673 |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
955 ServiceWorkerMetrics::URLRequestJobResult result = | 981 ServiceWorkerMetrics::URLRequestJobResult result = |
956 ServiceWorkerMetrics::REQUEST_JOB_ERROR_BAD_DELEGATE; | 982 ServiceWorkerMetrics::REQUEST_JOB_ERROR_BAD_DELEGATE; |
957 ServiceWorkerVersion* active_worker = | 983 ServiceWorkerVersion* active_worker = |
958 delegate_->GetServiceWorkerVersion(&result); | 984 delegate_->GetServiceWorkerVersion(&result); |
959 if (!active_worker) { | 985 if (!active_worker) { |
960 RecordResult(result); | 986 RecordResult(result); |
961 DeliverErrorResponse(); | 987 DeliverErrorResponse(); |
962 return; | 988 return; |
963 } | 989 } |
964 | 990 |
| 991 worker_already_activated_ = |
| 992 active_worker->status() == ServiceWorkerVersion::ACTIVATED; |
| 993 initial_worker_status_ = active_worker->running_status(); |
| 994 |
965 DCHECK(!fetch_dispatcher_); | 995 DCHECK(!fetch_dispatcher_); |
966 fetch_dispatcher_.reset(new ServiceWorkerFetchDispatcher( | 996 fetch_dispatcher_.reset(new ServiceWorkerFetchDispatcher( |
967 CreateFetchRequest(), active_worker, resource_type_, | 997 CreateFetchRequest(), active_worker, resource_type_, |
968 base::Bind(&ServiceWorkerURLRequestJob::DidPrepareFetchEvent, | 998 base::Bind(&ServiceWorkerURLRequestJob::DidPrepareFetchEvent, |
969 weak_factory_.GetWeakPtr()), | 999 weak_factory_.GetWeakPtr(), active_worker), |
970 base::Bind(&ServiceWorkerURLRequestJob::DidDispatchFetchEvent, | 1000 base::Bind(&ServiceWorkerURLRequestJob::DidDispatchFetchEvent, |
971 weak_factory_.GetWeakPtr()))); | 1001 weak_factory_.GetWeakPtr()))); |
972 worker_start_time_ = base::TimeTicks::Now(); | 1002 worker_start_time_ = base::TimeTicks::Now(); |
973 fetch_dispatcher_->Run(); | 1003 fetch_dispatcher_->Run(); |
974 } | 1004 } |
975 | 1005 |
976 } // namespace content | 1006 } // namespace content |
OLD | NEW |