| Index: content/browser/service_worker/service_worker_metrics.cc
 | 
| diff --git a/content/browser/service_worker/service_worker_metrics.cc b/content/browser/service_worker/service_worker_metrics.cc
 | 
| index 5095b53b9877f5d8cb2e2fb7e6f63995efc3db61..eaf8071ffa4f87e00f6e4352b14509e80400d36f 100644
 | 
| --- a/content/browser/service_worker/service_worker_metrics.cc
 | 
| +++ b/content/browser/service_worker/service_worker_metrics.cc
 | 
| @@ -10,6 +10,7 @@
 | 
|  #include "base/metrics/histogram_macros.h"
 | 
|  #include "base/metrics/sparse_histogram.h"
 | 
|  #include "base/strings/string_util.h"
 | 
| +#include "content/browser/service_worker/embedded_worker_status.h"
 | 
|  #include "content/common/service_worker/service_worker_types.h"
 | 
|  #include "content/public/browser/browser_thread.h"
 | 
|  #include "content/public/browser/content_browser_client.h"
 | 
| @@ -72,6 +73,33 @@ std::string EventTypeToSuffix(ServiceWorkerMetrics::EventType event_type) {
 | 
|    return "_UNKNOWN";
 | 
|  }
 | 
|  
 | 
| +std::string GetWorkerPreparationSuffix(
 | 
| +    EmbeddedWorkerStatus initial_worker_status,
 | 
| +    ServiceWorkerMetrics::StartSituation start_situation) {
 | 
| +  switch (initial_worker_status) {
 | 
| +    case EmbeddedWorkerStatus::STOPPED: {
 | 
| +      switch (start_situation) {
 | 
| +        case ServiceWorkerMetrics::StartSituation::DURING_STARTUP:
 | 
| +          return "_StartWorkerDuringStartup";
 | 
| +        case ServiceWorkerMetrics::StartSituation::NEW_PROCESS:
 | 
| +          return "_StartWorkerNewProcess";
 | 
| +        case ServiceWorkerMetrics::StartSituation::EXISTING_PROCESS:
 | 
| +          return "_StartWorkerExistingProcess";
 | 
| +        default:
 | 
| +          NOTREACHED() << static_cast<int>(start_situation);
 | 
| +      }
 | 
| +    }
 | 
| +    case EmbeddedWorkerStatus::STARTING:
 | 
| +      return "_StartingWorker";
 | 
| +    case EmbeddedWorkerStatus::RUNNING:
 | 
| +      return "_RunningWorker";
 | 
| +    case EmbeddedWorkerStatus::STOPPING:
 | 
| +      return "_StoppingWorker";
 | 
| +  }
 | 
| +  NOTREACHED();
 | 
| +  return "_UNKNOWN";
 | 
| +}
 | 
| +
 | 
|  // Use this for histograms with dynamically generated names, which
 | 
|  // otherwise can't use the UMA_HISTOGRAM macro without code duplication.
 | 
|  void RecordSuffixedTimeHistogram(const std::string& name,
 | 
| @@ -288,6 +316,18 @@ void ServiceWorkerMetrics::RecordStartWorkerTime(base::TimeDelta time,
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +void ServiceWorkerMetrics::RecordActivatedWorkerPreparationTimeForMainFrame(
 | 
| +    base::TimeDelta time,
 | 
| +    EmbeddedWorkerStatus initial_worker_status,
 | 
| +    StartSituation start_situation) {
 | 
| +  std::string name =
 | 
| +      "ServiceWorker.ActivatedWorkerPreparationForMainFrame.Time";
 | 
| +  UMA_HISTOGRAM_MEDIUM_TIMES(name, time);
 | 
| +  RecordSuffixedTimeHistogram(
 | 
| +      name, GetWorkerPreparationSuffix(initial_worker_status, start_situation),
 | 
| +      time);
 | 
| +}
 | 
| +
 | 
|  void ServiceWorkerMetrics::RecordWorkerStopped(StopStatus status) {
 | 
|    UMA_HISTOGRAM_ENUMERATION("ServiceWorker.WorkerStopped",
 | 
|                              static_cast<int>(status),
 | 
| 
 |