Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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/loader/navigation_url_loader_network_service.h" | 5 #include "content/browser/loader/navigation_url_loader_network_service.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 52 if (!frame_tree_node) | 52 if (!frame_tree_node) |
| 53 return nullptr; | 53 return nullptr; |
| 54 | 54 |
| 55 return WebContentsImpl::FromFrameTreeNode(frame_tree_node); | 55 return WebContentsImpl::FromFrameTreeNode(frame_tree_node); |
| 56 } | 56 } |
| 57 | 57 |
| 58 } // namespace | 58 } // namespace |
| 59 | 59 |
| 60 // Kept around during the lifetime of the navigation request, and is | 60 // Kept around during the lifetime of the navigation request, and is |
| 61 // responsible for dispatching a ResourceRequest to the appropriate | 61 // responsible for dispatching a ResourceRequest to the appropriate |
| 62 // URLLoaderFactory. In order to get the right URLLoaderFactory it | 62 // URLLoader. In order to get the right URLLoader it builds a vector |
| 63 // builds a vector of URLLoaderRequestHandler's and successively calls | 63 // of URLLoaderRequestHandler's and successively calls MaybeCreateLoader |
| 64 // MaybeCreateLoaderFactory on each until the request is successfully | 64 // on each until the request is successfully handled. The same sequence |
| 65 // handled. The same sequence may be performed multiple times when | 65 // may be performed multiple times when redirects happen. |
| 66 // redirects happen. | |
| 67 class NavigationURLLoaderNetworkService::URLLoaderRequestController { | 66 class NavigationURLLoaderNetworkService::URLLoaderRequestController { |
| 68 public: | 67 public: |
| 69 URLLoaderRequestController( | 68 URLLoaderRequestController( |
| 70 std::unique_ptr<ResourceRequest> resource_request, | 69 std::unique_ptr<ResourceRequest> resource_request, |
| 71 ResourceContext* resource_context, | 70 ResourceContext* resource_context, |
| 72 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter) | 71 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter) |
| 73 : resource_request_(std::move(resource_request)), | 72 : resource_request_(std::move(resource_request)), |
| 74 resource_context_(resource_context), | 73 resource_context_(resource_context), |
| 75 url_loader_factory_getter_(url_loader_factory_getter) {} | 74 url_loader_factory_getter_(url_loader_factory_getter) {} |
| 76 | 75 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 135 | 134 |
| 136 Restart(std::move(url_loader_request), std::move(url_loader_client_ptr)); | 135 Restart(std::move(url_loader_request), std::move(url_loader_client_ptr)); |
| 137 } | 136 } |
| 138 | 137 |
| 139 // This could be called multiple times. | 138 // This could be called multiple times. |
| 140 void Restart(mojom::URLLoaderAssociatedRequest url_loader_request, | 139 void Restart(mojom::URLLoaderAssociatedRequest url_loader_request, |
| 141 mojom::URLLoaderClientPtr url_loader_client_ptr) { | 140 mojom::URLLoaderClientPtr url_loader_client_ptr) { |
| 142 url_loader_request_ = std::move(url_loader_request); | 141 url_loader_request_ = std::move(url_loader_request); |
| 143 url_loader_client_ptr_ = std::move(url_loader_client_ptr); | 142 url_loader_client_ptr_ = std::move(url_loader_client_ptr); |
| 144 handler_index_ = 0; | 143 handler_index_ = 0; |
| 145 MaybeStartLoader(nullptr); | 144 MaybeStartLoader(StartLoaderCallback()); |
| 146 } | 145 } |
| 147 | 146 |
| 148 void MaybeStartLoader(mojom::URLLoaderFactory* factory) { | 147 void MaybeStartLoader(StartLoaderCallback start_loader_callback) { |
|
michaeln
2017/06/07 02:28:22
it's turtles all the way down!
MaybeCreateLoader
| |
| 149 DCHECK(url_loader_client_ptr_.is_bound()); | 148 DCHECK(url_loader_client_ptr_.is_bound()); |
| 150 | 149 |
| 151 if (factory) { | 150 if (start_loader_callback) { |
| 152 factory->CreateLoaderAndStart( | 151 std::move(start_loader_callback) |
| 153 std::move(url_loader_request_), 0 /* routing_id? */, | 152 .Run(std::move(url_loader_request_), |
| 154 0 /* request_id? */, mojom::kURLLoadOptionSendSSLInfo, | 153 std::move(url_loader_client_ptr_)); |
| 155 *resource_request_, std::move(url_loader_client_ptr_)); | |
| 156 return; | 154 return; |
| 157 } | 155 } |
| 158 | 156 |
| 159 if (handler_index_ < handlers_.size()) { | 157 if (handler_index_ < handlers_.size()) { |
| 160 handlers_[handler_index_++]->MaybeCreateLoaderFactory( | 158 handlers_[handler_index_++]->MaybeCreateLoader( |
| 161 *resource_request_, resource_context_, | 159 *resource_request_, resource_context_, |
| 162 base::BindOnce(&URLLoaderRequestController::MaybeStartLoader, | 160 base::BindOnce(&URLLoaderRequestController::MaybeStartLoader, |
| 163 base::Unretained(this))); | 161 base::Unretained(this))); |
| 164 return; | 162 return; |
| 165 } | 163 } |
| 166 | 164 |
| 165 mojom::URLLoaderFactory* factory = nullptr; | |
| 167 DCHECK_EQ(handlers_.size(), handler_index_); | 166 DCHECK_EQ(handlers_.size(), handler_index_); |
| 168 if (resource_request_->url.SchemeIs(url::kBlobScheme)) { | 167 if (resource_request_->url.SchemeIs(url::kBlobScheme)) { |
| 169 factory = url_loader_factory_getter_->GetBlobFactory()->get(); | 168 factory = url_loader_factory_getter_->GetBlobFactory()->get(); |
| 170 } else { | 169 } else { |
| 171 factory = url_loader_factory_getter_->GetNetworkFactory()->get(); | 170 factory = url_loader_factory_getter_->GetNetworkFactory()->get(); |
| 172 } | 171 } |
| 173 MaybeStartLoader(factory); | 172 factory->CreateLoaderAndStart( |
| 173 std::move(url_loader_request_), 0 /* routing_id? */, | |
| 174 0 /* request_id? */, mojom::kURLLoadOptionSendSSLInfo, | |
| 175 *resource_request_, std::move(url_loader_client_ptr_)); | |
| 174 } | 176 } |
| 175 | 177 |
| 176 private: | 178 private: |
| 177 std::vector<std::unique_ptr<URLLoaderRequestHandler>> handlers_; | 179 std::vector<std::unique_ptr<URLLoaderRequestHandler>> handlers_; |
| 178 size_t handler_index_ = 0; | 180 size_t handler_index_ = 0; |
| 179 | 181 |
| 180 std::unique_ptr<ResourceRequest> resource_request_; | 182 std::unique_ptr<ResourceRequest> resource_request_; |
| 181 ResourceContext* resource_context_; | 183 ResourceContext* resource_context_; |
| 182 | 184 |
| 183 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter_; | 185 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter_; |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 351 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted", | 353 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted", |
| 352 this, "&NavigationURLLoaderNetworkService", this, | 354 this, "&NavigationURLLoaderNetworkService", this, |
| 353 "success", false); | 355 "success", false); |
| 354 | 356 |
| 355 delegate_->OnRequestFailed(completion_status.exists_in_cache, | 357 delegate_->OnRequestFailed(completion_status.exists_in_cache, |
| 356 completion_status.error_code); | 358 completion_status.error_code); |
| 357 } | 359 } |
| 358 } | 360 } |
| 359 | 361 |
| 360 } // namespace content | 362 } // namespace content |
| OLD | NEW |