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

Side by Side Diff: content/renderer/service_worker/service_worker_context_client.cc

Issue 2472343002: Race OnStartLoadingResponseBody and OnReceiveResponse of NavigationPreloadRequest. (Closed)
Patch Set: Created 4 years, 1 month 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/renderer/service_worker/service_worker_context_client.h" 5 #include "content/renderer/service_worker/service_worker_context_client.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 base::WeakPtrFactory<blink::WebServiceWorkerContextProxy> proxy_weak_factory; 235 base::WeakPtrFactory<blink::WebServiceWorkerContextProxy> proxy_weak_factory;
236 }; 236 };
237 237
238 class ServiceWorkerContextClient::NavigationPreloadRequest final 238 class ServiceWorkerContextClient::NavigationPreloadRequest final
239 : public mojom::URLLoaderClient { 239 : public mojom::URLLoaderClient {
240 public: 240 public:
241 NavigationPreloadRequest(int fetch_event_id, 241 NavigationPreloadRequest(int fetch_event_id,
242 const GURL& url, 242 const GURL& url,
243 mojom::FetchEventPreloadHandlePtr preload_handle) 243 mojom::FetchEventPreloadHandlePtr preload_handle)
244 : fetch_event_id_(fetch_event_id), 244 : fetch_event_id_(fetch_event_id),
245 url_(url),
245 url_loader_(std::move(preload_handle->url_loader)), 246 url_loader_(std::move(preload_handle->url_loader)),
246 binding_(this, std::move(preload_handle->url_loader_client_request)), 247 binding_(this, std::move(preload_handle->url_loader_client_request)) {}
247 response_(base::MakeUnique<blink::WebServiceWorkerResponse>()) {
248 response_->setURL(url);
249 }
250 248
251 ~NavigationPreloadRequest() override { 249 ~NavigationPreloadRequest() override {
252 if (result_reported_) 250 if (result_reported_)
253 return; 251 return;
254 ServiceWorkerContextClient* client = 252 ServiceWorkerContextClient* client =
255 ServiceWorkerContextClient::ThreadSpecificInstance(); 253 ServiceWorkerContextClient::ThreadSpecificInstance();
256 if (!client) 254 if (!client)
257 return; 255 return;
258 client->OnNavigationPreloadError( 256 client->OnNavigationPreloadError(
259 fetch_event_id_, 257 fetch_event_id_,
260 base::MakeUnique<blink::WebServiceWorkerError>( 258 base::MakeUnique<blink::WebServiceWorkerError>(
261 blink::WebServiceWorkerError::ErrorTypeAbort, 259 blink::WebServiceWorkerError::ErrorTypeAbort,
262 blink::WebString::fromUTF8( 260 blink::WebString::fromUTF8(
263 "Service Worker navigation preload aborted. Need to guard with " 261 "Service Worker navigation preload aborted. Need to guard with "
264 "respondWith or waitUntil."))); 262 "respondWith or waitUntil.")));
265 } 263 }
266 264
267 void OnReceiveResponse(const ResourceResponseHead& response_head) override { 265 void OnReceiveResponse(const ResourceResponseHead& response_head) override {
268 DCHECK(response_); 266 DCHECK(!response_);
267 response_ = base::MakeUnique<blink::WebServiceWorkerResponse>();
268 response_->setURL(url_);
269 DCHECK(response_head.headers); 269 DCHECK(response_head.headers);
270 response_->setStatus(response_head.headers->response_code()); 270 response_->setStatus(response_head.headers->response_code());
271 response_->setStatusText( 271 response_->setStatusText(
272 blink::WebString::fromUTF8(response_head.headers->GetStatusText())); 272 blink::WebString::fromUTF8(response_head.headers->GetStatusText()));
273 response_->setResponseType(blink::WebServiceWorkerResponseTypeBasic); 273 response_->setResponseType(blink::WebServiceWorkerResponseTypeBasic);
274 size_t iter = 0; 274 size_t iter = 0;
275 std::string header_name; 275 std::string header_name;
276 std::string header_value; 276 std::string header_value;
277 while (response_head.headers->EnumerateHeaderLines(&iter, &header_name, 277 while (response_head.headers->EnumerateHeaderLines(&iter, &header_name,
278 &header_value)) { 278 &header_value)) {
279 response_->appendHeader(blink::WebString::fromUTF8(header_name), 279 response_->appendHeader(blink::WebString::fromUTF8(header_name),
280 blink::WebString::fromUTF8(header_value)); 280 blink::WebString::fromUTF8(header_value));
281 } 281 }
282 response_->setResponseTime(response_head.response_time.ToInternalValue()); 282 response_->setResponseTime(response_head.response_time.ToInternalValue());
283 MaybeReportToClient();
283 } 284 }
284 285
285 void OnStartLoadingResponseBody( 286 void OnStartLoadingResponseBody(
286 mojo::ScopedDataPipeConsumerHandle body) override { 287 mojo::ScopedDataPipeConsumerHandle body) override {
287 DCHECK(!result_reported_); 288 DCHECK(!body_.is_valid());
288 ServiceWorkerContextClient* client = 289 body_ = std::move(body);
289 ServiceWorkerContextClient::ThreadSpecificInstance(); 290 MaybeReportToClient();
290 if (!client)
291 return;
292 client->OnNavigationPreloadResponse(
293 fetch_event_id_, std::move(response_),
294 base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body)));
295 result_reported_ = true;
296 } 291 }
297 292
298 void OnComplete(const ResourceRequestCompletionStatus& status) override { 293 void OnComplete(const ResourceRequestCompletionStatus& status) override {
299 // We don't report to |client| if OnStartLoadingResponseBody() has already 294 // We don't report to |client| if OnStartLoadingResponseBody() has already
300 // called OnNavigationPreloadResponse(). 295 // called OnNavigationPreloadResponse().
301 if (result_reported_) 296 if (result_reported_)
302 return; 297 return;
303 DCHECK_NE(0, status.error_code); 298 DCHECK_NE(0, status.error_code);
304 ServiceWorkerContextClient* client = 299 ServiceWorkerContextClient* client =
305 ServiceWorkerContextClient::ThreadSpecificInstance(); 300 ServiceWorkerContextClient::ThreadSpecificInstance();
306 if (!client) 301 if (!client)
307 return; 302 return;
308 client->OnNavigationPreloadError( 303 client->OnNavigationPreloadError(
309 fetch_event_id_, 304 fetch_event_id_,
310 base::MakeUnique<blink::WebServiceWorkerError>( 305 base::MakeUnique<blink::WebServiceWorkerError>(
311 blink::WebServiceWorkerError::ErrorTypeNetwork, 306 blink::WebServiceWorkerError::ErrorTypeNetwork,
312 blink::WebString::fromUTF8( 307 blink::WebString::fromUTF8(
313 "Service Worker navigation preload network error."))); 308 "Service Worker navigation preload network error.")));
314 result_reported_ = true; 309 result_reported_ = true;
315 } 310 }
316 311
317 private: 312 private:
313 void MaybeReportToClient() {
314 DCHECK(!result_reported_);
falken 2016/11/04 09:36:50 I'm missing something... how does this DCHECK pass
horo 2016/11/04 09:41:48 Both OnReceiveRersponse() and OnStartLoadingRespos
falken 2016/11/04 09:46:55 Ah yes... I was totally missing something.
315 if (!response_ || !body_.is_valid())
316 return;
317 ServiceWorkerContextClient* client =
318 ServiceWorkerContextClient::ThreadSpecificInstance();
319 if (!client)
320 return;
321
322 client->OnNavigationPreloadResponse(
323 fetch_event_id_, std::move(response_),
324 base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body_)));
325 result_reported_ = true;
326 }
327
318 const int fetch_event_id_; 328 const int fetch_event_id_;
329 const GURL url_;
319 mojom::URLLoaderPtr url_loader_; 330 mojom::URLLoaderPtr url_loader_;
320 mojo::Binding<mojom::URLLoaderClient> binding_; 331 mojo::Binding<mojom::URLLoaderClient> binding_;
332
321 std::unique_ptr<blink::WebServiceWorkerResponse> response_; 333 std::unique_ptr<blink::WebServiceWorkerResponse> response_;
334 mojo::ScopedDataPipeConsumerHandle body_;
322 bool result_reported_ = false; 335 bool result_reported_ = false;
323 }; 336 };
324 337
325 class ServiceWorkerContextClient::FetchEventDispatcherImpl 338 class ServiceWorkerContextClient::FetchEventDispatcherImpl
326 : public NON_EXPORTED_BASE(mojom::FetchEventDispatcher) { 339 : public NON_EXPORTED_BASE(mojom::FetchEventDispatcher) {
327 public: 340 public:
328 static void Create(mojom::FetchEventDispatcherRequest request) { 341 static void Create(mojom::FetchEventDispatcherRequest request) {
329 mojo::MakeStrongBinding(base::MakeUnique<FetchEventDispatcherImpl>(), 342 mojo::MakeStrongBinding(base::MakeUnique<FetchEventDispatcherImpl>(),
330 std::move(request)); 343 std::move(request));
331 } 344 }
(...skipping 946 matching lines...) Expand 10 before | Expand all | Expand 10 after
1278 } 1291 }
1279 1292
1280 base::WeakPtr<ServiceWorkerContextClient> 1293 base::WeakPtr<ServiceWorkerContextClient>
1281 ServiceWorkerContextClient::GetWeakPtr() { 1294 ServiceWorkerContextClient::GetWeakPtr() {
1282 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); 1295 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread());
1283 DCHECK(context_); 1296 DCHECK(context_);
1284 return context_->weak_factory.GetWeakPtr(); 1297 return context_->weak_factory.GetWeakPtr();
1285 } 1298 }
1286 1299
1287 } // namespace content 1300 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698