Chromium Code Reviews| 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_) | 270 if (!response_reported_) { |
| 271 return; | 271 MaybeReportErrorToClient( |
| 272 ServiceWorkerContextClient* client = | 272 blink::WebServiceWorkerError::ErrorTypeAbort, |
| 273 ServiceWorkerContextClient::ThreadSpecificInstance(); | 273 "Service Worker navigation preload aborted. Need to guard with " |
| 274 if (!client) | 274 "respondWith or waitUntil."); |
|
falken
2017/01/17 14:38:36
FWIW this error message confused me, since I was n
horo
2017/01/18 14:25:02
Removed this error in https://codereview.chromium.
| |
| 275 return; | 275 } |
| 276 client->OnNavigationPreloadError( | 276 MaybeReportCompletionToClient(); |
| 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 } | 277 } |
| 284 | 278 |
| 285 void OnReceiveResponse( | 279 void OnReceiveResponse( |
| 286 const ResourceResponseHead& response_head, | 280 const ResourceResponseHead& response_head, |
| 287 mojom::DownloadedTempFilePtr downloaded_file) override { | 281 mojom::DownloadedTempFilePtr downloaded_file) override { |
| 288 DCHECK(!response_); | 282 DCHECK(!response_); |
| 289 DCHECK(!downloaded_file); | 283 DCHECK(!downloaded_file); |
| 290 response_ = base::MakeUnique<blink::WebURLResponse>(); | 284 response_ = base::MakeUnique<blink::WebURLResponse>(); |
| 291 // TODO(horo): Set report_security_info to true when DevTools is attached. | 285 // TODO(horo): Set report_security_info to true when DevTools is attached. |
| 292 const bool report_security_info = false; | 286 const bool report_security_info = false; |
| 293 WebURLLoaderImpl::PopulateURLResponse(url_, response_head, response_.get(), | 287 WebURLLoaderImpl::PopulateURLResponse(url_, response_head, response_.get(), |
| 294 report_security_info); | 288 report_security_info); |
| 295 MaybeReportResponseToClient(); | 289 MaybeReportResponseToClient(); |
| 296 } | 290 } |
| 297 | 291 |
| 298 void OnReceiveRedirect(const net::RedirectInfo& redirect_info, | 292 void OnReceiveRedirect(const net::RedirectInfo& redirect_info, |
| 299 const ResourceResponseHead& response_head) override { | 293 const ResourceResponseHead& response_head) override { |
| 300 // Cancel the request. | 294 // Cancel the request. |
| 301 url_loader_ = nullptr; | 295 url_loader_ = nullptr; |
| 302 ReportErrorToClient( | 296 MaybeReportErrorToClient( |
| 297 blink::WebServiceWorkerError::ErrorTypeNetwork, | |
| 303 "Service Worker navigation preload doesn't suport redirect."); | 298 "Service Worker navigation preload doesn't suport redirect."); |
|
falken
2017/01/17 14:38:36
nit: "support redirects"
horo
2017/01/18 14:25:02
Done.
| |
| 304 } | 299 } |
| 305 | 300 |
| 306 void OnDataDownloaded(int64_t data_length, | 301 void OnDataDownloaded(int64_t data_length, |
| 307 int64_t encoded_data_length) override { | 302 int64_t encoded_data_length) override { |
| 308 NOTREACHED(); | 303 NOTREACHED(); |
| 309 } | 304 } |
| 310 | 305 |
| 311 void OnTransferSizeUpdated(int32_t transfer_size_diff) override { | 306 void OnTransferSizeUpdated(int32_t transfer_size_diff) override { |
| 312 NOTREACHED(); | 307 // TODO(horo): Send this transfer size update notification to DevTools. |
| 313 } | 308 } |
| 314 | 309 |
| 315 void OnStartLoadingResponseBody( | 310 void OnStartLoadingResponseBody( |
| 316 mojo::ScopedDataPipeConsumerHandle body) override { | 311 mojo::ScopedDataPipeConsumerHandle body) override { |
| 317 DCHECK(!body_.is_valid()); | 312 DCHECK(!body_.is_valid()); |
| 318 body_ = std::move(body); | 313 body_ = std::move(body); |
| 319 MaybeReportResponseToClient(); | 314 MaybeReportResponseToClient(); |
| 320 } | 315 } |
| 321 | 316 |
| 322 void OnComplete(const ResourceRequestCompletionStatus& status) override { | 317 void OnComplete(const ResourceRequestCompletionStatus& status) override { |
| 323 // We don't report to |client| if OnStartLoadingResponseBody() has already | 318 if (status.error_code != net::OK) { |
| 324 // called OnNavigationPreloadResponse(). | 319 MaybeReportErrorToClient( |
| 325 if (result_reported_) | 320 blink::WebServiceWorkerError::ErrorTypeNetwork, |
| 326 return; | 321 "Service Worker navigation preload network error."); |
| 327 DCHECK_NE(0, status.error_code); | 322 } |
| 328 ReportErrorToClient("Service Worker navigation preload network error."); | 323 MaybeReportCompletionToClient(); |
| 329 } | 324 } |
| 330 | 325 |
| 331 private: | 326 private: |
| 332 void MaybeReportResponseToClient() { | 327 void MaybeReportResponseToClient() { |
| 333 DCHECK(!result_reported_); | 328 if (error_reported_) |
| 329 return; | |
| 330 DCHECK(!response_reported_); | |
| 334 if (!response_ || !body_.is_valid()) | 331 if (!response_ || !body_.is_valid()) |
| 335 return; | 332 return; |
| 336 ServiceWorkerContextClient* client = | 333 ServiceWorkerContextClient* client = |
| 337 ServiceWorkerContextClient::ThreadSpecificInstance(); | 334 ServiceWorkerContextClient::ThreadSpecificInstance(); |
| 338 if (!client) | 335 if (!client) |
| 339 return; | 336 return; |
| 340 | 337 |
| 341 client->OnNavigationPreloadResponse( | 338 client->OnNavigationPreloadResponse( |
| 342 fetch_event_id_, std::move(response_), | 339 fetch_event_id_, std::move(response_), |
| 343 base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body_))); | 340 base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body_))); |
| 344 result_reported_ = true; | 341 response_reported_ = true; |
| 345 } | 342 } |
| 346 | 343 |
| 347 void ReportErrorToClient(const char* error_message) { | 344 void MaybeReportErrorToClient( |
| 345 blink::WebServiceWorkerError::ErrorType error_type, | |
| 346 const char* error_message) { | |
| 347 if (response_reported_ || error_reported_) | |
| 348 return; | |
| 348 ServiceWorkerContextClient* client = | 349 ServiceWorkerContextClient* client = |
| 349 ServiceWorkerContextClient::ThreadSpecificInstance(); | 350 ServiceWorkerContextClient::ThreadSpecificInstance(); |
| 350 if (!client) | 351 if (!client) |
| 351 return; | 352 return; |
| 352 client->OnNavigationPreloadError( | 353 client->OnNavigationPreloadError( |
| 353 fetch_event_id_, base::MakeUnique<blink::WebServiceWorkerError>( | 354 fetch_event_id_, |
| 354 blink::WebServiceWorkerError::ErrorTypeNetwork, | 355 base::MakeUnique<blink::WebServiceWorkerError>( |
| 355 blink::WebString::fromUTF8(error_message))); | 356 error_type, blink::WebString::fromUTF8(error_message))); |
| 356 result_reported_ = true; | 357 error_reported_ = true; |
| 358 } | |
| 359 | |
| 360 void MaybeReportCompletionToClient() { | |
| 361 if (error_reported_ || completion_reported_) | |
| 362 return; | |
| 363 ServiceWorkerContextClient* client = | |
| 364 ServiceWorkerContextClient::ThreadSpecificInstance(); | |
| 365 if (!client) | |
| 366 return; | |
| 367 client->OnNavigationPreloadCompleted(fetch_event_id_); | |
| 368 completion_reported_ = true; | |
| 357 } | 369 } |
| 358 | 370 |
| 359 const int fetch_event_id_; | 371 const int fetch_event_id_; |
| 360 const GURL url_; | 372 const GURL url_; |
| 361 mojom::URLLoaderPtr url_loader_; | 373 mojom::URLLoaderPtr url_loader_; |
| 362 mojo::Binding<mojom::URLLoaderClient> binding_; | 374 mojo::Binding<mojom::URLLoaderClient> binding_; |
| 363 | 375 |
| 364 std::unique_ptr<blink::WebURLResponse> response_; | 376 std::unique_ptr<blink::WebURLResponse> response_; |
| 365 mojo::ScopedDataPipeConsumerHandle body_; | 377 mojo::ScopedDataPipeConsumerHandle body_; |
| 366 bool result_reported_ = false; | 378 bool response_reported_ = false; |
| 379 bool error_reported_ = false; | |
| 380 bool completion_reported_ = false; | |
|
falken
2017/01/17 14:38:36
I didn't look too carefully but can we turn this i
horo
2017/01/18 14:25:02
Removed this in https://codereview.chromium.org/26
| |
| 367 }; | 381 }; |
| 368 | 382 |
| 369 ServiceWorkerContextClient* | 383 ServiceWorkerContextClient* |
| 370 ServiceWorkerContextClient::ThreadSpecificInstance() { | 384 ServiceWorkerContextClient::ThreadSpecificInstance() { |
| 371 return g_worker_client_tls.Pointer()->Get(); | 385 return g_worker_client_tls.Pointer()->Get(); |
| 372 } | 386 } |
| 373 | 387 |
| 374 ServiceWorkerContextClient::ServiceWorkerContextClient( | 388 ServiceWorkerContextClient::ServiceWorkerContextClient( |
| 375 int embedded_worker_id, | 389 int embedded_worker_id, |
| 376 int64_t service_worker_version_id, | 390 int64_t service_worker_version_id, |
| (...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 973 TRACE_EVENT0("ServiceWorker", | 987 TRACE_EVENT0("ServiceWorker", |
| 974 "ServiceWorkerContextClient::OnInstallEvent"); | 988 "ServiceWorkerContextClient::OnInstallEvent"); |
| 975 proxy_->dispatchInstallEvent(request_id); | 989 proxy_->dispatchInstallEvent(request_id); |
| 976 } | 990 } |
| 977 | 991 |
| 978 void ServiceWorkerContextClient::DispatchFetchEvent( | 992 void ServiceWorkerContextClient::DispatchFetchEvent( |
| 979 int fetch_event_id, | 993 int fetch_event_id, |
| 980 const ServiceWorkerFetchRequest& request, | 994 const ServiceWorkerFetchRequest& request, |
| 981 mojom::FetchEventPreloadHandlePtr preload_handle, | 995 mojom::FetchEventPreloadHandlePtr preload_handle, |
| 982 const DispatchFetchEventCallback& callback) { | 996 const DispatchFetchEventCallback& callback) { |
| 983 std::unique_ptr<NavigationPreloadRequest> preload_request = | 997 std::unique_ptr<NavigationPreloadRequest> preload_request; |
| 984 preload_handle | 998 if (preload_handle) { |
| 985 ? base::MakeUnique<NavigationPreloadRequest>( | 999 proxy_->onNavigationPreloadSent(fetch_event_id, request.url, |
| 986 fetch_event_id, request.url, std::move(preload_handle)) | 1000 preload_handle->sent_timestamp, |
| 987 : nullptr; | 1001 preload_handle->sent_wall_time); |
| 1002 preload_request = base::MakeUnique<NavigationPreloadRequest>( | |
| 1003 fetch_event_id, request.url, std::move(preload_handle)); | |
| 1004 } | |
| 988 const bool navigation_preload_sent = !!preload_request; | 1005 const bool navigation_preload_sent = !!preload_request; |
| 989 blink::WebServiceWorkerRequest webRequest; | 1006 blink::WebServiceWorkerRequest webRequest; |
| 990 TRACE_EVENT0("ServiceWorker", | 1007 TRACE_EVENT0("ServiceWorker", |
| 991 "ServiceWorkerContextClient::DispatchFetchEvent"); | 1008 "ServiceWorkerContextClient::DispatchFetchEvent"); |
| 992 context_->fetch_event_callbacks.AddWithID( | 1009 context_->fetch_event_callbacks.AddWithID( |
| 993 base::MakeUnique<FetchCallback>(callback), fetch_event_id); | 1010 base::MakeUnique<FetchCallback>(callback), fetch_event_id); |
| 994 if (preload_request) { | 1011 if (preload_request) { |
| 995 context_->preload_requests.AddWithID(std::move(preload_request), | 1012 context_->preload_requests.AddWithID(std::move(preload_request), |
| 996 fetch_event_id); | 1013 fetch_event_id); |
| 997 } | 1014 } |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1264 proxy_->onNavigationPreloadResponse(fetch_event_id, std::move(response), | 1281 proxy_->onNavigationPreloadResponse(fetch_event_id, std::move(response), |
| 1265 std::move(data_consumer_handle)); | 1282 std::move(data_consumer_handle)); |
| 1266 } | 1283 } |
| 1267 | 1284 |
| 1268 void ServiceWorkerContextClient::OnNavigationPreloadError( | 1285 void ServiceWorkerContextClient::OnNavigationPreloadError( |
| 1269 int fetch_event_id, | 1286 int fetch_event_id, |
| 1270 std::unique_ptr<blink::WebServiceWorkerError> error) { | 1287 std::unique_ptr<blink::WebServiceWorkerError> error) { |
| 1271 proxy_->onNavigationPreloadError(fetch_event_id, std::move(error)); | 1288 proxy_->onNavigationPreloadError(fetch_event_id, std::move(error)); |
| 1272 } | 1289 } |
| 1273 | 1290 |
| 1291 void ServiceWorkerContextClient::OnNavigationPreloadCompleted( | |
| 1292 int fetch_event_id) { | |
| 1293 proxy_->onNavigationPreloadCompleted(fetch_event_id); | |
| 1294 } | |
| 1295 | |
| 1274 void ServiceWorkerContextClient::BindEventDispatcher( | 1296 void ServiceWorkerContextClient::BindEventDispatcher( |
| 1275 mojom::ServiceWorkerEventDispatcherRequest request) { | 1297 mojom::ServiceWorkerEventDispatcherRequest request) { |
| 1276 DCHECK(context_); | 1298 DCHECK(context_); |
| 1277 DCHECK(!context_->event_dispatcher_binding.is_bound()); | 1299 DCHECK(!context_->event_dispatcher_binding.is_bound()); |
| 1278 context_->event_dispatcher_binding.Bind(std::move(request)); | 1300 context_->event_dispatcher_binding.Bind(std::move(request)); |
| 1279 } | 1301 } |
| 1280 | 1302 |
| 1281 base::WeakPtr<ServiceWorkerContextClient> | 1303 base::WeakPtr<ServiceWorkerContextClient> |
| 1282 ServiceWorkerContextClient::GetWeakPtr() { | 1304 ServiceWorkerContextClient::GetWeakPtr() { |
| 1283 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); | 1305 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); |
| 1284 DCHECK(context_); | 1306 DCHECK(context_); |
| 1285 return context_->weak_factory.GetWeakPtr(); | 1307 return context_->weak_factory.GetWeakPtr(); |
| 1286 } | 1308 } |
| 1287 | 1309 |
| 1288 } // namespace content | 1310 } // namespace content |
| OLD | NEW |