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

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

Issue 2645493002: Increase the lifetime of Navigation Preload related objects. (Closed)
Patch Set: fix broken-chunked-encoding-worker.js Created 3 years, 11 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 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 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 public: 260 public:
261 NavigationPreloadRequest(int fetch_event_id, 261 NavigationPreloadRequest(int fetch_event_id,
262 const GURL& url, 262 const GURL& url,
263 mojom::FetchEventPreloadHandlePtr preload_handle) 263 mojom::FetchEventPreloadHandlePtr preload_handle)
264 : fetch_event_id_(fetch_event_id), 264 : fetch_event_id_(fetch_event_id),
265 url_(url), 265 url_(url),
266 url_loader_(std::move(preload_handle->url_loader)), 266 url_loader_(std::move(preload_handle->url_loader)),
267 binding_(this, std::move(preload_handle->url_loader_client_request)) {} 267 binding_(this, std::move(preload_handle->url_loader_client_request)) {}
268 268
269 ~NavigationPreloadRequest() override { 269 ~NavigationPreloadRequest() override {
270 if (result_reported_)
271 return;
272 ServiceWorkerContextClient* client =
273 ServiceWorkerContextClient::ThreadSpecificInstance();
274 if (!client)
275 return;
276 client->OnNavigationPreloadError(
277 fetch_event_id_,
278 base::MakeUnique<blink::WebServiceWorkerError>(
279 blink::WebServiceWorkerError::ErrorTypeAbort,
280 blink::WebString::fromASCII(
281 "Service Worker navigation preload aborted. Need to guard with "
282 "respondWith or waitUntil.")));
283 } 270 }
284 271
285 void OnReceiveResponse( 272 void OnReceiveResponse(
286 const ResourceResponseHead& response_head, 273 const ResourceResponseHead& response_head,
287 mojom::DownloadedTempFilePtr downloaded_file) override { 274 mojom::DownloadedTempFilePtr downloaded_file) override {
288 DCHECK(!response_); 275 DCHECK(!response_);
289 DCHECK(!downloaded_file); 276 DCHECK(!downloaded_file);
290 response_ = base::MakeUnique<blink::WebURLResponse>(); 277 response_ = base::MakeUnique<blink::WebURLResponse>();
291 // TODO(horo): Set report_security_info to true when DevTools is attached. 278 // TODO(horo): Set report_security_info to true when DevTools is attached.
292 const bool report_security_info = false; 279 const bool report_security_info = false;
293 WebURLLoaderImpl::PopulateURLResponse(url_, response_head, response_.get(), 280 WebURLLoaderImpl::PopulateURLResponse(url_, response_head, response_.get(),
294 report_security_info); 281 report_security_info);
295 MaybeReportResponseToClient(); 282 MaybeReportResponseToClient();
296 } 283 }
297 284
298 void OnReceiveRedirect(const net::RedirectInfo& redirect_info, 285 void OnReceiveRedirect(const net::RedirectInfo& redirect_info,
299 const ResourceResponseHead& response_head) override { 286 const ResourceResponseHead& response_head) override {
300 // Cancel the request. 287 // This will delete |this|.
301 url_loader_ = nullptr;
302 ReportErrorToClient( 288 ReportErrorToClient(
303 "Service Worker navigation preload doesn't suport redirect."); 289 "Service Worker navigation preload doesn't suport redirect.");
304 } 290 }
305 291
306 void OnDataDownloaded(int64_t data_length, 292 void OnDataDownloaded(int64_t data_length,
307 int64_t encoded_data_length) override { 293 int64_t encoded_data_length) override {
308 NOTREACHED(); 294 NOTREACHED();
309 } 295 }
310 296
311 void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override {} 297 void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override {}
312 298
313 void OnTransferSizeUpdated(int32_t transfer_size_diff) override { 299 void OnTransferSizeUpdated(int32_t transfer_size_diff) override {
314 NOTREACHED(); 300 NOTREACHED();
315 } 301 }
316 302
317 void OnStartLoadingResponseBody( 303 void OnStartLoadingResponseBody(
318 mojo::ScopedDataPipeConsumerHandle body) override { 304 mojo::ScopedDataPipeConsumerHandle body) override {
319 DCHECK(!body_.is_valid()); 305 DCHECK(!body_.is_valid());
320 body_ = std::move(body); 306 body_ = std::move(body);
321 MaybeReportResponseToClient(); 307 MaybeReportResponseToClient();
322 } 308 }
323 309
324 void OnComplete(const ResourceRequestCompletionStatus& status) override { 310 void OnComplete(const ResourceRequestCompletionStatus& status) override {
325 // We don't report to |client| if OnStartLoadingResponseBody() has already 311 if (status.error_code != net::OK) {
326 // called OnNavigationPreloadResponse(). 312 // This will delete |this|.
327 if (result_reported_) 313 ReportErrorToClient("Service Worker navigation preload network error.");
328 return; 314 return;
329 DCHECK_NE(0, status.error_code); 315 }
330 ReportErrorToClient("Service Worker navigation preload network error."); 316
317 ServiceWorkerContextClient* client =
318 ServiceWorkerContextClient::ThreadSpecificInstance();
319 if (!client)
320 return;
321 // This will delete |this|.
322 client->OnNavigationPreloadComplete(fetch_event_id_);
331 } 323 }
332 324
333 private: 325 private:
334 void MaybeReportResponseToClient() { 326 void MaybeReportResponseToClient() {
335 DCHECK(!result_reported_);
336 if (!response_ || !body_.is_valid()) 327 if (!response_ || !body_.is_valid())
337 return; 328 return;
338 ServiceWorkerContextClient* client = 329 ServiceWorkerContextClient* client =
339 ServiceWorkerContextClient::ThreadSpecificInstance(); 330 ServiceWorkerContextClient::ThreadSpecificInstance();
340 if (!client) 331 if (!client)
341 return; 332 return;
342 333
343 client->OnNavigationPreloadResponse( 334 client->OnNavigationPreloadResponse(
344 fetch_event_id_, std::move(response_), 335 fetch_event_id_, std::move(response_),
345 base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body_))); 336 base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body_)));
346 result_reported_ = true;
347 } 337 }
348 338
349 void ReportErrorToClient(const char* error_message) { 339 void ReportErrorToClient(const char* error_message) {
350 ServiceWorkerContextClient* client = 340 ServiceWorkerContextClient* client =
351 ServiceWorkerContextClient::ThreadSpecificInstance(); 341 ServiceWorkerContextClient::ThreadSpecificInstance();
352 if (!client) 342 if (!client)
353 return; 343 return;
344 // This will delete |this|.
354 client->OnNavigationPreloadError( 345 client->OnNavigationPreloadError(
355 fetch_event_id_, base::MakeUnique<blink::WebServiceWorkerError>( 346 fetch_event_id_, base::MakeUnique<blink::WebServiceWorkerError>(
356 blink::WebServiceWorkerError::ErrorTypeNetwork, 347 blink::WebServiceWorkerError::ErrorTypeNetwork,
357 blink::WebString::fromUTF8(error_message))); 348 blink::WebString::fromUTF8(error_message)));
358 result_reported_ = true;
359 } 349 }
360 350
361 const int fetch_event_id_; 351 const int fetch_event_id_;
362 const GURL url_; 352 const GURL url_;
363 mojom::URLLoaderPtr url_loader_; 353 mojom::URLLoaderPtr url_loader_;
364 mojo::Binding<mojom::URLLoaderClient> binding_; 354 mojo::Binding<mojom::URLLoaderClient> binding_;
365 355
366 std::unique_ptr<blink::WebURLResponse> response_; 356 std::unique_ptr<blink::WebURLResponse> response_;
367 mojo::ScopedDataPipeConsumerHandle body_; 357 mojo::ScopedDataPipeConsumerHandle body_;
368 bool result_reported_ = false;
369 }; 358 };
370 359
371 ServiceWorkerContextClient* 360 ServiceWorkerContextClient*
372 ServiceWorkerContextClient::ThreadSpecificInstance() { 361 ServiceWorkerContextClient::ThreadSpecificInstance() {
373 return g_worker_client_tls.Pointer()->Get(); 362 return g_worker_client_tls.Pointer()->Get();
374 } 363 }
375 364
376 ServiceWorkerContextClient::ServiceWorkerContextClient( 365 ServiceWorkerContextClient::ServiceWorkerContextClient(
377 int embedded_worker_id, 366 int embedded_worker_id,
378 int64_t service_worker_version_id, 367 int64_t service_worker_version_id,
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 GetRoutingID(), fetch_event_id, 691 GetRoutingID(), fetch_event_id,
703 SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, 692 SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE,
704 GetServiceWorkerResponseFromWebResponse(web_response), 693 GetServiceWorkerResponseFromWebResponse(web_response),
705 base::Time::FromDoubleT(event_dispatch_time))); 694 base::Time::FromDoubleT(event_dispatch_time)));
706 } 695 }
707 696
708 void ServiceWorkerContextClient::didHandleFetchEvent( 697 void ServiceWorkerContextClient::didHandleFetchEvent(
709 int fetch_event_id, 698 int fetch_event_id,
710 blink::WebServiceWorkerEventResult result, 699 blink::WebServiceWorkerEventResult result,
711 double event_dispatch_time) { 700 double event_dispatch_time) {
712 if (context_->preload_requests.Lookup(fetch_event_id)) {
713 // Deletes NavigationPreloadRequest. If the network request is ongoing, it
714 // will be canceled by deleting the mojom::URLLoaderPtr in the
715 // NavigationPreloadRequest.
716 context_->preload_requests.Remove(fetch_event_id);
717 }
718 const FetchCallback* callback = 701 const FetchCallback* callback =
719 context_->fetch_event_callbacks.Lookup(fetch_event_id); 702 context_->fetch_event_callbacks.Lookup(fetch_event_id);
720 DCHECK(callback); 703 DCHECK(callback);
721 callback->Run(EventResultToStatus(result), 704 callback->Run(EventResultToStatus(result),
722 base::Time::FromDoubleT(event_dispatch_time)); 705 base::Time::FromDoubleT(event_dispatch_time));
723 context_->fetch_event_callbacks.Remove(fetch_event_id); 706 context_->fetch_event_callbacks.Remove(fetch_event_id);
724 } 707 }
725 708
726 void ServiceWorkerContextClient::didHandleNotificationClickEvent( 709 void ServiceWorkerContextClient::didHandleNotificationClickEvent(
727 int request_id, 710 int request_id,
(...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after
1251 std::unique_ptr<blink::WebURLResponse> response, 1234 std::unique_ptr<blink::WebURLResponse> response,
1252 std::unique_ptr<blink::WebDataConsumerHandle> data_consumer_handle) { 1235 std::unique_ptr<blink::WebDataConsumerHandle> data_consumer_handle) {
1253 proxy_->onNavigationPreloadResponse(fetch_event_id, std::move(response), 1236 proxy_->onNavigationPreloadResponse(fetch_event_id, std::move(response),
1254 std::move(data_consumer_handle)); 1237 std::move(data_consumer_handle));
1255 } 1238 }
1256 1239
1257 void ServiceWorkerContextClient::OnNavigationPreloadError( 1240 void ServiceWorkerContextClient::OnNavigationPreloadError(
1258 int fetch_event_id, 1241 int fetch_event_id,
1259 std::unique_ptr<blink::WebServiceWorkerError> error) { 1242 std::unique_ptr<blink::WebServiceWorkerError> error) {
1260 proxy_->onNavigationPreloadError(fetch_event_id, std::move(error)); 1243 proxy_->onNavigationPreloadError(fetch_event_id, std::move(error));
1244 context_->preload_requests.Remove(fetch_event_id);
1245 }
1246
1247 void ServiceWorkerContextClient::OnNavigationPreloadComplete(
1248 int fetch_event_id) {
1249 context_->preload_requests.Remove(fetch_event_id);
1261 } 1250 }
1262 1251
1263 base::WeakPtr<ServiceWorkerContextClient> 1252 base::WeakPtr<ServiceWorkerContextClient>
1264 ServiceWorkerContextClient::GetWeakPtr() { 1253 ServiceWorkerContextClient::GetWeakPtr() {
1265 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); 1254 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread());
1266 DCHECK(context_); 1255 DCHECK(context_);
1267 return context_->weak_factory.GetWeakPtr(); 1256 return context_->weak_factory.GetWeakPtr();
1268 } 1257 }
1269 1258
1270 } // namespace content 1259 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698