| 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 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 // URLLoaderFactory. In order to get the right URLLoaderFactory it |
| 63 // builds a vector of URLLoaderRequestHandler's and successively calls | 63 // builds a vector of URLLoaderRequestHandler's and successively calls |
| 64 // MaybeCreateLoaderFactory on each until the request is successfully | 64 // MaybeCreateLoaderFactory on each until the request is successfully |
| 65 // handled. The same sequence may be performed multiple times when | 65 // handled. The same sequence may be performed multiple times when |
| 66 // redirects happen. | 66 // redirects happen. |
| 67 class NavigationURLLoaderNetworkService::URLLoaderRequestController { | 67 class NavigationURLLoaderNetworkService::URLLoaderRequestController { |
| 68 public: | 68 public: |
| 69 URLLoaderRequestController(std::unique_ptr<ResourceRequest> resource_request, | 69 URLLoaderRequestController( |
| 70 ResourceContext* resource_context) | 70 std::unique_ptr<ResourceRequest> resource_request, |
| 71 ResourceContext* resource_context, |
| 72 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter) |
| 71 : resource_request_(std::move(resource_request)), | 73 : resource_request_(std::move(resource_request)), |
| 72 resource_context_(resource_context), | 74 resource_context_(resource_context), |
| 73 network_factory_(nullptr) {} | 75 url_loader_factory_getter_(url_loader_factory_getter) {} |
| 74 | 76 |
| 75 virtual ~URLLoaderRequestController() { | 77 virtual ~URLLoaderRequestController() { |
| 76 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 78 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 77 } | 79 } |
| 78 | 80 |
| 79 void Start( | 81 void Start( |
| 80 ServiceWorkerNavigationHandleCore* service_worker_navigation_handle_core, | 82 ServiceWorkerNavigationHandleCore* service_worker_navigation_handle_core, |
| 81 AppCacheNavigationHandleCore* appcache_handle_core, | 83 AppCacheNavigationHandleCore* appcache_handle_core, |
| 82 std::unique_ptr<NavigationRequestInfo> request_info, | 84 std::unique_ptr<NavigationRequestInfo> request_info, |
| 83 mojom::URLLoaderFactoryPtrInfo factory_for_webui, | 85 mojom::URLLoaderFactoryPtrInfo factory_for_webui, |
| 84 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter, | |
| 85 const base::Callback<WebContents*(void)>& web_contents_getter, | 86 const base::Callback<WebContents*(void)>& web_contents_getter, |
| 86 mojom::URLLoaderAssociatedRequest url_loader_request, | 87 mojom::URLLoaderAssociatedRequest url_loader_request, |
| 87 mojom::URLLoaderClientPtr url_loader_client_ptr, | 88 mojom::URLLoaderClientPtr url_loader_client_ptr, |
| 88 std::unique_ptr<service_manager::Connector> connector) { | 89 std::unique_ptr<service_manager::Connector> connector) { |
| 89 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 90 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 90 const ResourceType resource_type = request_info->is_main_frame | 91 const ResourceType resource_type = request_info->is_main_frame |
| 91 ? RESOURCE_TYPE_MAIN_FRAME | 92 ? RESOURCE_TYPE_MAIN_FRAME |
| 92 : RESOURCE_TYPE_SUB_FRAME; | 93 : RESOURCE_TYPE_SUB_FRAME; |
| 93 | 94 |
| 94 if (resource_request_->request_body) { | 95 if (resource_request_->request_body) { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 125 request_info->are_ancestors_secure, | 126 request_info->are_ancestors_secure, |
| 126 request_info->common_params.post_data, web_contents_getter); | 127 request_info->common_params.post_data, web_contents_getter); |
| 127 if (service_worker_handler) | 128 if (service_worker_handler) |
| 128 handlers_.push_back(std::move(service_worker_handler)); | 129 handlers_.push_back(std::move(service_worker_handler)); |
| 129 } | 130 } |
| 130 | 131 |
| 131 if (appcache_handle_core) { | 132 if (appcache_handle_core) { |
| 132 // TODO: add appcache code here. | 133 // TODO: add appcache code here. |
| 133 } | 134 } |
| 134 | 135 |
| 135 DCHECK(!network_factory_); | |
| 136 network_factory_ = url_loader_factory_getter->GetNetworkFactory()->get(); | |
| 137 | |
| 138 Restart(std::move(url_loader_request), std::move(url_loader_client_ptr)); | 136 Restart(std::move(url_loader_request), std::move(url_loader_client_ptr)); |
| 139 } | 137 } |
| 140 | 138 |
| 141 // This could be called multiple times. | 139 // This could be called multiple times. |
| 142 void Restart(mojom::URLLoaderAssociatedRequest url_loader_request, | 140 void Restart(mojom::URLLoaderAssociatedRequest url_loader_request, |
| 143 mojom::URLLoaderClientPtr url_loader_client_ptr) { | 141 mojom::URLLoaderClientPtr url_loader_client_ptr) { |
| 144 url_loader_request_ = std::move(url_loader_request); | 142 url_loader_request_ = std::move(url_loader_request); |
| 145 url_loader_client_ptr_ = std::move(url_loader_client_ptr); | 143 url_loader_client_ptr_ = std::move(url_loader_client_ptr); |
| 146 handler_index_ = 0; | 144 handler_index_ = 0; |
| 147 MaybeStartLoader(nullptr); | 145 MaybeStartLoader(nullptr); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 160 | 158 |
| 161 if (handler_index_ < handlers_.size()) { | 159 if (handler_index_ < handlers_.size()) { |
| 162 handlers_[handler_index_++]->MaybeCreateLoaderFactory( | 160 handlers_[handler_index_++]->MaybeCreateLoaderFactory( |
| 163 *resource_request_, resource_context_, | 161 *resource_request_, resource_context_, |
| 164 base::BindOnce(&URLLoaderRequestController::MaybeStartLoader, | 162 base::BindOnce(&URLLoaderRequestController::MaybeStartLoader, |
| 165 base::Unretained(this))); | 163 base::Unretained(this))); |
| 166 return; | 164 return; |
| 167 } | 165 } |
| 168 | 166 |
| 169 DCHECK_EQ(handlers_.size(), handler_index_); | 167 DCHECK_EQ(handlers_.size(), handler_index_); |
| 170 DCHECK(network_factory_ != nullptr); | 168 if (resource_request_->url.SchemeIs(url::kBlobScheme)) { |
| 171 MaybeStartLoader(network_factory_); | 169 factory = url_loader_factory_getter_->GetBlobFactory()->get(); |
| 170 } else { |
| 171 factory = url_loader_factory_getter_->GetNetworkFactory()->get(); |
| 172 } |
| 173 MaybeStartLoader(factory); |
| 172 } | 174 } |
| 173 | 175 |
| 174 private: | 176 private: |
| 175 std::vector<std::unique_ptr<URLLoaderRequestHandler>> handlers_; | 177 std::vector<std::unique_ptr<URLLoaderRequestHandler>> handlers_; |
| 176 size_t handler_index_ = 0; | 178 size_t handler_index_ = 0; |
| 177 | 179 |
| 178 std::unique_ptr<ResourceRequest> resource_request_; | 180 std::unique_ptr<ResourceRequest> resource_request_; |
| 179 ResourceContext* resource_context_; | 181 ResourceContext* resource_context_; |
| 180 | 182 |
| 181 // The factory for doing a vanilla network request, called when | 183 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter_; |
| 182 // any of other request handlers handle the given request. | |
| 183 mojom::URLLoaderFactory* network_factory_; | |
| 184 | 184 |
| 185 // Kept around until we create a loader. | 185 // Kept around until we create a loader. |
| 186 mojom::URLLoaderAssociatedRequest url_loader_request_; | 186 mojom::URLLoaderAssociatedRequest url_loader_request_; |
| 187 mojom::URLLoaderClientPtr url_loader_client_ptr_; | 187 mojom::URLLoaderClientPtr url_loader_client_ptr_; |
| 188 | 188 |
| 189 DISALLOW_COPY_AND_ASSIGN(URLLoaderRequestController); | 189 DISALLOW_COPY_AND_ASSIGN(URLLoaderRequestController); |
| 190 }; | 190 }; |
| 191 | 191 |
| 192 NavigationURLLoaderNetworkService::NavigationURLLoaderNetworkService( | 192 NavigationURLLoaderNetworkService::NavigationURLLoaderNetworkService( |
| 193 ResourceContext* resource_context, | 193 ResourceContext* resource_context, |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 242 mojom::URLLoaderClientPtr url_loader_client_ptr_to_pass; | 242 mojom::URLLoaderClientPtr url_loader_client_ptr_to_pass; |
| 243 binding_.Bind(mojo::MakeRequest(&url_loader_client_ptr_to_pass)); | 243 binding_.Bind(mojo::MakeRequest(&url_loader_client_ptr_to_pass)); |
| 244 | 244 |
| 245 // Check if a web UI scheme wants to handle this request. | 245 // Check if a web UI scheme wants to handle this request. |
| 246 mojom::URLLoaderFactoryPtrInfo factory_for_webui; | 246 mojom::URLLoaderFactoryPtrInfo factory_for_webui; |
| 247 const auto& schemes = URLDataManagerBackend::GetWebUISchemes(); | 247 const auto& schemes = URLDataManagerBackend::GetWebUISchemes(); |
| 248 if (std::find(schemes.begin(), schemes.end(), new_request->url.scheme()) != | 248 if (std::find(schemes.begin(), schemes.end(), new_request->url.scheme()) != |
| 249 schemes.end()) { | 249 schemes.end()) { |
| 250 FrameTreeNode* frame_tree_node = | 250 FrameTreeNode* frame_tree_node = |
| 251 FrameTreeNode::GloballyFindByID(frame_tree_node_id); | 251 FrameTreeNode::GloballyFindByID(frame_tree_node_id); |
| 252 factory_for_webui = GetWebUIURLLoader(frame_tree_node).PassInterface(); | 252 factory_for_webui = CreateWebUIURLLoader(frame_tree_node).PassInterface(); |
| 253 } | 253 } |
| 254 | 254 |
| 255 g_next_request_id--; | 255 g_next_request_id--; |
| 256 | 256 |
| 257 DCHECK(!request_controller_); | 257 DCHECK(!request_controller_); |
| 258 request_controller_ = base::MakeUnique<URLLoaderRequestController>( | 258 request_controller_ = base::MakeUnique<URLLoaderRequestController>( |
| 259 std::move(new_request), resource_context); | 259 std::move(new_request), resource_context, |
| 260 static_cast<StoragePartitionImpl*>(storage_partition) |
| 261 ->url_loader_factory_getter()); |
| 260 BrowserThread::PostTask( | 262 BrowserThread::PostTask( |
| 261 BrowserThread::IO, FROM_HERE, | 263 BrowserThread::IO, FROM_HERE, |
| 262 base::Bind( | 264 base::Bind( |
| 263 &URLLoaderRequestController::Start, | 265 &URLLoaderRequestController::Start, |
| 264 base::Unretained(request_controller_.get()), | 266 base::Unretained(request_controller_.get()), |
| 265 service_worker_navigation_handle | 267 service_worker_navigation_handle |
| 266 ? service_worker_navigation_handle->core() | 268 ? service_worker_navigation_handle->core() |
| 267 : nullptr, | 269 : nullptr, |
| 268 appcache_handle ? appcache_handle->core() : nullptr, | 270 appcache_handle ? appcache_handle->core() : nullptr, |
| 269 base::Passed(std::move(request_info)), | 271 base::Passed(std::move(request_info)), |
| 270 base::Passed(std::move(factory_for_webui)), | 272 base::Passed(std::move(factory_for_webui)), |
| 271 static_cast<StoragePartitionImpl*>(storage_partition) | |
| 272 ->url_loader_factory_getter(), | |
| 273 base::Bind(&GetWebContentsFromFrameTreeNodeID, frame_tree_node_id), | 273 base::Bind(&GetWebContentsFromFrameTreeNodeID, frame_tree_node_id), |
| 274 base::Passed(std::move(loader_associated_request)), | 274 base::Passed(std::move(loader_associated_request)), |
| 275 base::Passed(std::move(url_loader_client_ptr_to_pass)), | 275 base::Passed(std::move(url_loader_client_ptr_to_pass)), |
| 276 base::Passed(ServiceManagerConnection::GetForProcess() | 276 base::Passed(ServiceManagerConnection::GetForProcess() |
| 277 ->GetConnector() | 277 ->GetConnector() |
| 278 ->Clone()))); | 278 ->Clone()))); |
| 279 } | 279 } |
| 280 | 280 |
| 281 NavigationURLLoaderNetworkService::~NavigationURLLoaderNetworkService() { | 281 NavigationURLLoaderNetworkService::~NavigationURLLoaderNetworkService() { |
| 282 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, | 282 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted", | 351 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted", |
| 352 this, "&NavigationURLLoaderNetworkService", this, | 352 this, "&NavigationURLLoaderNetworkService", this, |
| 353 "success", false); | 353 "success", false); |
| 354 | 354 |
| 355 delegate_->OnRequestFailed(completion_status.exists_in_cache, | 355 delegate_->OnRequestFailed(completion_status.exists_in_cache, |
| 356 completion_status.error_code); | 356 completion_status.error_code); |
| 357 } | 357 } |
| 358 } | 358 } |
| 359 | 359 |
| 360 } // namespace content | 360 } // namespace content |
| OLD | NEW |