| 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 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 MaybeReportResponseToClient(); |
| 284 } | 284 } |
| 285 | 285 |
| 286 void OnReceiveRedirect(const net::RedirectInfo& redirect_info, | 286 void OnReceiveRedirect(const net::RedirectInfo& redirect_info, |
| 287 const ResourceResponseHead& response_head) override { | 287 const ResourceResponseHead& response_head) override { |
| 288 // Cancel the request. | 288 // Cancel the request. |
| 289 url_loader_ = nullptr; | 289 url_loader_ = nullptr; |
| 290 ReportErrorToClient( |
| 291 "Service Worker navigation preload doesn't suport redirect."); |
| 290 } | 292 } |
| 291 | 293 |
| 292 void OnDataDownloaded(int64_t data_length, | 294 void OnDataDownloaded(int64_t data_length, |
| 293 int64_t encoded_data_length) override { | 295 int64_t encoded_data_length) override { |
| 294 NOTREACHED(); | 296 NOTREACHED(); |
| 295 } | 297 } |
| 296 | 298 |
| 297 void OnStartLoadingResponseBody( | 299 void OnStartLoadingResponseBody( |
| 298 mojo::ScopedDataPipeConsumerHandle body) override { | 300 mojo::ScopedDataPipeConsumerHandle body) override { |
| 299 DCHECK(!body_.is_valid()); | 301 DCHECK(!body_.is_valid()); |
| 300 body_ = std::move(body); | 302 body_ = std::move(body); |
| 301 MaybeReportToClient(); | 303 MaybeReportResponseToClient(); |
| 302 } | 304 } |
| 303 | 305 |
| 304 void OnComplete(const ResourceRequestCompletionStatus& status) override { | 306 void OnComplete(const ResourceRequestCompletionStatus& status) override { |
| 305 // We don't report to |client| if OnStartLoadingResponseBody() has already | 307 // We don't report to |client| if OnStartLoadingResponseBody() has already |
| 306 // called OnNavigationPreloadResponse(). | 308 // called OnNavigationPreloadResponse(). |
| 307 if (result_reported_) | 309 if (result_reported_) |
| 308 return; | 310 return; |
| 309 DCHECK_NE(0, status.error_code); | 311 DCHECK_NE(0, status.error_code); |
| 310 ServiceWorkerContextClient* client = | 312 ReportErrorToClient("Service Worker navigation preload network error."); |
| 311 ServiceWorkerContextClient::ThreadSpecificInstance(); | |
| 312 if (!client) | |
| 313 return; | |
| 314 client->OnNavigationPreloadError( | |
| 315 fetch_event_id_, | |
| 316 base::MakeUnique<blink::WebServiceWorkerError>( | |
| 317 blink::WebServiceWorkerError::ErrorTypeNetwork, | |
| 318 blink::WebString::fromUTF8( | |
| 319 "Service Worker navigation preload network error."))); | |
| 320 result_reported_ = true; | |
| 321 } | 313 } |
| 322 | 314 |
| 323 private: | 315 private: |
| 324 void MaybeReportToClient() { | 316 void MaybeReportResponseToClient() { |
| 325 DCHECK(!result_reported_); | 317 DCHECK(!result_reported_); |
| 326 if (!response_ || !body_.is_valid()) | 318 if (!response_ || !body_.is_valid()) |
| 327 return; | 319 return; |
| 328 ServiceWorkerContextClient* client = | 320 ServiceWorkerContextClient* client = |
| 329 ServiceWorkerContextClient::ThreadSpecificInstance(); | 321 ServiceWorkerContextClient::ThreadSpecificInstance(); |
| 330 if (!client) | 322 if (!client) |
| 331 return; | 323 return; |
| 332 | 324 |
| 333 client->OnNavigationPreloadResponse( | 325 client->OnNavigationPreloadResponse( |
| 334 fetch_event_id_, std::move(response_), | 326 fetch_event_id_, std::move(response_), |
| 335 base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body_))); | 327 base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body_))); |
| 336 result_reported_ = true; | 328 result_reported_ = true; |
| 337 } | 329 } |
| 338 | 330 |
| 331 void ReportErrorToClient(const char* error_message) { |
| 332 ServiceWorkerContextClient* client = |
| 333 ServiceWorkerContextClient::ThreadSpecificInstance(); |
| 334 if (!client) |
| 335 return; |
| 336 client->OnNavigationPreloadError( |
| 337 fetch_event_id_, base::MakeUnique<blink::WebServiceWorkerError>( |
| 338 blink::WebServiceWorkerError::ErrorTypeNetwork, |
| 339 blink::WebString::fromUTF8(error_message))); |
| 340 result_reported_ = true; |
| 341 } |
| 342 |
| 339 const int fetch_event_id_; | 343 const int fetch_event_id_; |
| 340 const GURL url_; | 344 const GURL url_; |
| 341 mojom::URLLoaderPtr url_loader_; | 345 mojom::URLLoaderPtr url_loader_; |
| 342 mojo::Binding<mojom::URLLoaderClient> binding_; | 346 mojo::Binding<mojom::URLLoaderClient> binding_; |
| 343 | 347 |
| 344 std::unique_ptr<blink::WebServiceWorkerResponse> response_; | 348 std::unique_ptr<blink::WebServiceWorkerResponse> response_; |
| 345 mojo::ScopedDataPipeConsumerHandle body_; | 349 mojo::ScopedDataPipeConsumerHandle body_; |
| 346 bool result_reported_ = false; | 350 bool result_reported_ = false; |
| 347 }; | 351 }; |
| 348 | 352 |
| (...skipping 953 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1302 } | 1306 } |
| 1303 | 1307 |
| 1304 base::WeakPtr<ServiceWorkerContextClient> | 1308 base::WeakPtr<ServiceWorkerContextClient> |
| 1305 ServiceWorkerContextClient::GetWeakPtr() { | 1309 ServiceWorkerContextClient::GetWeakPtr() { |
| 1306 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); | 1310 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); |
| 1307 DCHECK(context_); | 1311 DCHECK(context_); |
| 1308 return context_->weak_factory.GetWeakPtr(); | 1312 return context_->weak_factory.GetWeakPtr(); |
| 1309 } | 1313 } |
| 1310 | 1314 |
| 1311 } // namespace content | 1315 } // namespace content |
| OLD | NEW |