| Index: content/browser/service_worker/service_worker_version.cc
|
| diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
|
| index 470bc86f5ee2b94066316433b3d34c1670103fe0..f292102e6912f583656c0308ae393ac52e796ec2 100644
|
| --- a/content/browser/service_worker/service_worker_version.cc
|
| +++ b/content/browser/service_worker/service_worker_version.cc
|
| @@ -202,7 +202,8 @@ const int ServiceWorkerVersion::kStopWorkerTimeoutSeconds = 5;
|
| class ServiceWorkerVersion::Metrics {
|
| public:
|
| using EventType = ServiceWorkerMetrics::EventType;
|
| - explicit Metrics(ServiceWorkerVersion* owner) : owner_(owner) {}
|
| + explicit Metrics(ServiceWorkerVersion* owner, EventType start_worker_purpose)
|
| + : owner_(owner), start_worker_purpose_(start_worker_purpose) {}
|
| ~Metrics() {
|
| if (owner_->should_exclude_from_uma_)
|
| return;
|
| @@ -210,6 +211,10 @@ class ServiceWorkerVersion::Metrics {
|
| ServiceWorkerMetrics::RecordEventHandledRatio(
|
| ev.first, ev.second.handled_events, ev.second.fired_events);
|
| }
|
| + if (ServiceWorkerMetrics::IsNavigationHintEvent(start_worker_purpose_)) {
|
| + ServiceWorkerMetrics::RecordNavigationHintPrecision(
|
| + start_worker_purpose_, !event_stats_.empty());
|
| + }
|
| }
|
|
|
| void RecordEventHandledStatus(EventType event, bool handled) {
|
| @@ -226,6 +231,7 @@ class ServiceWorkerVersion::Metrics {
|
|
|
| ServiceWorkerVersion* owner_;
|
| std::map<EventType, EventStat> event_stats_;
|
| + const EventType start_worker_purpose_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(Metrics);
|
| };
|
| @@ -755,7 +761,7 @@ void ServiceWorkerVersion::OnStarted() {
|
|
|
| // Fire all start callbacks.
|
| scoped_refptr<ServiceWorkerVersion> protect(this);
|
| - RunCallbacks(this, &start_callbacks_, SERVICE_WORKER_OK);
|
| + RunStartCallbacks(SERVICE_WORKER_OK);
|
| FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this));
|
| }
|
|
|
| @@ -866,8 +872,7 @@ void ServiceWorkerVersion::OnStartSentAndScriptEvaluated(
|
| ServiceWorkerStatusCode status) {
|
| if (status != SERVICE_WORKER_OK) {
|
| scoped_refptr<ServiceWorkerVersion> protect(this);
|
| - RunCallbacks(this, &start_callbacks_,
|
| - DeduceStartWorkerFailureReason(status));
|
| + RunStartCallbacks(DeduceStartWorkerFailureReason(status));
|
| }
|
| }
|
|
|
| @@ -1301,6 +1306,9 @@ void ServiceWorkerVersion::DidEnsureLiveRegistrationForStartWorker(
|
| "ServiceWorker", "ServiceWorkerVersion::StartWorker", trace_id,
|
| "Script", script_url_.spec(), "Purpose",
|
| ServiceWorkerMetrics::EventTypeToString(purpose));
|
| + DCHECK(!start_worker_first_purpose_);
|
| + start_worker_first_purpose_.reset(
|
| + new ServiceWorkerMetrics::EventType(purpose));
|
| start_callbacks_.push_back(
|
| base::Bind(&ServiceWorkerVersion::RecordStartWorkerResult,
|
| weak_factory_.GetWeakPtr(), purpose, prestart_status,
|
| @@ -1322,7 +1330,8 @@ void ServiceWorkerVersion::StartWorkerInternal() {
|
| DCHECK_EQ(STOPPED, running_status());
|
|
|
| DCHECK(!metrics_);
|
| - metrics_.reset(new Metrics(this));
|
| + DCHECK(start_worker_first_purpose_);
|
| + metrics_.reset(new Metrics(this, *start_worker_first_purpose_));
|
|
|
| StartTimeoutTimer();
|
|
|
| @@ -1435,7 +1444,7 @@ void ServiceWorkerVersion::OnTimeoutTimer() {
|
| DCHECK(running_status() == STARTING || running_status() == STOPPING)
|
| << running_status();
|
| scoped_refptr<ServiceWorkerVersion> protect(this);
|
| - RunCallbacks(this, &start_callbacks_, SERVICE_WORKER_ERROR_TIMEOUT);
|
| + RunStartCallbacks(SERVICE_WORKER_ERROR_TIMEOUT);
|
| if (running_status() == STARTING)
|
| embedded_worker_->Stop();
|
| return;
|
| @@ -1664,9 +1673,8 @@ void ServiceWorkerVersion::OnStoppedInternal(
|
|
|
| if (!should_restart) {
|
| // Let all start callbacks fail.
|
| - RunCallbacks(this, &start_callbacks_,
|
| - DeduceStartWorkerFailureReason(
|
| - SERVICE_WORKER_ERROR_START_WORKER_FAILED));
|
| + RunStartCallbacks(DeduceStartWorkerFailureReason(
|
| + SERVICE_WORKER_ERROR_START_WORKER_FAILED));
|
| }
|
|
|
| // Let all message callbacks fail (this will also fire and clear all
|
| @@ -1710,4 +1718,9 @@ void ServiceWorkerVersion::OnBeginEvent() {
|
| idle_time_);
|
| }
|
|
|
| +void ServiceWorkerVersion::RunStartCallbacks(ServiceWorkerStatusCode status) {
|
| + start_worker_first_purpose_.reset();
|
| + RunCallbacks(this, &start_callbacks_, status);
|
| +}
|
| +
|
| } // namespace content
|
|
|