OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |