| 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 OnUploadProgress(int64_t current_position, | 93 void OnUploadProgress(int64_t current_position, |
| 91 int64_t total_size, | 94 int64_t total_size, |
| 92 const base::Closure& ack_callback) override { | 95 const base::Closure& ack_callback) override { |
| 93 client_->OnUploadProgress(current_position, total_size, ack_callback); | 96 client_->OnUploadProgress(current_position, total_size, ack_callback); |
| 94 } | 97 } |
| 95 void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override { | 98 void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override { |
| 96 client_->OnReceiveCachedMetadata(data); | 99 client_->OnReceiveCachedMetadata(data); |
| 97 } | 100 } |
| 98 void OnTransferSizeUpdated(int32_t transfer_size_diff) override { | 101 void OnTransferSizeUpdated(int32_t transfer_size_diff) override { |
| 99 client_->OnTransferSizeUpdated(transfer_size_diff); | 102 client_->OnTransferSizeUpdated(transfer_size_diff); |
| 100 } | 103 } |
| 101 void OnReceiveResponse( | 104 void OnReceiveResponse( |
| 102 const ResourceResponseHead& head, | 105 const ResourceResponseHead& head, |
| 103 mojom::DownloadedTempFileAssociatedPtrInfo downloaded_file) override { | 106 mojom::DownloadedTempFileAssociatedPtrInfo downloaded_file) override { |
| 104 client_->OnReceiveResponse(head, std::move(downloaded_file)); | 107 client_->OnReceiveResponse(head, std::move(downloaded_file)); |
| 108 DCHECK(on_response_); |
| 109 std::move(on_response_).Run(); |
| 105 } | 110 } |
| 106 void OnReceiveRedirect(const net::RedirectInfo& redirect_info, | 111 void OnReceiveRedirect(const net::RedirectInfo& redirect_info, |
| 107 const ResourceResponseHead& head) override { | 112 const ResourceResponseHead& head) override { |
| 108 client_->OnReceiveRedirect(redirect_info, head); | 113 client_->OnReceiveRedirect(redirect_info, head); |
| 109 } | 114 } |
| 110 void OnStartLoadingResponseBody( | 115 void OnStartLoadingResponseBody( |
| 111 mojo::ScopedDataPipeConsumerHandle body) override { | 116 mojo::ScopedDataPipeConsumerHandle body) override { |
| 112 client_->OnStartLoadingResponseBody(std::move(body)); | 117 client_->OnStartLoadingResponseBody(std::move(body)); |
| 113 } | 118 } |
| 114 void OnComplete( | 119 void OnComplete( |
| 115 const ResourceRequestCompletionStatus& completion_status) override { | 120 const ResourceRequestCompletionStatus& completion_status) override { |
| 116 client_->OnComplete(completion_status); | 121 client_->OnComplete(completion_status); |
| 117 completed_ = true; | 122 completed_ = true; |
| 118 } | 123 } |
| 119 | 124 |
| 120 void Bind(mojom::URLLoaderClientAssociatedPtrInfo* ptr_info, | 125 void Bind(mojom::URLLoaderClientAssociatedPtrInfo* ptr_info, |
| 121 mojo::AssociatedGroup* associated_group) { | 126 mojo::AssociatedGroup* associated_group) { |
| 122 binding_.Bind(ptr_info, associated_group); | 127 binding_.Bind(ptr_info, associated_group); |
| 123 } | 128 } |
| 124 | 129 |
| 125 private: | 130 private: |
| 126 mojo::AssociatedBinding<mojom::URLLoaderClient> binding_; | 131 mojo::AssociatedBinding<mojom::URLLoaderClient> binding_; |
| 127 mojom::URLLoaderClientPtr client_; | 132 mojom::URLLoaderClientPtr client_; |
| 133 base::OnceClosure on_response_; |
| 128 bool completed_ = false; | 134 bool completed_ = false; |
| 129 | 135 |
| 130 DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoaderClient); | 136 DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoaderClient); |
| 131 }; | 137 }; |
| 132 | 138 |
| 133 using EventType = ServiceWorkerMetrics::EventType; | 139 using EventType = ServiceWorkerMetrics::EventType; |
| 134 EventType ResourceTypeToEventType(ResourceType resource_type) { | 140 EventType ResourceTypeToEventType(ResourceType resource_type) { |
| 135 switch (resource_type) { | 141 switch (resource_type) { |
| 136 case RESOURCE_TYPE_MAIN_FRAME: | 142 case RESOURCE_TYPE_MAIN_FRAME: |
| 137 return EventType::FETCH_MAIN_FRAME; | 143 return EventType::FETCH_MAIN_FRAME; |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 400 net_log_.EndEvent( | 406 net_log_.EndEvent( |
| 401 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT, | 407 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT, |
| 402 base::Bind(&NetLogFetchEventCallback, status, fetch_result)); | 408 base::Bind(&NetLogFetchEventCallback, status, fetch_result)); |
| 403 | 409 |
| 404 FetchCallback fetch_callback = fetch_callback_; | 410 FetchCallback fetch_callback = fetch_callback_; |
| 405 scoped_refptr<ServiceWorkerVersion> version = version_; | 411 scoped_refptr<ServiceWorkerVersion> version = version_; |
| 406 fetch_callback.Run(status, fetch_result, response, version); | 412 fetch_callback.Run(status, fetch_result, response, version); |
| 407 } | 413 } |
| 408 | 414 |
| 409 bool ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( | 415 bool ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( |
| 410 net::URLRequest* original_request) { | 416 net::URLRequest* original_request, |
| 417 base::OnceClosure on_response) { |
| 411 if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME && | 418 if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME && |
| 412 resource_type_ != RESOURCE_TYPE_SUB_FRAME) { | 419 resource_type_ != RESOURCE_TYPE_SUB_FRAME) { |
| 413 return false; | 420 return false; |
| 414 } | 421 } |
| 415 if (!version_->navigation_preload_state().enabled) | 422 if (!version_->navigation_preload_state().enabled) |
| 416 return false; | 423 return false; |
| 417 // TODO(horo): Currently NavigationPreload doesn't support request body. | 424 // TODO(horo): Currently NavigationPreload doesn't support request body. |
| 418 if (!request_->blob_uuid.empty()) | 425 if (!request_->blob_uuid.empty()) |
| 419 return false; | 426 return false; |
| 420 | 427 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 original_request->extra_request_headers().ToString(); | 484 original_request->extra_request_headers().ToString(); |
| 478 | 485 |
| 479 const int request_id = ResourceDispatcherHostImpl::Get()->MakeRequestID(); | 486 const int request_id = ResourceDispatcherHostImpl::Get()->MakeRequestID(); |
| 480 DCHECK_LT(request_id, -1); | 487 DCHECK_LT(request_id, -1); |
| 481 | 488 |
| 482 preload_handle_ = mojom::FetchEventPreloadHandle::New(); | 489 preload_handle_ = mojom::FetchEventPreloadHandle::New(); |
| 483 mojom::URLLoaderClientPtr url_loader_client_ptr; | 490 mojom::URLLoaderClientPtr url_loader_client_ptr; |
| 484 preload_handle_->url_loader_client_request = | 491 preload_handle_->url_loader_client_request = |
| 485 mojo::MakeRequest(&url_loader_client_ptr); | 492 mojo::MakeRequest(&url_loader_client_ptr); |
| 486 auto url_loader_client = base::MakeUnique<DelegatingURLLoaderClient>( | 493 auto url_loader_client = base::MakeUnique<DelegatingURLLoaderClient>( |
| 487 std::move(url_loader_client_ptr)); | 494 std::move(url_loader_client_ptr), std::move(on_response)); |
| 488 mojom::URLLoaderClientAssociatedPtrInfo url_loader_client_associated_ptr_info; | 495 mojom::URLLoaderClientAssociatedPtrInfo url_loader_client_associated_ptr_info; |
| 489 url_loader_client->Bind(&url_loader_client_associated_ptr_info, | 496 url_loader_client->Bind(&url_loader_client_associated_ptr_info, |
| 490 url_loader_factory.associated_group()); | 497 url_loader_factory.associated_group()); |
| 491 mojom::URLLoaderAssociatedPtr url_loader_associated_ptr; | 498 mojom::URLLoaderAssociatedPtr url_loader_associated_ptr; |
| 492 | 499 |
| 493 url_loader_factory->CreateLoaderAndStart( | 500 url_loader_factory->CreateLoaderAndStart( |
| 494 mojo::MakeRequest(&url_loader_associated_ptr, | 501 mojo::MakeRequest(&url_loader_associated_ptr, |
| 495 url_loader_factory.associated_group()), | 502 url_loader_factory.associated_group()), |
| 496 original_info->GetRouteID(), request_id, request, | 503 original_info->GetRouteID(), request_id, request, |
| 497 std::move(url_loader_client_associated_ptr_info)); | 504 std::move(url_loader_client_associated_ptr_info)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 518 ServiceWorkerVersion* version, | 525 ServiceWorkerVersion* version, |
| 519 int event_finish_id, | 526 int event_finish_id, |
| 520 scoped_refptr<URLLoaderAssets> url_loader_assets, | 527 scoped_refptr<URLLoaderAssets> url_loader_assets, |
| 521 ServiceWorkerStatusCode status, | 528 ServiceWorkerStatusCode status, |
| 522 base::Time dispatch_event_time) { | 529 base::Time dispatch_event_time) { |
| 523 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT, | 530 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT, |
| 524 dispatch_event_time); | 531 dispatch_event_time); |
| 525 } | 532 } |
| 526 | 533 |
| 527 } // namespace content | 534 } // namespace content |
| OLD | NEW |