| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/browser/service_worker/service_worker_fetch_dispatcher.h" | 5 #include "content/browser/service_worker/service_worker_fetch_dispatcher.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 mojom::URLLoaderAssociatedPtr loader_; | 66 mojom::URLLoaderAssociatedPtr loader_; |
| 67 | 67 |
| 68 DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoader); | 68 DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoader); |
| 69 }; | 69 }; |
| 70 | 70 |
| 71 // This class wraps a mojo::InterfacePtr<URLLoaderClient>. It also is a | 71 // This class wraps a mojo::InterfacePtr<URLLoaderClient>. It also is a |
| 72 // URLLoaderClient implementation and delegates URLLoaderClient calls to the | 72 // URLLoaderClient implementation and delegates URLLoaderClient calls to the |
| 73 // wrapped client. | 73 // wrapped client. |
| 74 class DelegatingURLLoaderClient final : public mojom::URLLoaderClient { | 74 class DelegatingURLLoaderClient final : public mojom::URLLoaderClient { |
| 75 public: | 75 public: |
| 76 explicit DelegatingURLLoaderClient(mojom::URLLoaderClientPtr client) | 76 explicit DelegatingURLLoaderClient(mojom::URLLoaderClientPtr client, |
| 77 : binding_(this), client_(std::move(client)) {} | 77 base::OnceClosure on_response) |
| 78 : binding_(this), |
| 79 client_(std::move(client)), |
| 80 on_response_(std::move(on_response)) {} |
| 78 ~DelegatingURLLoaderClient() override { | 81 ~DelegatingURLLoaderClient() override { |
| 79 if (!completed_) { | 82 if (!completed_) { |
| 80 // Let the service worker know that the request has been canceled. | 83 // Let the service worker know that the request has been canceled. |
| 81 ResourceRequestCompletionStatus status; | 84 ResourceRequestCompletionStatus status; |
| 82 status.error_code = net::ERR_ABORTED; | 85 status.error_code = net::ERR_ABORTED; |
| 83 client_->OnComplete(status); | 86 client_->OnComplete(status); |
| 84 } | 87 } |
| 85 } | 88 } |
| 86 | 89 |
| 87 void OnDataDownloaded(int64_t data_length, int64_t encoded_length) override { | 90 void OnDataDownloaded(int64_t data_length, int64_t encoded_length) override { |
| 88 client_->OnDataDownloaded(data_length, encoded_length); | 91 client_->OnDataDownloaded(data_length, encoded_length); |
| 89 } | 92 } |
| 90 void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override { | 93 void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override { |
| 91 client_->OnReceiveCachedMetadata(data); | 94 client_->OnReceiveCachedMetadata(data); |
| 92 } | 95 } |
| 93 void OnTransferSizeUpdated(int32_t transfer_size_diff) override { | 96 void OnTransferSizeUpdated(int32_t transfer_size_diff) override { |
| 94 client_->OnTransferSizeUpdated(transfer_size_diff); | 97 client_->OnTransferSizeUpdated(transfer_size_diff); |
| 95 } | 98 } |
| 96 void OnReceiveResponse( | 99 void OnReceiveResponse( |
| 97 const ResourceResponseHead& head, | 100 const ResourceResponseHead& head, |
| 98 mojom::DownloadedTempFilePtr downloaded_file) override { | 101 mojom::DownloadedTempFilePtr downloaded_file) override { |
| 99 client_->OnReceiveResponse(head, std::move(downloaded_file)); | 102 client_->OnReceiveResponse(head, std::move(downloaded_file)); |
| 103 DCHECK(on_response_); |
| 104 std::move(on_response_).Run(); |
| 100 } | 105 } |
| 101 void OnReceiveRedirect(const net::RedirectInfo& redirect_info, | 106 void OnReceiveRedirect(const net::RedirectInfo& redirect_info, |
| 102 const ResourceResponseHead& head) override { | 107 const ResourceResponseHead& head) override { |
| 103 client_->OnReceiveRedirect(redirect_info, head); | 108 client_->OnReceiveRedirect(redirect_info, head); |
| 104 } | 109 } |
| 105 void OnStartLoadingResponseBody( | 110 void OnStartLoadingResponseBody( |
| 106 mojo::ScopedDataPipeConsumerHandle body) override { | 111 mojo::ScopedDataPipeConsumerHandle body) override { |
| 107 client_->OnStartLoadingResponseBody(std::move(body)); | 112 client_->OnStartLoadingResponseBody(std::move(body)); |
| 108 } | 113 } |
| 109 void OnComplete( | 114 void OnComplete( |
| 110 const ResourceRequestCompletionStatus& completion_status) override { | 115 const ResourceRequestCompletionStatus& completion_status) override { |
| 111 client_->OnComplete(completion_status); | 116 client_->OnComplete(completion_status); |
| 112 completed_ = true; | 117 completed_ = true; |
| 113 } | 118 } |
| 114 | 119 |
| 115 void Bind(mojom::URLLoaderClientAssociatedPtrInfo* ptr_info, | 120 void Bind(mojom::URLLoaderClientAssociatedPtrInfo* ptr_info, |
| 116 mojo::AssociatedGroup* associated_group) { | 121 mojo::AssociatedGroup* associated_group) { |
| 117 binding_.Bind(ptr_info, associated_group); | 122 binding_.Bind(ptr_info, associated_group); |
| 118 } | 123 } |
| 119 | 124 |
| 120 private: | 125 private: |
| 121 mojo::AssociatedBinding<mojom::URLLoaderClient> binding_; | 126 mojo::AssociatedBinding<mojom::URLLoaderClient> binding_; |
| 122 mojom::URLLoaderClientPtr client_; | 127 mojom::URLLoaderClientPtr client_; |
| 128 base::OnceClosure on_response_; |
| 123 bool completed_ = false; | 129 bool completed_ = false; |
| 124 | 130 |
| 125 DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoaderClient); | 131 DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoaderClient); |
| 126 }; | 132 }; |
| 127 | 133 |
| 128 using EventType = ServiceWorkerMetrics::EventType; | 134 using EventType = ServiceWorkerMetrics::EventType; |
| 129 EventType ResourceTypeToEventType(ResourceType resource_type) { | 135 EventType ResourceTypeToEventType(ResourceType resource_type) { |
| 130 switch (resource_type) { | 136 switch (resource_type) { |
| 131 case RESOURCE_TYPE_MAIN_FRAME: | 137 case RESOURCE_TYPE_MAIN_FRAME: |
| 132 return EventType::FETCH_MAIN_FRAME; | 138 return EventType::FETCH_MAIN_FRAME; |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 net_log_.EndEvent( | 401 net_log_.EndEvent( |
| 396 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT, | 402 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT, |
| 397 base::Bind(&NetLogFetchEventCallback, status, fetch_result)); | 403 base::Bind(&NetLogFetchEventCallback, status, fetch_result)); |
| 398 | 404 |
| 399 FetchCallback fetch_callback = fetch_callback_; | 405 FetchCallback fetch_callback = fetch_callback_; |
| 400 scoped_refptr<ServiceWorkerVersion> version = version_; | 406 scoped_refptr<ServiceWorkerVersion> version = version_; |
| 401 fetch_callback.Run(status, fetch_result, response, version); | 407 fetch_callback.Run(status, fetch_result, response, version); |
| 402 } | 408 } |
| 403 | 409 |
| 404 bool ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( | 410 bool ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( |
| 405 net::URLRequest* original_request) { | 411 net::URLRequest* original_request, |
| 412 base::OnceClosure on_response) { |
| 406 if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME && | 413 if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME && |
| 407 resource_type_ != RESOURCE_TYPE_SUB_FRAME) { | 414 resource_type_ != RESOURCE_TYPE_SUB_FRAME) { |
| 408 return false; | 415 return false; |
| 409 } | 416 } |
| 410 if (!version_->navigation_preload_state().enabled) | 417 if (!version_->navigation_preload_state().enabled) |
| 411 return false; | 418 return false; |
| 412 // TODO(horo): Currently NavigationPreload doesn't support request body. | 419 // TODO(horo): Currently NavigationPreload doesn't support request body. |
| 413 if (!request_->blob_uuid.empty()) | 420 if (!request_->blob_uuid.empty()) |
| 414 return false; | 421 return false; |
| 415 | 422 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 version_->navigation_preload_state().header; | 476 version_->navigation_preload_state().header; |
| 470 | 477 |
| 471 const int request_id = ResourceDispatcherHostImpl::Get()->MakeRequestID(); | 478 const int request_id = ResourceDispatcherHostImpl::Get()->MakeRequestID(); |
| 472 DCHECK_LT(request_id, -1); | 479 DCHECK_LT(request_id, -1); |
| 473 | 480 |
| 474 preload_handle_ = mojom::FetchEventPreloadHandle::New(); | 481 preload_handle_ = mojom::FetchEventPreloadHandle::New(); |
| 475 mojom::URLLoaderClientPtr url_loader_client_ptr; | 482 mojom::URLLoaderClientPtr url_loader_client_ptr; |
| 476 preload_handle_->url_loader_client_request = | 483 preload_handle_->url_loader_client_request = |
| 477 mojo::MakeRequest(&url_loader_client_ptr); | 484 mojo::MakeRequest(&url_loader_client_ptr); |
| 478 auto url_loader_client = base::MakeUnique<DelegatingURLLoaderClient>( | 485 auto url_loader_client = base::MakeUnique<DelegatingURLLoaderClient>( |
| 479 std::move(url_loader_client_ptr)); | 486 std::move(url_loader_client_ptr), std::move(on_response)); |
| 480 mojom::URLLoaderClientAssociatedPtrInfo url_loader_client_associated_ptr_info; | 487 mojom::URLLoaderClientAssociatedPtrInfo url_loader_client_associated_ptr_info; |
| 481 url_loader_client->Bind(&url_loader_client_associated_ptr_info, | 488 url_loader_client->Bind(&url_loader_client_associated_ptr_info, |
| 482 url_loader_factory.associated_group()); | 489 url_loader_factory.associated_group()); |
| 483 mojom::URLLoaderAssociatedPtr url_loader_associated_ptr; | 490 mojom::URLLoaderAssociatedPtr url_loader_associated_ptr; |
| 484 | 491 |
| 485 url_loader_factory->CreateLoaderAndStart( | 492 url_loader_factory->CreateLoaderAndStart( |
| 486 mojo::MakeRequest(&url_loader_associated_ptr, | 493 mojo::MakeRequest(&url_loader_associated_ptr, |
| 487 url_loader_factory.associated_group()), | 494 url_loader_factory.associated_group()), |
| 488 original_info->GetRouteID(), request_id, request, | 495 original_info->GetRouteID(), request_id, request, |
| 489 std::move(url_loader_client_associated_ptr_info)); | 496 std::move(url_loader_client_associated_ptr_info)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 510 ServiceWorkerVersion* version, | 517 ServiceWorkerVersion* version, |
| 511 int event_finish_id, | 518 int event_finish_id, |
| 512 scoped_refptr<URLLoaderAssets> url_loader_assets, | 519 scoped_refptr<URLLoaderAssets> url_loader_assets, |
| 513 ServiceWorkerStatusCode status, | 520 ServiceWorkerStatusCode status, |
| 514 base::Time dispatch_event_time) { | 521 base::Time dispatch_event_time) { |
| 515 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT, | 522 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT, |
| 516 dispatch_event_time); | 523 dispatch_event_time); |
| 517 } | 524 } |
| 518 | 525 |
| 519 } // namespace content | 526 } // namespace content |
| OLD | NEW |