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

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: check fetchEvent in ServiceWorkerGlobalScopeProxy::onNavigationPreloadError 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 itself.
falken 2017/01/18 14:24:58 nit: Slightly prefer |this| instead of "itself"
horo 2017/01/18 16:14:57 Done.
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 OnTransferSizeUpdated(int32_t transfer_size_diff) override { 297 void OnTransferSizeUpdated(int32_t transfer_size_diff) override {
312 NOTREACHED(); 298 NOTREACHED();
313 } 299 }
314 300
315 void OnStartLoadingResponseBody( 301 void OnStartLoadingResponseBody(
316 mojo::ScopedDataPipeConsumerHandle body) override { 302 mojo::ScopedDataPipeConsumerHandle body) override {
317 DCHECK(!body_.is_valid()); 303 DCHECK(!body_.is_valid());
318 body_ = std::move(body); 304 body_ = std::move(body);
319 MaybeReportResponseToClient(); 305 MaybeReportResponseToClient();
320 } 306 }
321 307
322 void OnComplete(const ResourceRequestCompletionStatus& status) override { 308 void OnComplete(const ResourceRequestCompletionStatus& status) override {
323 // We don't report to |client| if OnStartLoadingResponseBody() has already 309 if (status.error_code != net::OK) {
324 // called OnNavigationPreloadResponse(). 310 ReportErrorToClient("Service Worker navigation preload network error.");
falken 2017/01/18 14:24:58 Does this also delete |this|?
horo 2017/01/18 16:14:57 Done.
325 if (result_reported_)
326 return; 311 return;
327 DCHECK_NE(0, status.error_code); 312 }
328 ReportErrorToClient("Service Worker navigation preload network error."); 313
314 ServiceWorkerContextClient* client =
315 ServiceWorkerContextClient::ThreadSpecificInstance();
316 if (!client)
317 return;
318 // This will delete itself.
319 client->OnNavigationPreloadComplete(fetch_event_id_);
329 } 320 }
330 321
331 private: 322 private:
332 void MaybeReportResponseToClient() { 323 void MaybeReportResponseToClient() {
333 DCHECK(!result_reported_);
334 if (!response_ || !body_.is_valid()) 324 if (!response_ || !body_.is_valid())
335 return; 325 return;
336 ServiceWorkerContextClient* client = 326 ServiceWorkerContextClient* client =
337 ServiceWorkerContextClient::ThreadSpecificInstance(); 327 ServiceWorkerContextClient::ThreadSpecificInstance();
338 if (!client) 328 if (!client)
339 return; 329 return;
340 330
341 client->OnNavigationPreloadResponse( 331 client->OnNavigationPreloadResponse(
342 fetch_event_id_, std::move(response_), 332 fetch_event_id_, std::move(response_),
343 base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body_))); 333 base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body_)));
344 result_reported_ = true;
345 } 334 }
346 335
347 void ReportErrorToClient(const char* error_message) { 336 void ReportErrorToClient(const char* error_message) {
348 ServiceWorkerContextClient* client = 337 ServiceWorkerContextClient* client =
349 ServiceWorkerContextClient::ThreadSpecificInstance(); 338 ServiceWorkerContextClient::ThreadSpecificInstance();
350 if (!client) 339 if (!client)
351 return; 340 return;
341 // This will delete itself.
352 client->OnNavigationPreloadError( 342 client->OnNavigationPreloadError(
353 fetch_event_id_, base::MakeUnique<blink::WebServiceWorkerError>( 343 fetch_event_id_, base::MakeUnique<blink::WebServiceWorkerError>(
354 blink::WebServiceWorkerError::ErrorTypeNetwork, 344 blink::WebServiceWorkerError::ErrorTypeNetwork,
355 blink::WebString::fromUTF8(error_message))); 345 blink::WebString::fromUTF8(error_message)));
356 result_reported_ = true;
357 } 346 }
358 347
359 const int fetch_event_id_; 348 const int fetch_event_id_;
360 const GURL url_; 349 const GURL url_;
361 mojom::URLLoaderPtr url_loader_; 350 mojom::URLLoaderPtr url_loader_;
362 mojo::Binding<mojom::URLLoaderClient> binding_; 351 mojo::Binding<mojom::URLLoaderClient> binding_;
363 352
364 std::unique_ptr<blink::WebURLResponse> response_; 353 std::unique_ptr<blink::WebURLResponse> response_;
365 mojo::ScopedDataPipeConsumerHandle body_; 354 mojo::ScopedDataPipeConsumerHandle body_;
366 bool result_reported_ = false;
367 }; 355 };
368 356
369 ServiceWorkerContextClient* 357 ServiceWorkerContextClient*
370 ServiceWorkerContextClient::ThreadSpecificInstance() { 358 ServiceWorkerContextClient::ThreadSpecificInstance() {
371 return g_worker_client_tls.Pointer()->Get(); 359 return g_worker_client_tls.Pointer()->Get();
372 } 360 }
373 361
374 ServiceWorkerContextClient::ServiceWorkerContextClient( 362 ServiceWorkerContextClient::ServiceWorkerContextClient(
375 int embedded_worker_id, 363 int embedded_worker_id,
376 int64_t service_worker_version_id, 364 int64_t service_worker_version_id,
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 GetRoutingID(), fetch_event_id, 701 GetRoutingID(), fetch_event_id,
714 SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, 702 SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE,
715 GetServiceWorkerResponseFromWebResponse(web_response), 703 GetServiceWorkerResponseFromWebResponse(web_response),
716 base::Time::FromDoubleT(event_dispatch_time))); 704 base::Time::FromDoubleT(event_dispatch_time)));
717 } 705 }
718 706
719 void ServiceWorkerContextClient::didHandleFetchEvent( 707 void ServiceWorkerContextClient::didHandleFetchEvent(
720 int fetch_event_id, 708 int fetch_event_id,
721 blink::WebServiceWorkerEventResult result, 709 blink::WebServiceWorkerEventResult result,
722 double event_dispatch_time) { 710 double event_dispatch_time) {
723 if (context_->preload_requests.Lookup(fetch_event_id)) {
724 // Deletes NavigationPreloadRequest. If the network request is ongoing, it
725 // will be canceled by deleting the mojom::URLLoaderPtr in the
726 // NavigationPreloadRequest.
727 context_->preload_requests.Remove(fetch_event_id);
728 }
729 const FetchCallback* callback = 711 const FetchCallback* callback =
730 context_->fetch_event_callbacks.Lookup(fetch_event_id); 712 context_->fetch_event_callbacks.Lookup(fetch_event_id);
731 DCHECK(callback); 713 DCHECK(callback);
732 callback->Run(EventResultToStatus(result), 714 callback->Run(EventResultToStatus(result),
733 base::Time::FromDoubleT(event_dispatch_time)); 715 base::Time::FromDoubleT(event_dispatch_time));
734 context_->fetch_event_callbacks.Remove(fetch_event_id); 716 context_->fetch_event_callbacks.Remove(fetch_event_id);
735 } 717 }
736 718
737 void ServiceWorkerContextClient::didHandleNotificationClickEvent( 719 void ServiceWorkerContextClient::didHandleNotificationClickEvent(
738 int request_id, 720 int request_id,
(...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after
1262 std::unique_ptr<blink::WebURLResponse> response, 1244 std::unique_ptr<blink::WebURLResponse> response,
1263 std::unique_ptr<blink::WebDataConsumerHandle> data_consumer_handle) { 1245 std::unique_ptr<blink::WebDataConsumerHandle> data_consumer_handle) {
1264 proxy_->onNavigationPreloadResponse(fetch_event_id, std::move(response), 1246 proxy_->onNavigationPreloadResponse(fetch_event_id, std::move(response),
1265 std::move(data_consumer_handle)); 1247 std::move(data_consumer_handle));
1266 } 1248 }
1267 1249
1268 void ServiceWorkerContextClient::OnNavigationPreloadError( 1250 void ServiceWorkerContextClient::OnNavigationPreloadError(
1269 int fetch_event_id, 1251 int fetch_event_id,
1270 std::unique_ptr<blink::WebServiceWorkerError> error) { 1252 std::unique_ptr<blink::WebServiceWorkerError> error) {
1271 proxy_->onNavigationPreloadError(fetch_event_id, std::move(error)); 1253 proxy_->onNavigationPreloadError(fetch_event_id, std::move(error));
1254 context_->preload_requests.Remove(fetch_event_id);
1255 }
1256
1257 void ServiceWorkerContextClient::OnNavigationPreloadComplete(
1258 int fetch_event_id) {
1259 context_->preload_requests.Remove(fetch_event_id);
falken 2017/01/18 14:24:58 So either OnError or OnComplete must be called, bu
horo 2017/01/18 16:14:57 Done.
1272 } 1260 }
1273 1261
1274 void ServiceWorkerContextClient::BindEventDispatcher( 1262 void ServiceWorkerContextClient::BindEventDispatcher(
1275 mojom::ServiceWorkerEventDispatcherRequest request) { 1263 mojom::ServiceWorkerEventDispatcherRequest request) {
1276 DCHECK(context_); 1264 DCHECK(context_);
1277 DCHECK(!context_->event_dispatcher_binding.is_bound()); 1265 DCHECK(!context_->event_dispatcher_binding.is_bound());
1278 context_->event_dispatcher_binding.Bind(std::move(request)); 1266 context_->event_dispatcher_binding.Bind(std::move(request));
1279 } 1267 }
1280 1268
1281 base::WeakPtr<ServiceWorkerContextClient> 1269 base::WeakPtr<ServiceWorkerContextClient>
1282 ServiceWorkerContextClient::GetWeakPtr() { 1270 ServiceWorkerContextClient::GetWeakPtr() {
1283 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); 1271 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread());
1284 DCHECK(context_); 1272 DCHECK(context_);
1285 return context_->weak_factory.GetWeakPtr(); 1273 return context_->weak_factory.GetWeakPtr();
1286 } 1274 }
1287 1275
1288 } // namespace content 1276 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698