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

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

Issue 2114893002: service worker: Clean up fetch event if URLRequest gets cancelled. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: revise 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"
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 64
65 ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType( 65 ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType(
66 ServiceWorkerFetchType type) { 66 ServiceWorkerFetchType type) {
67 if (type == ServiceWorkerFetchType::FOREIGN_FETCH) 67 if (type == ServiceWorkerFetchType::FOREIGN_FETCH)
68 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL; 68 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL;
69 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL; 69 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL;
70 } 70 }
71 71
72 } // namespace 72 } // namespace
73 73
74 // Helper to receive the fetch event response even if
75 // ServiceWorkerFetchDispatcher has been destroyed.
76 class ServiceWorkerFetchDispatcher::ResponseCallback {
77 public:
78 ResponseCallback(base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher,
79 ServiceWorkerVersion* version)
80 : fetch_dispatcher_(fetch_dispatcher), version_(version) {}
81
82 void Run(int request_id,
83 ServiceWorkerFetchEventResult fetch_result,
84 const ServiceWorkerResponse& response) {
85 const bool handled =
86 (fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE);
87 if (!version_->FinishRequest(request_id, handled))
88 NOTREACHED() << "Should only receive one reply per event";
89
90 // |fetch_dispatcher| is null if the URLRequest was killed.
91 if (fetch_dispatcher_)
92 fetch_dispatcher_->DidFinish(request_id, fetch_result, response);
93 }
94
95 private:
96 base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher_;
97 // Owns |this|.
98 ServiceWorkerVersion* version_;
99
100 DISALLOW_COPY_AND_ASSIGN(ResponseCallback);
101 };
102
74 ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher( 103 ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher(
75 std::unique_ptr<ServiceWorkerFetchRequest> request, 104 std::unique_ptr<ServiceWorkerFetchRequest> request,
76 ServiceWorkerVersion* version, 105 ServiceWorkerVersion* version,
77 ResourceType resource_type, 106 ResourceType resource_type,
78 const net::BoundNetLog& net_log, 107 const net::BoundNetLog& net_log,
79 const base::Closure& prepare_callback, 108 const base::Closure& prepare_callback,
80 const FetchCallback& fetch_callback) 109 const FetchCallback& fetch_callback)
81 : version_(version), 110 : version_(version),
82 net_log_(net_log), 111 net_log_(net_log),
83 prepare_callback_(prepare_callback), 112 prepare_callback_(prepare_callback),
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 190
162 net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT); 191 net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT);
163 int response_id = version_->StartRequest( 192 int response_id = version_->StartRequest(
164 GetEventType(), 193 GetEventType(),
165 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch, 194 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch,
166 weak_factory_.GetWeakPtr())); 195 weak_factory_.GetWeakPtr()));
167 int event_finish_id = version_->StartRequest( 196 int event_finish_id = version_->StartRequest(
168 FetchTypeToWaitUntilEventType(request_->fetch_type), 197 FetchTypeToWaitUntilEventType(request_->fetch_type),
169 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); 198 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
170 199
200 ResponseCallback* response_callback =
201 new ResponseCallback(weak_factory_.GetWeakPtr(), version_.get());
171 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>( 202 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>(
172 response_id, base::Bind(&ServiceWorkerFetchDispatcher::DidFinish, 203 response_id,
173 weak_factory_.GetWeakPtr())); 204 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run,
205 base::Owned(response_callback)));
174 version_->RegisterSimpleRequest<ServiceWorkerHostMsg_FetchEventFinished>( 206 version_->RegisterSimpleRequest<ServiceWorkerHostMsg_FetchEventFinished>(
175 event_finish_id); 207 event_finish_id);
176 version_->DispatchEvent({response_id, event_finish_id}, 208 version_->DispatchEvent({response_id, event_finish_id},
177 ServiceWorkerMsg_FetchEvent( 209 ServiceWorkerMsg_FetchEvent(
178 response_id, event_finish_id, *request_.get())); 210 response_id, event_finish_id, *request_.get()));
179 } 211 }
180 212
181 void ServiceWorkerFetchDispatcher::DidFailToDispatch( 213 void ServiceWorkerFetchDispatcher::DidFailToDispatch(
182 ServiceWorkerStatusCode status) { 214 ServiceWorkerStatusCode status) {
183 EndNetLogEventWithServiceWorkerStatus( 215 EndNetLogEventWithServiceWorkerStatus(
184 net_log_, net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT, status); 216 net_log_, net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT, status);
185 DidFail(status); 217 DidFail(status);
186 } 218 }
187 219
188 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { 220 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) {
189 DCHECK_NE(SERVICE_WORKER_OK, status); 221 DCHECK_NE(SERVICE_WORKER_OK, status);
190 Complete(status, SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, 222 Complete(status, SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK,
191 ServiceWorkerResponse()); 223 ServiceWorkerResponse());
192 } 224 }
193 225
194 void ServiceWorkerFetchDispatcher::DidFinish( 226 void ServiceWorkerFetchDispatcher::DidFinish(
195 int request_id, 227 int request_id,
196 ServiceWorkerFetchEventResult fetch_result, 228 ServiceWorkerFetchEventResult fetch_result,
197 const ServiceWorkerResponse& response) { 229 const ServiceWorkerResponse& response) {
198 net_log_.EndEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT); 230 net_log_.EndEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT);
199
200 const bool handled =
201 (fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE);
202 if (!version_->FinishRequest(request_id, handled))
203 NOTREACHED() << "Should only receive one reply per event";
204
205 Complete(SERVICE_WORKER_OK, fetch_result, response); 231 Complete(SERVICE_WORKER_OK, fetch_result, response);
206 } 232 }
207 233
208 void ServiceWorkerFetchDispatcher::Complete( 234 void ServiceWorkerFetchDispatcher::Complete(
209 ServiceWorkerStatusCode status, 235 ServiceWorkerStatusCode status,
210 ServiceWorkerFetchEventResult fetch_result, 236 ServiceWorkerFetchEventResult fetch_result,
211 const ServiceWorkerResponse& response) { 237 const ServiceWorkerResponse& response) {
212 DCHECK(!fetch_callback_.is_null()); 238 DCHECK(!fetch_callback_.is_null());
213 239
214 did_complete_ = true; 240 did_complete_ = true;
215 net_log_.EndEvent( 241 net_log_.EndEvent(
216 net::NetLog::TYPE_SERVICE_WORKER_DISPATCH_FETCH_EVENT, 242 net::NetLog::TYPE_SERVICE_WORKER_DISPATCH_FETCH_EVENT,
217 base::Bind(&NetLogFetchEventCallback, status, fetch_result)); 243 base::Bind(&NetLogFetchEventCallback, status, fetch_result));
218 244
219 FetchCallback fetch_callback = fetch_callback_; 245 FetchCallback fetch_callback = fetch_callback_;
220 scoped_refptr<ServiceWorkerVersion> version = version_; 246 scoped_refptr<ServiceWorkerVersion> version = version_;
221 fetch_callback.Run(status, fetch_result, response, version); 247 fetch_callback.Run(status, fetch_result, response, version);
222 } 248 }
223 249
224 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() 250 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType()
225 const { 251 const {
226 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) 252 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH)
227 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; 253 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH;
228 return ResourceTypeToEventType(resource_type_); 254 return ResourceTypeToEventType(resource_type_);
229 } 255 }
230 256
231 } // namespace content 257 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698