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" |
11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
12 #include "base/time/time.h" | 12 #include "base/time/time.h" |
13 #include "base/trace_event/trace_event.h" | 13 #include "base/trace_event/trace_event.h" |
14 #include "content/browser/devtools/service_worker_devtools_agent_host.h" | 14 #include "content/browser/devtools/service_worker_devtools_agent_host.h" |
15 #include "content/browser/devtools/service_worker_devtools_manager.h" | 15 #include "content/browser/devtools/service_worker_devtools_manager.h" |
16 #include "content/browser/loader/resource_dispatcher_host_impl.h" | 16 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
17 #include "content/browser/loader/resource_request_info_impl.h" | 17 #include "content/browser/loader/resource_request_info_impl.h" |
18 #include "content/browser/loader/resource_requester_info.h" | 18 #include "content/browser/loader/resource_requester_info.h" |
19 #include "content/browser/loader/url_loader_factory_impl.h" | 19 #include "content/browser/loader/url_loader_factory_impl.h" |
20 #include "content/browser/service_worker/embedded_worker_status.h" | 20 #include "content/browser/service_worker/embedded_worker_status.h" |
21 #include "content/browser/service_worker/service_worker_metrics.h" | 21 #include "content/browser/service_worker/service_worker_metrics.h" |
22 #include "content/browser/service_worker/service_worker_version.h" | 22 #include "content/browser/service_worker/service_worker_version.h" |
23 #include "content/common/service_worker/service_worker_event_dispatcher.mojom.h" | 23 #include "content/common/service_worker/service_worker_event_dispatcher.mojom.h" |
24 #include "content/common/service_worker/service_worker_messages.h" | 24 #include "content/common/service_worker/service_worker_messages.h" |
25 #include "content/common/service_worker/service_worker_status_code.h" | 25 #include "content/common/service_worker/service_worker_status_code.h" |
26 #include "content/common/service_worker/service_worker_types.h" | 26 #include "content/common/service_worker/service_worker_types.h" |
27 #include "content/common/service_worker/service_worker_utils.h" | 27 #include "content/common/service_worker/service_worker_utils.h" |
28 #include "content/public/browser/browser_thread.h" | 28 #include "content/public/browser/browser_thread.h" |
29 #include "content/public/common/browser_side_navigation_policy.h" | 29 #include "content/public/common/browser_side_navigation_policy.h" |
30 #include "mojo/public/cpp/bindings/associated_binding.h" | |
31 #include "mojo/public/cpp/bindings/binding.h" | 30 #include "mojo/public/cpp/bindings/binding.h" |
32 #include "net/base/request_priority.h" | 31 #include "net/base/request_priority.h" |
33 #include "net/http/http_util.h" | 32 #include "net/http/http_util.h" |
34 #include "net/log/net_log.h" | 33 #include "net/log/net_log.h" |
35 #include "net/log/net_log_capture_mode.h" | 34 #include "net/log/net_log_capture_mode.h" |
36 #include "net/log/net_log_event_type.h" | 35 #include "net/log/net_log_event_type.h" |
37 #include "net/url_request/url_request.h" | 36 #include "net/url_request/url_request.h" |
38 | 37 |
39 namespace content { | 38 namespace content { |
40 | 39 |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 client_->OnUploadProgress(current_position, total_size, ack_callback); | 150 client_->OnUploadProgress(current_position, total_size, ack_callback); |
152 } | 151 } |
153 void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override { | 152 void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override { |
154 client_->OnReceiveCachedMetadata(data); | 153 client_->OnReceiveCachedMetadata(data); |
155 } | 154 } |
156 void OnTransferSizeUpdated(int32_t transfer_size_diff) override { | 155 void OnTransferSizeUpdated(int32_t transfer_size_diff) override { |
157 client_->OnTransferSizeUpdated(transfer_size_diff); | 156 client_->OnTransferSizeUpdated(transfer_size_diff); |
158 } | 157 } |
159 void OnReceiveResponse( | 158 void OnReceiveResponse( |
160 const ResourceResponseHead& head, | 159 const ResourceResponseHead& head, |
161 mojom::DownloadedTempFileAssociatedPtrInfo downloaded_file) override { | 160 mojom::DownloadedTempFilePtr downloaded_file) override { |
162 client_->OnReceiveResponse(head, std::move(downloaded_file)); | 161 client_->OnReceiveResponse(head, std::move(downloaded_file)); |
163 DCHECK(on_response_); | 162 DCHECK(on_response_); |
164 std::move(on_response_).Run(); | 163 std::move(on_response_).Run(); |
165 AddDevToolsCallback( | 164 AddDevToolsCallback( |
166 base::Bind(&NotifyNavigationPreloadResponseReceivedOnUI, url_, head)); | 165 base::Bind(&NotifyNavigationPreloadResponseReceivedOnUI, url_, head)); |
167 } | 166 } |
168 void OnReceiveRedirect(const net::RedirectInfo& redirect_info, | 167 void OnReceiveRedirect(const net::RedirectInfo& redirect_info, |
169 const ResourceResponseHead& head) override { | 168 const ResourceResponseHead& head) override { |
170 client_->OnReceiveRedirect(redirect_info, head); | 169 client_->OnReceiveRedirect(redirect_info, head); |
171 } | 170 } |
172 void OnStartLoadingResponseBody( | 171 void OnStartLoadingResponseBody( |
173 mojo::ScopedDataPipeConsumerHandle body) override { | 172 mojo::ScopedDataPipeConsumerHandle body) override { |
174 client_->OnStartLoadingResponseBody(std::move(body)); | 173 client_->OnStartLoadingResponseBody(std::move(body)); |
175 } | 174 } |
176 void OnComplete( | 175 void OnComplete( |
177 const ResourceRequestCompletionStatus& completion_status) override { | 176 const ResourceRequestCompletionStatus& completion_status) override { |
178 client_->OnComplete(completion_status); | 177 client_->OnComplete(completion_status); |
179 completed_ = true; | 178 completed_ = true; |
180 AddDevToolsCallback( | 179 AddDevToolsCallback( |
181 base::Bind(&NotifyNavigationPreloadCompletedOnUI, completion_status)); | 180 base::Bind(&NotifyNavigationPreloadCompletedOnUI, completion_status)); |
182 } | 181 } |
183 | 182 |
184 void Bind(mojom::URLLoaderClientAssociatedPtrInfo* ptr_info) { | 183 void Bind(mojom::URLLoaderClientPtr* ptr_info) { binding_.Bind(ptr_info); } |
185 binding_.Bind(ptr_info); | |
186 } | |
187 | 184 |
188 private: | 185 private: |
189 void MayBeRunDevToolsCallbacks() { | 186 void MayBeRunDevToolsCallbacks() { |
190 if (!worker_id_) | 187 if (!worker_id_) |
191 return; | 188 return; |
192 while (!devtools_callbacks.empty()) { | 189 while (!devtools_callbacks.empty()) { |
193 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 190 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
194 base::Bind(std::move(devtools_callbacks.front()), | 191 base::Bind(std::move(devtools_callbacks.front()), |
195 *worker_id_, devtools_request_id_)); | 192 *worker_id_, devtools_request_id_)); |
196 devtools_callbacks.pop(); | 193 devtools_callbacks.pop(); |
197 } | 194 } |
198 } | 195 } |
199 void AddDevToolsCallback( | 196 void AddDevToolsCallback( |
200 base::Callback<void(const WorkerId&, const std::string&)> callback) { | 197 base::Callback<void(const WorkerId&, const std::string&)> callback) { |
201 devtools_callbacks.push(callback); | 198 devtools_callbacks.push(callback); |
202 MayBeRunDevToolsCallbacks(); | 199 MayBeRunDevToolsCallbacks(); |
203 } | 200 } |
204 | 201 |
205 mojo::AssociatedBinding<mojom::URLLoaderClient> binding_; | 202 mojo::Binding<mojom::URLLoaderClient> binding_; |
206 mojom::URLLoaderClientPtr client_; | 203 mojom::URLLoaderClientPtr client_; |
207 base::OnceClosure on_response_; | 204 base::OnceClosure on_response_; |
208 bool completed_ = false; | 205 bool completed_ = false; |
209 const GURL url_; | 206 const GURL url_; |
210 | 207 |
211 base::Optional<std::pair<int, int>> worker_id_; | 208 base::Optional<std::pair<int, int>> worker_id_; |
212 std::string devtools_request_id_; | 209 std::string devtools_request_id_; |
213 std::queue<base::Callback<void(const WorkerId&, const std::string&)>> | 210 std::queue<base::Callback<void(const WorkerId&, const std::string&)>> |
214 devtools_callbacks; | 211 devtools_callbacks; |
215 DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoaderClient); | 212 DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoaderClient); |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
575 | 572 |
576 const int request_id = ResourceDispatcherHostImpl::Get()->MakeRequestID(); | 573 const int request_id = ResourceDispatcherHostImpl::Get()->MakeRequestID(); |
577 DCHECK_LT(request_id, -1); | 574 DCHECK_LT(request_id, -1); |
578 | 575 |
579 preload_handle_ = mojom::FetchEventPreloadHandle::New(); | 576 preload_handle_ = mojom::FetchEventPreloadHandle::New(); |
580 mojom::URLLoaderClientPtr url_loader_client_ptr; | 577 mojom::URLLoaderClientPtr url_loader_client_ptr; |
581 preload_handle_->url_loader_client_request = | 578 preload_handle_->url_loader_client_request = |
582 mojo::MakeRequest(&url_loader_client_ptr); | 579 mojo::MakeRequest(&url_loader_client_ptr); |
583 auto url_loader_client = base::MakeUnique<DelegatingURLLoaderClient>( | 580 auto url_loader_client = base::MakeUnique<DelegatingURLLoaderClient>( |
584 std::move(url_loader_client_ptr), std::move(on_response), request); | 581 std::move(url_loader_client_ptr), std::move(on_response), request); |
585 mojom::URLLoaderClientAssociatedPtrInfo url_loader_client_associated_ptr_info; | 582 mojom::URLLoaderClientPtr url_loader_client_ptr_to_pass; |
586 url_loader_client->Bind(&url_loader_client_associated_ptr_info); | 583 url_loader_client->Bind(&url_loader_client_ptr_to_pass); |
587 mojom::URLLoaderAssociatedPtr url_loader_associated_ptr; | 584 mojom::URLLoaderAssociatedPtr url_loader_associated_ptr; |
588 | 585 |
589 url_loader_factory->CreateLoaderAndStart( | 586 url_loader_factory->CreateLoaderAndStart( |
590 mojo::MakeRequest(&url_loader_associated_ptr), | 587 mojo::MakeRequest(&url_loader_associated_ptr), |
591 original_info->GetRouteID(), request_id, request, | 588 original_info->GetRouteID(), request_id, request, |
592 std::move(url_loader_client_associated_ptr_info)); | 589 std::move(url_loader_client_ptr_to_pass)); |
593 | 590 |
594 std::unique_ptr<DelegatingURLLoader> url_loader( | 591 std::unique_ptr<DelegatingURLLoader> url_loader( |
595 base::MakeUnique<DelegatingURLLoader>( | 592 base::MakeUnique<DelegatingURLLoader>( |
596 std::move(url_loader_associated_ptr))); | 593 std::move(url_loader_associated_ptr))); |
597 preload_handle_->url_loader = url_loader->CreateInterfacePtrAndBind(); | 594 preload_handle_->url_loader = url_loader->CreateInterfacePtrAndBind(); |
598 url_loader_assets_ = | 595 url_loader_assets_ = |
599 new URLLoaderAssets(std::move(url_loader_factory), std::move(url_loader), | 596 new URLLoaderAssets(std::move(url_loader_factory), std::move(url_loader), |
600 std::move(url_loader_client)); | 597 std::move(url_loader_client)); |
601 return true; | 598 return true; |
602 } | 599 } |
(...skipping 10 matching lines...) Expand all Loading... |
613 ServiceWorkerVersion* version, | 610 ServiceWorkerVersion* version, |
614 int event_finish_id, | 611 int event_finish_id, |
615 scoped_refptr<URLLoaderAssets> url_loader_assets, | 612 scoped_refptr<URLLoaderAssets> url_loader_assets, |
616 ServiceWorkerStatusCode status, | 613 ServiceWorkerStatusCode status, |
617 base::Time dispatch_event_time) { | 614 base::Time dispatch_event_time) { |
618 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT, | 615 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT, |
619 dispatch_event_time); | 616 dispatch_event_time); |
620 } | 617 } |
621 | 618 |
622 } // namespace content | 619 } // namespace content |
OLD | NEW |