Chromium Code Reviews| Index: content/browser/service_worker/service_worker_fetch_dispatcher.cc |
| diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
| index 6f0d3844aedf96931ce0ef8377ef0934cb19e892..4ed6440ffd4b10921d88e92a82b1677d49a89589 100644 |
| --- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
| +++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
| @@ -4,6 +4,7 @@ |
| #include "content/browser/service_worker/service_worker_fetch_dispatcher.h" |
| +#include <string> |
| #include <utility> |
| #include "base/bind.h" |
| @@ -15,6 +16,7 @@ |
| namespace content { |
| namespace { |
| + |
| using EventType = ServiceWorkerMetrics::EventType; |
| EventType ResourceTypeToEventType(ResourceType resource_type) { |
| switch (resource_type) { |
| @@ -32,22 +34,60 @@ EventType ResourceTypeToEventType(ResourceType resource_type) { |
| return EventType::FETCH_SUB_RESOURCE; |
| } |
| } |
| + |
| +std::unique_ptr<base::Value> NetLogServiceWorkerStatusCallback( |
| + ServiceWorkerStatusCode status, |
| + net::NetLogCaptureMode) { |
| + std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue); |
| + dict->SetString("status", ServiceWorkerStatusToString(status)); |
| + return std::move(dict); |
| +} |
| + |
| +std::unique_ptr<base::Value> NetLogFetchEventCallback( |
| + ServiceWorkerStatusCode status, |
| + ServiceWorkerFetchEventResult result, |
| + net::NetLogCaptureMode) { |
| + std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue); |
| + dict->SetString("status", ServiceWorkerStatusToString(status)); |
| + dict->SetBoolean("has_response", |
| + result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE); |
| + return std::move(dict); |
| +} |
| + |
| +void EndNetLogEventWithServiceWorkerStatus(const net::BoundNetLog& net_log, |
| + net::NetLog::EventType type, |
| + ServiceWorkerStatusCode status) { |
| + net_log.EndEvent(type, |
| + base::Bind(&NetLogServiceWorkerStatusCallback, status)); |
| +} |
| + |
| } // namespace |
| ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher( |
| std::unique_ptr<ServiceWorkerFetchRequest> request, |
| ServiceWorkerVersion* version, |
| ResourceType resource_type, |
| + const net::BoundNetLog& net_log, |
| const base::Closure& prepare_callback, |
| const FetchCallback& fetch_callback) |
| : version_(version), |
| + net_log_(net_log), |
| prepare_callback_(prepare_callback), |
| fetch_callback_(fetch_callback), |
| request_(std::move(request)), |
| resource_type_(resource_type), |
| - weak_factory_(this) {} |
| + did_complete_(false), |
| + weak_factory_(this) { |
| + std::string event_type = |
|
horo
2016/06/25 05:49:56
nit:
const char*
or directly call in net::NetLog::
falken
2016/06/27 01:19:17
Done.
|
| + ServiceWorkerMetrics::EventTypeToString(GetEventType()); |
| + net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_DISPATCH_FETCH_EVENT, |
| + net::NetLog::StringCallback("event_type", &event_type)); |
| +} |
| -ServiceWorkerFetchDispatcher::~ServiceWorkerFetchDispatcher() {} |
| +ServiceWorkerFetchDispatcher::~ServiceWorkerFetchDispatcher() { |
| + if (!did_complete_) |
| + net_log_.EndEvent(net::NetLog::TYPE_SERVICE_WORKER_DISPATCH_FETCH_EVENT); |
| +} |
| void ServiceWorkerFetchDispatcher::Run() { |
| DCHECK(version_->status() == ServiceWorkerVersion::ACTIVATING || |
| @@ -55,14 +95,20 @@ void ServiceWorkerFetchDispatcher::Run() { |
| << version_->status(); |
| if (version_->status() == ServiceWorkerVersion::ACTIVATING) { |
| + net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_WAIT_FOR_ACTIVATION); |
| version_->RegisterStatusChangeCallback( |
| - base::Bind(&ServiceWorkerFetchDispatcher::StartWorker, |
| + base::Bind(&ServiceWorkerFetchDispatcher::DidWaitForActivation, |
| weak_factory_.GetWeakPtr())); |
| return; |
| } |
| StartWorker(); |
| } |
| +void ServiceWorkerFetchDispatcher::DidWaitForActivation() { |
| + net_log_.EndEvent(net::NetLog::TYPE_SERVICE_WORKER_WAIT_FOR_ACTIVATION); |
| + StartWorker(); |
| +} |
| + |
| void ServiceWorkerFetchDispatcher::StartWorker() { |
| // We might be REDUNDANT if a new worker started activating and kicked us out |
| // before we could finish activation. |
| @@ -71,14 +117,32 @@ void ServiceWorkerFetchDispatcher::StartWorker() { |
| DidFail(SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED); |
| return; |
| } |
| + |
| + if (version_->running_status() == EmbeddedWorkerStatus::RUNNING) { |
| + DispatchFetchEvent(); |
| + return; |
| + } |
| + |
| + net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_START_WORKER); |
| version_->RunAfterStartWorker( |
| - GetEventType(), |
| - base::Bind(&ServiceWorkerFetchDispatcher::DispatchFetchEvent, |
| - weak_factory_.GetWeakPtr()), |
| - base::Bind(&ServiceWorkerFetchDispatcher::DidFail, |
| + GetEventType(), base::Bind(&ServiceWorkerFetchDispatcher::DidStartWorker, |
| + weak_factory_.GetWeakPtr()), |
| + base::Bind(&ServiceWorkerFetchDispatcher::DidFailToStartWorker, |
| weak_factory_.GetWeakPtr())); |
| } |
| +void ServiceWorkerFetchDispatcher::DidStartWorker() { |
| + net_log_.EndEvent(net::NetLog::TYPE_SERVICE_WORKER_START_WORKER); |
| + DispatchFetchEvent(); |
| +} |
| + |
| +void ServiceWorkerFetchDispatcher::DidFailToStartWorker( |
| + ServiceWorkerStatusCode status) { |
| + EndNetLogEventWithServiceWorkerStatus( |
| + net_log_, net::NetLog::TYPE_SERVICE_WORKER_START_WORKER, status); |
| + DidFail(status); |
| +} |
| + |
| void ServiceWorkerFetchDispatcher::DispatchFetchEvent() { |
| DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()) |
| << "Worker stopped too soon after it was started."; |
| @@ -87,42 +151,58 @@ void ServiceWorkerFetchDispatcher::DispatchFetchEvent() { |
| base::Closure prepare_callback = prepare_callback_; |
| prepare_callback.Run(); |
| + net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT); |
| int request_id = version_->StartRequest( |
| - GetEventType(), base::Bind(&ServiceWorkerFetchDispatcher::DidFail, |
| - weak_factory_.GetWeakPtr())); |
| + GetEventType(), |
| + base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch, |
| + weak_factory_.GetWeakPtr())); |
| version_->DispatchEvent<ServiceWorkerHostMsg_FetchEventFinished>( |
| request_id, ServiceWorkerMsg_FetchEvent(request_id, *request_.get()), |
| base::Bind(&ServiceWorkerFetchDispatcher::DidFinish, |
| weak_factory_.GetWeakPtr())); |
| } |
| -void ServiceWorkerFetchDispatcher::DidPrepare() { |
| - DCHECK(!prepare_callback_.is_null()); |
| - base::Closure prepare_callback = prepare_callback_; |
| - prepare_callback.Run(); |
| +void ServiceWorkerFetchDispatcher::DidFailToDispatch( |
| + ServiceWorkerStatusCode status) { |
| + EndNetLogEventWithServiceWorkerStatus( |
| + net_log_, net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT, status); |
| + DidFail(status); |
| } |
| void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { |
| - DCHECK(!fetch_callback_.is_null()); |
| - FetchCallback fetch_callback = fetch_callback_; |
| - scoped_refptr<ServiceWorkerVersion> version = version_; |
| - fetch_callback.Run(status, SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, |
| - ServiceWorkerResponse(), version); |
| + DCHECK_NE(SERVICE_WORKER_OK, status); |
| + Complete(status, SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, |
| + ServiceWorkerResponse()); |
| } |
| void ServiceWorkerFetchDispatcher::DidFinish( |
| int request_id, |
| ServiceWorkerFetchEventResult fetch_result, |
| const ServiceWorkerResponse& response) { |
| + net_log_.EndEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT); |
| + |
| const bool handled = |
| (fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE); |
| if (!version_->FinishRequest(request_id, handled)) |
| NOTREACHED() << "Should only receive one reply per event"; |
| + Complete(SERVICE_WORKER_OK, fetch_result, response); |
| +} |
| + |
| +void ServiceWorkerFetchDispatcher::Complete( |
| + ServiceWorkerStatusCode status, |
| + ServiceWorkerFetchEventResult fetch_result, |
| + const ServiceWorkerResponse& response) { |
| DCHECK(!fetch_callback_.is_null()); |
| + |
| + did_complete_ = true; |
| + net_log_.EndEvent( |
| + net::NetLog::TYPE_SERVICE_WORKER_DISPATCH_FETCH_EVENT, |
| + base::Bind(&NetLogFetchEventCallback, status, fetch_result)); |
| + |
| FetchCallback fetch_callback = fetch_callback_; |
| scoped_refptr<ServiceWorkerVersion> version = version_; |
| - fetch_callback.Run(SERVICE_WORKER_OK, fetch_result, response, version); |
| + fetch_callback.Run(status, fetch_result, response, version); |
| } |
| ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() |