Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Side by Side Diff: content/browser/service_worker/service_worker_fetch_dispatcher.cc

Issue 2034663002: ServiceWorker: Keep the worker alive until FetchEvent.waitUntil settles (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/trace_event/trace_event.h" 11 #include "base/trace_event/trace_event.h"
12 #include "content/browser/service_worker/embedded_worker_status.h" 12 #include "content/browser/service_worker/embedded_worker_status.h"
13 #include "content/browser/service_worker/service_worker_version.h" 13 #include "content/browser/service_worker/service_worker_version.h"
14 #include "content/common/service_worker/service_worker_messages.h" 14 #include "content/common/service_worker/service_worker_messages.h"
15 #include "content/common/service_worker/service_worker_utils.h"
15 16
16 namespace content { 17 namespace content {
17 18
18 namespace { 19 namespace {
19 20
20 using EventType = ServiceWorkerMetrics::EventType; 21 using EventType = ServiceWorkerMetrics::EventType;
21 EventType ResourceTypeToEventType(ResourceType resource_type) { 22 EventType ResourceTypeToEventType(ResourceType resource_type) {
22 switch (resource_type) { 23 switch (resource_type) {
23 case RESOURCE_TYPE_MAIN_FRAME: 24 case RESOURCE_TYPE_MAIN_FRAME:
24 return EventType::FETCH_MAIN_FRAME; 25 return EventType::FETCH_MAIN_FRAME;
(...skipping 29 matching lines...) Expand all
54 return std::move(dict); 55 return std::move(dict);
55 } 56 }
56 57
57 void EndNetLogEventWithServiceWorkerStatus(const net::BoundNetLog& net_log, 58 void EndNetLogEventWithServiceWorkerStatus(const net::BoundNetLog& net_log,
58 net::NetLog::EventType type, 59 net::NetLog::EventType type,
59 ServiceWorkerStatusCode status) { 60 ServiceWorkerStatusCode status) {
60 net_log.EndEvent(type, 61 net_log.EndEvent(type,
61 base::Bind(&NetLogServiceWorkerStatusCallback, status)); 62 base::Bind(&NetLogServiceWorkerStatusCallback, status));
62 } 63 }
63 64
65 ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType(
66 ServiceWorkerFetchType type) {
67 if (type == ServiceWorkerFetchType::FOREIGN_FETCH)
68 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL;
69 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL;
70 }
71
64 } // namespace 72 } // namespace
65 73
66 ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher( 74 ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher(
67 std::unique_ptr<ServiceWorkerFetchRequest> request, 75 std::unique_ptr<ServiceWorkerFetchRequest> request,
68 ServiceWorkerVersion* version, 76 ServiceWorkerVersion* version,
69 ResourceType resource_type, 77 ResourceType resource_type,
70 const net::BoundNetLog& net_log, 78 const net::BoundNetLog& net_log,
71 const base::Closure& prepare_callback, 79 const base::Closure& prepare_callback,
72 const FetchCallback& fetch_callback) 80 const FetchCallback& fetch_callback)
73 : version_(version), 81 : version_(version),
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 153
146 void ServiceWorkerFetchDispatcher::DispatchFetchEvent() { 154 void ServiceWorkerFetchDispatcher::DispatchFetchEvent() {
147 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()) 155 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status())
148 << "Worker stopped too soon after it was started."; 156 << "Worker stopped too soon after it was started.";
149 157
150 DCHECK(!prepare_callback_.is_null()); 158 DCHECK(!prepare_callback_.is_null());
151 base::Closure prepare_callback = prepare_callback_; 159 base::Closure prepare_callback = prepare_callback_;
152 prepare_callback.Run(); 160 prepare_callback.Run();
153 161
154 net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT); 162 net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT);
155 int request_id = version_->StartRequest( 163 int response_id = version_->StartRequest(
156 GetEventType(), 164 GetEventType(),
157 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch, 165 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch,
158 weak_factory_.GetWeakPtr())); 166 weak_factory_.GetWeakPtr()));
159 version_->DispatchEvent<ServiceWorkerHostMsg_FetchEventFinished>( 167 int event_finish_id = version_->StartRequest(
160 request_id, ServiceWorkerMsg_FetchEvent(request_id, *request_.get()), 168 FetchTypeToWaitUntilEventType(request_->fetch_type),
161 base::Bind(&ServiceWorkerFetchDispatcher::DidFinish, 169 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
162 weak_factory_.GetWeakPtr())); 170
171 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>(
172 response_id, base::Bind(&ServiceWorkerFetchDispatcher::DidFinish,
173 weak_factory_.GetWeakPtr()));
174 version_->RegisterSimpleRequest<ServiceWorkerHostMsg_FetchEventFinished>(
175 event_finish_id);
176 version_->DispatchEvent({response_id, event_finish_id},
177 ServiceWorkerMsg_FetchEvent(
178 response_id, event_finish_id, *request_.get()));
163 } 179 }
164 180
165 void ServiceWorkerFetchDispatcher::DidFailToDispatch( 181 void ServiceWorkerFetchDispatcher::DidFailToDispatch(
166 ServiceWorkerStatusCode status) { 182 ServiceWorkerStatusCode status) {
167 EndNetLogEventWithServiceWorkerStatus( 183 EndNetLogEventWithServiceWorkerStatus(
168 net_log_, net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT, status); 184 net_log_, net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT, status);
169 DidFail(status); 185 DidFail(status);
170 } 186 }
171 187
172 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { 188 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 } 222 }
207 223
208 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() 224 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType()
209 const { 225 const {
210 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) 226 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH)
211 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; 227 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH;
212 return ResourceTypeToEventType(resource_type_); 228 return ResourceTypeToEventType(resource_type_);
213 } 229 }
214 230
215 } // namespace content 231 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/service_worker/service_worker_browsertest.cc ('k') | content/browser/service_worker/service_worker_metrics.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698