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