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 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::URLLoaderRequest url_loader_request, | 87 mojom::URLLoaderRequest 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) { |
| 95 AttachRequestBodyBlobDataHandles(resource_request_->request_body.get(), | 96 AttachRequestBodyBlobDataHandles(resource_request_->request_body.get(), |
| 96 resource_context_); | 97 resource_context_); |
| 97 } | 98 } |
| 98 | 99 |
| 99 // Requests to WebUI scheme won't get redirected to/from other schemes | 100 // Requests to WebUI scheme won't get redirected to/from other schemes |
| 100 // or be intercepted, so we just let it go here. | 101 // or be intercepted, so we just let it go here. |
| 101 if (factory_for_webui.is_valid()) { | 102 if (factory_for_webui.is_valid()) { |
| 102 mojom::URLLoaderFactoryPtr factory_ptr; | 103 mojom::URLLoaderFactoryPtr factory_ptr; |
| 103 factory_ptr.Bind(std::move(factory_for_webui)); | 104 factory_ptr.Bind(std::move(factory_for_webui)); |
| 104 factory_ptr->CreateLoaderAndStart( | 105 factory_ptr->CreateLoaderAndStart( |
| 105 std::move(url_loader_request), 0 /* routing_id? */, | 106 std::move(url_loader_request), 0 /* routing_id? */, |
| 106 0 /* request_id? */, mojom::kURLLoadOptionSendSSLInfo, | 107 0 /* request_id? */, mojom::kURLLoadOptionSendSSLInfo, |
| 107 *resource_request_, std::move(url_loader_client_ptr)); | 108 *resource_request_, std::move(url_loader_client_ptr)); |
| 108 return; | 109 return; |
| 109 } | 110 } |
|
kinuko
2017/05/30 06:27:32
Should we have blob url handling case here? ...hm,
jam
2017/05/30 15:54:18
yep, that's why I didn't put it here
| |
| 110 | 111 |
| 111 DCHECK(handlers_.empty()); | 112 DCHECK(handlers_.empty()); |
| 112 if (service_worker_navigation_handle_core) { | 113 if (service_worker_navigation_handle_core) { |
| 113 RequestContextFrameType frame_type = | 114 RequestContextFrameType frame_type = |
| 114 request_info->is_main_frame ? REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL | 115 request_info->is_main_frame ? REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL |
| 115 : REQUEST_CONTEXT_FRAME_TYPE_NESTED; | 116 : REQUEST_CONTEXT_FRAME_TYPE_NESTED; |
| 116 | 117 |
| 117 storage::BlobStorageContext* blob_storage_context = GetBlobStorageContext( | 118 storage::BlobStorageContext* blob_storage_context = GetBlobStorageContext( |
| 118 GetChromeBlobStorageContextForResourceContext(resource_context_)); | 119 GetChromeBlobStorageContextForResourceContext(resource_context_)); |
| 119 std::unique_ptr<URLLoaderRequestHandler> service_worker_handler = | 120 std::unique_ptr<URLLoaderRequestHandler> service_worker_handler = |
| 120 ServiceWorkerRequestHandler::InitializeForNavigationNetworkService( | 121 ServiceWorkerRequestHandler::InitializeForNavigationNetworkService( |
| 121 *resource_request_, resource_context_, | 122 *resource_request_, resource_context_, |
| 122 service_worker_navigation_handle_core, blob_storage_context, | 123 service_worker_navigation_handle_core, blob_storage_context, |
| 123 request_info->begin_params.skip_service_worker, resource_type, | 124 request_info->begin_params.skip_service_worker, resource_type, |
| 124 request_info->begin_params.request_context_type, frame_type, | 125 request_info->begin_params.request_context_type, frame_type, |
| 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::URLLoaderRequest url_loader_request, | 140 void Restart(mojom::URLLoaderRequest 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::URLLoaderRequest url_loader_request_; | 186 mojom::URLLoaderRequest 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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 241 mojom::URLLoaderClientPtr url_loader_client_ptr_to_pass; | 241 mojom::URLLoaderClientPtr url_loader_client_ptr_to_pass; |
| 242 binding_.Bind(mojo::MakeRequest(&url_loader_client_ptr_to_pass)); | 242 binding_.Bind(mojo::MakeRequest(&url_loader_client_ptr_to_pass)); |
| 243 | 243 |
| 244 // Check if a web UI scheme wants to handle this request. | 244 // Check if a web UI scheme wants to handle this request. |
| 245 mojom::URLLoaderFactoryPtrInfo factory_for_webui; | 245 mojom::URLLoaderFactoryPtrInfo factory_for_webui; |
| 246 const auto& schemes = URLDataManagerBackend::GetWebUISchemes(); | 246 const auto& schemes = URLDataManagerBackend::GetWebUISchemes(); |
| 247 if (std::find(schemes.begin(), schemes.end(), new_request->url.scheme()) != | 247 if (std::find(schemes.begin(), schemes.end(), new_request->url.scheme()) != |
| 248 schemes.end()) { | 248 schemes.end()) { |
| 249 FrameTreeNode* frame_tree_node = | 249 FrameTreeNode* frame_tree_node = |
| 250 FrameTreeNode::GloballyFindByID(frame_tree_node_id); | 250 FrameTreeNode::GloballyFindByID(frame_tree_node_id); |
| 251 factory_for_webui = GetWebUIURLLoader(frame_tree_node).PassInterface(); | 251 factory_for_webui = CreateWebUIURLLoader(frame_tree_node).PassInterface(); |
| 252 } | 252 } |
| 253 | 253 |
| 254 g_next_request_id--; | 254 g_next_request_id--; |
| 255 | 255 |
| 256 DCHECK(!request_controller_); | 256 DCHECK(!request_controller_); |
| 257 request_controller_ = base::MakeUnique<URLLoaderRequestController>( | 257 request_controller_ = base::MakeUnique<URLLoaderRequestController>( |
| 258 std::move(new_request), resource_context); | 258 std::move(new_request), resource_context, |
| 259 static_cast<StoragePartitionImpl*>(storage_partition) | |
| 260 ->url_loader_factory_getter()); | |
| 259 BrowserThread::PostTask( | 261 BrowserThread::PostTask( |
| 260 BrowserThread::IO, FROM_HERE, | 262 BrowserThread::IO, FROM_HERE, |
| 261 base::Bind( | 263 base::Bind( |
| 262 &URLLoaderRequestController::Start, | 264 &URLLoaderRequestController::Start, |
| 263 base::Unretained(request_controller_.get()), | 265 base::Unretained(request_controller_.get()), |
| 264 service_worker_navigation_handle | 266 service_worker_navigation_handle |
| 265 ? service_worker_navigation_handle->core() | 267 ? service_worker_navigation_handle->core() |
| 266 : nullptr, | 268 : nullptr, |
| 267 appcache_handle ? appcache_handle->core() : nullptr, | 269 appcache_handle ? appcache_handle->core() : nullptr, |
| 268 base::Passed(std::move(request_info)), | 270 base::Passed(std::move(request_info)), |
| 269 base::Passed(std::move(factory_for_webui)), | 271 base::Passed(std::move(factory_for_webui)), |
| 270 static_cast<StoragePartitionImpl*>(storage_partition) | |
| 271 ->url_loader_factory_getter(), | |
| 272 base::Bind(&GetWebContentsFromFrameTreeNodeID, frame_tree_node_id), | 272 base::Bind(&GetWebContentsFromFrameTreeNodeID, frame_tree_node_id), |
| 273 base::Passed(std::move(loader_request)), | 273 base::Passed(std::move(loader_request)), |
| 274 base::Passed(std::move(url_loader_client_ptr_to_pass)), | 274 base::Passed(std::move(url_loader_client_ptr_to_pass)), |
| 275 base::Passed(ServiceManagerConnection::GetForProcess() | 275 base::Passed(ServiceManagerConnection::GetForProcess() |
| 276 ->GetConnector() | 276 ->GetConnector() |
| 277 ->Clone()))); | 277 ->Clone()))); |
| 278 } | 278 } |
| 279 | 279 |
| 280 NavigationURLLoaderNetworkService::~NavigationURLLoaderNetworkService() { | 280 NavigationURLLoaderNetworkService::~NavigationURLLoaderNetworkService() { |
| 281 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, | 281 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 350 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted", | 350 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted", |
| 351 this, "&NavigationURLLoaderNetworkService", this, | 351 this, "&NavigationURLLoaderNetworkService", this, |
| 352 "success", false); | 352 "success", false); |
| 353 | 353 |
| 354 delegate_->OnRequestFailed(completion_status.exists_in_cache, | 354 delegate_->OnRequestFailed(completion_status.exists_in_cache, |
| 355 completion_status.error_code); | 355 completion_status.error_code); |
| 356 } | 356 } |
| 357 } | 357 } |
| 358 | 358 |
| 359 } // namespace content | 359 } // namespace content |
| OLD | NEW |