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 |