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