| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/service_worker/service_worker_fetch_dispatcher.h" | 5 #include "content/browser/service_worker/service_worker_fetch_dispatcher.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/time/time.h" | 11 #include "base/time/time.h" |
| 12 #include "base/trace_event/trace_event.h" | 12 #include "base/trace_event/trace_event.h" |
| 13 #include "content/browser/service_worker/embedded_worker_status.h" | 13 #include "content/browser/service_worker/embedded_worker_status.h" |
| 14 #include "content/browser/service_worker/service_worker_version.h" | 14 #include "content/browser/service_worker/service_worker_version.h" |
| 15 #include "content/common/service_worker/service_worker_messages.h" | 15 #include "content/common/service_worker/service_worker_messages.h" |
| 16 #include "content/common/service_worker/service_worker_utils.h" | 16 #include "content/common/service_worker/service_worker_utils.h" |
| 17 #include "net/log/net_log_event_type.h" |
| 17 | 18 |
| 18 namespace content { | 19 namespace content { |
| 19 | 20 |
| 20 namespace { | 21 namespace { |
| 21 | 22 |
| 22 using EventType = ServiceWorkerMetrics::EventType; | 23 using EventType = ServiceWorkerMetrics::EventType; |
| 23 EventType ResourceTypeToEventType(ResourceType resource_type) { | 24 EventType ResourceTypeToEventType(ResourceType resource_type) { |
| 24 switch (resource_type) { | 25 switch (resource_type) { |
| 25 case RESOURCE_TYPE_MAIN_FRAME: | 26 case RESOURCE_TYPE_MAIN_FRAME: |
| 26 return EventType::FETCH_MAIN_FRAME; | 27 return EventType::FETCH_MAIN_FRAME; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 50 ServiceWorkerFetchEventResult result, | 51 ServiceWorkerFetchEventResult result, |
| 51 net::NetLogCaptureMode) { | 52 net::NetLogCaptureMode) { |
| 52 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue); | 53 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue); |
| 53 dict->SetString("status", ServiceWorkerStatusToString(status)); | 54 dict->SetString("status", ServiceWorkerStatusToString(status)); |
| 54 dict->SetBoolean("has_response", | 55 dict->SetBoolean("has_response", |
| 55 result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE); | 56 result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE); |
| 56 return std::move(dict); | 57 return std::move(dict); |
| 57 } | 58 } |
| 58 | 59 |
| 59 void EndNetLogEventWithServiceWorkerStatus(const net::BoundNetLog& net_log, | 60 void EndNetLogEventWithServiceWorkerStatus(const net::BoundNetLog& net_log, |
| 60 net::NetLog::EventType type, | 61 net::NetLogEventType type, |
| 61 ServiceWorkerStatusCode status) { | 62 ServiceWorkerStatusCode status) { |
| 62 net_log.EndEvent(type, | 63 net_log.EndEvent(type, |
| 63 base::Bind(&NetLogServiceWorkerStatusCallback, status)); | 64 base::Bind(&NetLogServiceWorkerStatusCallback, status)); |
| 64 } | 65 } |
| 65 | 66 |
| 66 ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType( | 67 ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType( |
| 67 ServiceWorkerFetchType type) { | 68 ServiceWorkerFetchType type) { |
| 68 if (type == ServiceWorkerFetchType::FOREIGN_FETCH) | 69 if (type == ServiceWorkerFetchType::FOREIGN_FETCH) |
| 69 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL; | 70 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL; |
| 70 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL; | 71 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 const base::Closure& prepare_callback, | 111 const base::Closure& prepare_callback, |
| 111 const FetchCallback& fetch_callback) | 112 const FetchCallback& fetch_callback) |
| 112 : version_(version), | 113 : version_(version), |
| 113 net_log_(net_log), | 114 net_log_(net_log), |
| 114 prepare_callback_(prepare_callback), | 115 prepare_callback_(prepare_callback), |
| 115 fetch_callback_(fetch_callback), | 116 fetch_callback_(fetch_callback), |
| 116 request_(std::move(request)), | 117 request_(std::move(request)), |
| 117 resource_type_(resource_type), | 118 resource_type_(resource_type), |
| 118 did_complete_(false), | 119 did_complete_(false), |
| 119 weak_factory_(this) { | 120 weak_factory_(this) { |
| 120 net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_DISPATCH_FETCH_EVENT, | 121 net_log_.BeginEvent(net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT, |
| 121 net::NetLog::StringCallback( | 122 net::NetLog::StringCallback( |
| 122 "event_type", ServiceWorkerMetrics::EventTypeToString( | 123 "event_type", ServiceWorkerMetrics::EventTypeToString( |
| 123 GetEventType()))); | 124 GetEventType()))); |
| 124 } | 125 } |
| 125 | 126 |
| 126 ServiceWorkerFetchDispatcher::~ServiceWorkerFetchDispatcher() { | 127 ServiceWorkerFetchDispatcher::~ServiceWorkerFetchDispatcher() { |
| 127 if (!did_complete_) | 128 if (!did_complete_) |
| 128 net_log_.EndEvent(net::NetLog::TYPE_SERVICE_WORKER_DISPATCH_FETCH_EVENT); | 129 net_log_.EndEvent( |
| 130 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT); |
| 129 } | 131 } |
| 130 | 132 |
| 131 void ServiceWorkerFetchDispatcher::Run() { | 133 void ServiceWorkerFetchDispatcher::Run() { |
| 132 DCHECK(version_->status() == ServiceWorkerVersion::ACTIVATING || | 134 DCHECK(version_->status() == ServiceWorkerVersion::ACTIVATING || |
| 133 version_->status() == ServiceWorkerVersion::ACTIVATED) | 135 version_->status() == ServiceWorkerVersion::ACTIVATED) |
| 134 << version_->status(); | 136 << version_->status(); |
| 135 | 137 |
| 136 if (version_->status() == ServiceWorkerVersion::ACTIVATING) { | 138 if (version_->status() == ServiceWorkerVersion::ACTIVATING) { |
| 137 net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_WAIT_FOR_ACTIVATION); | 139 net_log_.BeginEvent( |
| 140 net::NetLogEventType::SERVICE_WORKER_WAIT_FOR_ACTIVATION); |
| 138 version_->RegisterStatusChangeCallback( | 141 version_->RegisterStatusChangeCallback( |
| 139 base::Bind(&ServiceWorkerFetchDispatcher::DidWaitForActivation, | 142 base::Bind(&ServiceWorkerFetchDispatcher::DidWaitForActivation, |
| 140 weak_factory_.GetWeakPtr())); | 143 weak_factory_.GetWeakPtr())); |
| 141 return; | 144 return; |
| 142 } | 145 } |
| 143 StartWorker(); | 146 StartWorker(); |
| 144 } | 147 } |
| 145 | 148 |
| 146 void ServiceWorkerFetchDispatcher::DidWaitForActivation() { | 149 void ServiceWorkerFetchDispatcher::DidWaitForActivation() { |
| 147 net_log_.EndEvent(net::NetLog::TYPE_SERVICE_WORKER_WAIT_FOR_ACTIVATION); | 150 net_log_.EndEvent(net::NetLogEventType::SERVICE_WORKER_WAIT_FOR_ACTIVATION); |
| 148 StartWorker(); | 151 StartWorker(); |
| 149 } | 152 } |
| 150 | 153 |
| 151 void ServiceWorkerFetchDispatcher::StartWorker() { | 154 void ServiceWorkerFetchDispatcher::StartWorker() { |
| 152 // We might be REDUNDANT if a new worker started activating and kicked us out | 155 // We might be REDUNDANT if a new worker started activating and kicked us out |
| 153 // before we could finish activation. | 156 // before we could finish activation. |
| 154 if (version_->status() != ServiceWorkerVersion::ACTIVATED) { | 157 if (version_->status() != ServiceWorkerVersion::ACTIVATED) { |
| 155 DCHECK_EQ(ServiceWorkerVersion::REDUNDANT, version_->status()); | 158 DCHECK_EQ(ServiceWorkerVersion::REDUNDANT, version_->status()); |
| 156 DidFail(SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED); | 159 DidFail(SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED); |
| 157 return; | 160 return; |
| 158 } | 161 } |
| 159 | 162 |
| 160 if (version_->running_status() == EmbeddedWorkerStatus::RUNNING) { | 163 if (version_->running_status() == EmbeddedWorkerStatus::RUNNING) { |
| 161 DispatchFetchEvent(); | 164 DispatchFetchEvent(); |
| 162 return; | 165 return; |
| 163 } | 166 } |
| 164 | 167 |
| 165 net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_START_WORKER); | 168 net_log_.BeginEvent(net::NetLogEventType::SERVICE_WORKER_START_WORKER); |
| 166 version_->RunAfterStartWorker( | 169 version_->RunAfterStartWorker( |
| 167 GetEventType(), base::Bind(&ServiceWorkerFetchDispatcher::DidStartWorker, | 170 GetEventType(), base::Bind(&ServiceWorkerFetchDispatcher::DidStartWorker, |
| 168 weak_factory_.GetWeakPtr()), | 171 weak_factory_.GetWeakPtr()), |
| 169 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToStartWorker, | 172 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToStartWorker, |
| 170 weak_factory_.GetWeakPtr())); | 173 weak_factory_.GetWeakPtr())); |
| 171 } | 174 } |
| 172 | 175 |
| 173 void ServiceWorkerFetchDispatcher::DidStartWorker() { | 176 void ServiceWorkerFetchDispatcher::DidStartWorker() { |
| 174 net_log_.EndEvent(net::NetLog::TYPE_SERVICE_WORKER_START_WORKER); | 177 net_log_.EndEvent(net::NetLogEventType::SERVICE_WORKER_START_WORKER); |
| 175 DispatchFetchEvent(); | 178 DispatchFetchEvent(); |
| 176 } | 179 } |
| 177 | 180 |
| 178 void ServiceWorkerFetchDispatcher::DidFailToStartWorker( | 181 void ServiceWorkerFetchDispatcher::DidFailToStartWorker( |
| 179 ServiceWorkerStatusCode status) { | 182 ServiceWorkerStatusCode status) { |
| 180 EndNetLogEventWithServiceWorkerStatus( | 183 EndNetLogEventWithServiceWorkerStatus( |
| 181 net_log_, net::NetLog::TYPE_SERVICE_WORKER_START_WORKER, status); | 184 net_log_, net::NetLogEventType::SERVICE_WORKER_START_WORKER, status); |
| 182 DidFail(status); | 185 DidFail(status); |
| 183 } | 186 } |
| 184 | 187 |
| 185 void ServiceWorkerFetchDispatcher::DispatchFetchEvent() { | 188 void ServiceWorkerFetchDispatcher::DispatchFetchEvent() { |
| 186 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()) | 189 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()) |
| 187 << "Worker stopped too soon after it was started."; | 190 << "Worker stopped too soon after it was started."; |
| 188 | 191 |
| 189 DCHECK(!prepare_callback_.is_null()); | 192 DCHECK(!prepare_callback_.is_null()); |
| 190 base::Closure prepare_callback = prepare_callback_; | 193 base::Closure prepare_callback = prepare_callback_; |
| 191 prepare_callback.Run(); | 194 prepare_callback.Run(); |
| 192 | 195 |
| 193 net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT); | 196 net_log_.BeginEvent(net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT); |
| 194 int response_id = version_->StartRequest( | 197 int response_id = version_->StartRequest( |
| 195 GetEventType(), | 198 GetEventType(), |
| 196 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch, | 199 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch, |
| 197 weak_factory_.GetWeakPtr())); | 200 weak_factory_.GetWeakPtr())); |
| 198 int event_finish_id = version_->StartRequest( | 201 int event_finish_id = version_->StartRequest( |
| 199 FetchTypeToWaitUntilEventType(request_->fetch_type), | 202 FetchTypeToWaitUntilEventType(request_->fetch_type), |
| 200 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 203 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| 201 | 204 |
| 202 ResponseCallback* response_callback = | 205 ResponseCallback* response_callback = |
| 203 new ResponseCallback(weak_factory_.GetWeakPtr(), version_.get()); | 206 new ResponseCallback(weak_factory_.GetWeakPtr(), version_.get()); |
| 204 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>( | 207 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>( |
| 205 response_id, | 208 response_id, |
| 206 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run, | 209 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run, |
| 207 base::Owned(response_callback))); | 210 base::Owned(response_callback))); |
| 208 version_->RegisterSimpleRequest<ServiceWorkerHostMsg_FetchEventFinished>( | 211 version_->RegisterSimpleRequest<ServiceWorkerHostMsg_FetchEventFinished>( |
| 209 event_finish_id); | 212 event_finish_id); |
| 210 version_->DispatchEvent({response_id, event_finish_id}, | 213 version_->DispatchEvent({response_id, event_finish_id}, |
| 211 ServiceWorkerMsg_FetchEvent( | 214 ServiceWorkerMsg_FetchEvent( |
| 212 response_id, event_finish_id, *request_.get())); | 215 response_id, event_finish_id, *request_.get())); |
| 213 } | 216 } |
| 214 | 217 |
| 215 void ServiceWorkerFetchDispatcher::DidFailToDispatch( | 218 void ServiceWorkerFetchDispatcher::DidFailToDispatch( |
| 216 ServiceWorkerStatusCode status) { | 219 ServiceWorkerStatusCode status) { |
| 217 EndNetLogEventWithServiceWorkerStatus( | 220 EndNetLogEventWithServiceWorkerStatus( |
| 218 net_log_, net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT, status); | 221 net_log_, net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT, status); |
| 219 DidFail(status); | 222 DidFail(status); |
| 220 } | 223 } |
| 221 | 224 |
| 222 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { | 225 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { |
| 223 DCHECK_NE(SERVICE_WORKER_OK, status); | 226 DCHECK_NE(SERVICE_WORKER_OK, status); |
| 224 Complete(status, SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, | 227 Complete(status, SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, |
| 225 ServiceWorkerResponse()); | 228 ServiceWorkerResponse()); |
| 226 } | 229 } |
| 227 | 230 |
| 228 void ServiceWorkerFetchDispatcher::DidFinish( | 231 void ServiceWorkerFetchDispatcher::DidFinish( |
| 229 int request_id, | 232 int request_id, |
| 230 ServiceWorkerFetchEventResult fetch_result, | 233 ServiceWorkerFetchEventResult fetch_result, |
| 231 const ServiceWorkerResponse& response) { | 234 const ServiceWorkerResponse& response) { |
| 232 net_log_.EndEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT); | 235 net_log_.EndEvent(net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT); |
| 233 Complete(SERVICE_WORKER_OK, fetch_result, response); | 236 Complete(SERVICE_WORKER_OK, fetch_result, response); |
| 234 } | 237 } |
| 235 | 238 |
| 236 void ServiceWorkerFetchDispatcher::Complete( | 239 void ServiceWorkerFetchDispatcher::Complete( |
| 237 ServiceWorkerStatusCode status, | 240 ServiceWorkerStatusCode status, |
| 238 ServiceWorkerFetchEventResult fetch_result, | 241 ServiceWorkerFetchEventResult fetch_result, |
| 239 const ServiceWorkerResponse& response) { | 242 const ServiceWorkerResponse& response) { |
| 240 DCHECK(!fetch_callback_.is_null()); | 243 DCHECK(!fetch_callback_.is_null()); |
| 241 | 244 |
| 242 did_complete_ = true; | 245 did_complete_ = true; |
| 243 net_log_.EndEvent( | 246 net_log_.EndEvent( |
| 244 net::NetLog::TYPE_SERVICE_WORKER_DISPATCH_FETCH_EVENT, | 247 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT, |
| 245 base::Bind(&NetLogFetchEventCallback, status, fetch_result)); | 248 base::Bind(&NetLogFetchEventCallback, status, fetch_result)); |
| 246 | 249 |
| 247 FetchCallback fetch_callback = fetch_callback_; | 250 FetchCallback fetch_callback = fetch_callback_; |
| 248 scoped_refptr<ServiceWorkerVersion> version = version_; | 251 scoped_refptr<ServiceWorkerVersion> version = version_; |
| 249 fetch_callback.Run(status, fetch_result, response, version); | 252 fetch_callback.Run(status, fetch_result, response, version); |
| 250 } | 253 } |
| 251 | 254 |
| 252 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() | 255 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() |
| 253 const { | 256 const { |
| 254 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) | 257 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) |
| 255 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; | 258 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; |
| 256 return ResourceTypeToEventType(resource_type_); | 259 return ResourceTypeToEventType(resource_type_); |
| 257 } | 260 } |
| 258 | 261 |
| 259 } // namespace content | 262 } // namespace content |
| OLD | NEW |