| 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..e36856be44e8ab4eb766643f2db3b35d95700688 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) {
|
| + net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_DISPATCH_FETCH_EVENT,
|
| + net::NetLog::StringCallback(
|
| + "event_type", ServiceWorkerMetrics::EventTypeToString(
|
| + GetEventType())));
|
| +}
|
|
|
| -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()
|
|
|