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

Unified Diff: content/browser/service_worker/service_worker_url_request_job.cc

Issue 2039743003: Introduce ServiceWorker.ActivatedWorkerPreparationForMainFrame.Time UMA. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/service_worker/service_worker_url_request_job.cc
diff --git a/content/browser/service_worker/service_worker_url_request_job.cc b/content/browser/service_worker/service_worker_url_request_job.cc
index e06e5935e242c6eada3978d177e1aeeb823458eb..f21084d605a1332290ab1a943bdbac09cbcaa463 100644
--- a/content/browser/service_worker/service_worker_url_request_job.cc
+++ b/content/browser/service_worker/service_worker_url_request_job.cc
@@ -22,6 +22,7 @@
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
#include "content/browser/resource_context_impl.h"
+#include "content/browser/service_worker/embedded_worker_instance.h"
#include "content/browser/service_worker/service_worker_fetch_dispatcher.h"
#include "content/browser/service_worker/service_worker_provider_host.h"
#include "content/browser/service_worker/service_worker_response_info.h"
@@ -632,9 +633,42 @@ void ServiceWorkerURLRequestJob::CreateRequestBodyBlob(std::string* blob_uuid,
*blob_size = total_size;
}
-void ServiceWorkerURLRequestJob::DidPrepareFetchEvent() {
+void ServiceWorkerURLRequestJob::DidPrepareFetchEvent(
+ scoped_refptr<ServiceWorkerVersion> version) {
worker_ready_time_ = base::TimeTicks::Now();
load_timing_info_.send_start = worker_ready_time_;
+
+ // Record the time taken for the browser to find and possibly start an active
+ // worker to which to dispatch a FetchEvent for a main frame resource request.
+ // For context, a FetchEvent can only be dispatched to an ACTIVATED worker
+ // that is running (it has been successfully started). The measurements starts
+ // when the browser process receives the request. The browser then finds the
+ // worker appropriate for this request (if there is none, this metric is not
+ // recorded). If that worker is already started, the browser process can send
+ // the request to it, so the measurement ends quickly. Otherwise the browser
+ // process has to start the worker and the measurement ends when the worker is
+ // successfully started.
+ // The metric is not recorded in the following situations:
+ // 1) The worker was in state INSTALLED or ACTIVATING, and the browser had to
+ // wait for it to become ACTIVATED. This is to avoid including the time to
+ // execute the activate event handlers in the worker's script.
+ // 2) The worker was started for the fetch AND DevTools was attached during
+ // startup. This is intended to avoid including the time for debugging.
+ // 3) The request is for New Tab Page. This is because it tends to dominate
+ // the stats and makes the results largely skewed.
+ if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME)
+ return;
+ if (!worker_already_activated_)
+ return;
+ if (version->skip_recording_startup_time() &&
+ initial_worker_status_ != EmbeddedWorkerStatus::RUNNING) {
+ return;
+ }
+ if (ServiceWorkerMetrics::ShouldExcludeURLFromHistogram(request()->url()))
+ return;
+ ServiceWorkerMetrics::RecordActivatedWorkerPreparationTimeForMainFrame(
+ worker_ready_time_ - request()->creation_time(), initial_worker_status_,
+ version->embedded_worker()->start_situation());
}
void ServiceWorkerURLRequestJob::DidDispatchFetchEvent(
@@ -962,11 +996,15 @@ void ServiceWorkerURLRequestJob::RequestBodyBlobsCompleted(bool success) {
return;
}
+ worker_already_activated_ =
+ active_worker->status() == ServiceWorkerVersion::ACTIVATED;
+ initial_worker_status_ = active_worker->running_status();
+
DCHECK(!fetch_dispatcher_);
fetch_dispatcher_.reset(new ServiceWorkerFetchDispatcher(
CreateFetchRequest(), active_worker, resource_type_,
base::Bind(&ServiceWorkerURLRequestJob::DidPrepareFetchEvent,
- weak_factory_.GetWeakPtr()),
+ weak_factory_.GetWeakPtr(), active_worker),
base::Bind(&ServiceWorkerURLRequestJob::DidDispatchFetchEvent,
weak_factory_.GetWeakPtr())));
worker_start_time_ = base::TimeTicks::Now();

Powered by Google App Engine
This is Rietveld 408576698