Index: content/browser/loader/navigation_url_loader_network_service.cc |
diff --git a/content/browser/loader/navigation_url_loader_network_service.cc b/content/browser/loader/navigation_url_loader_network_service.cc |
index f7d814d7f136aa336bfd55720a1cb4967237c4fe..7befe2376f6e0e971abd4fe61aa4fcb6fa126869 100644 |
--- a/content/browser/loader/navigation_url_loader_network_service.cc |
+++ b/content/browser/loader/navigation_url_loader_network_service.cc |
@@ -52,82 +52,91 @@ WebContents* GetWebContentsFromFrameTreeNodeID(int frame_tree_node_id) { |
return WebContentsImpl::FromFrameTreeNode(frame_tree_node); |
} |
-void PrepareNavigationStartOnIO( |
- std::unique_ptr<ResourceRequest> resource_request, |
- ResourceContext* resource_context, |
- ServiceWorkerNavigationHandleCore* service_worker_navigation_handle_core, |
- AppCacheNavigationHandleCore* appcache_handle_core, |
- NavigationRequestInfo* request_info, |
- mojom::URLLoaderFactoryPtrInfo factory_from_ui, |
- scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter, |
- const base::Callback<WebContents*(void)>& web_contents_getter, |
- mojom::URLLoaderAssociatedRequest url_loader_request, |
- mojom::URLLoaderClientPtr url_loader_client_to_pass, |
- std::unique_ptr<service_manager::Connector> connector) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- |
- const ResourceType resource_type = request_info->is_main_frame |
- ? RESOURCE_TYPE_MAIN_FRAME |
- : RESOURCE_TYPE_SUB_FRAME; |
- |
- if (resource_request->request_body) { |
- AttachRequestBodyBlobDataHandles(resource_request->request_body.get(), |
- resource_context); |
- } |
+} // namespace |
- mojom::URLLoaderFactoryPtr url_loader_factory_ptr; |
- if (service_worker_navigation_handle_core) { |
- RequestContextFrameType frame_type = |
- request_info->is_main_frame ? REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL |
- : REQUEST_CONTEXT_FRAME_TYPE_NESTED; |
- |
- storage::BlobStorageContext* blob_storage_context = GetBlobStorageContext( |
- GetChromeBlobStorageContextForResourceContext(resource_context)); |
- url_loader_factory_ptr = |
- ServiceWorkerRequestHandler::InitializeForNavigationNetworkService( |
- *resource_request, resource_context, |
- service_worker_navigation_handle_core, blob_storage_context, |
- request_info->begin_params.skip_service_worker, resource_type, |
- request_info->begin_params.request_context_type, frame_type, |
- request_info->are_ancestors_secure, |
- request_info->common_params.post_data, web_contents_getter); |
- } |
+class NavigationURLLoaderNetworkService::IOLoader { |
+ public: |
+ IOLoader() {} |
+ ~IOLoader() {} |
+ void PrepareNavigationStartOnIO( |
+ std::unique_ptr<ResourceRequest> resource_request, |
+ ResourceContext* resource_context, |
+ ServiceWorkerNavigationHandleCore* service_worker_navigation_handle_core, |
+ AppCacheNavigationHandleCore* appcache_handle_core, |
+ NavigationRequestInfo* request_info, |
+ mojom::URLLoaderFactoryPtrInfo factory_from_ui, |
+ scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter, |
+ const base::Callback<WebContents*(void)>& web_contents_getter, |
+ mojom::URLLoaderAssociatedRequest url_loader_request, |
+ mojom::URLLoaderClientPtr url_loader_client_to_pass, |
+ std::unique_ptr<service_manager::Connector> connector) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ |
+ const ResourceType resource_type = request_info->is_main_frame |
+ ? RESOURCE_TYPE_MAIN_FRAME |
+ : RESOURCE_TYPE_SUB_FRAME; |
+ |
+ if (resource_request->request_body) { |
+ AttachRequestBodyBlobDataHandles(resource_request->request_body.get(), |
+ resource_context); |
+ } |
- // TODO(scottmg): We need to rework AppCache to have it return a |
- // URLLoaderFactoryPtr[Info] here. We should also try to have it return |
- // synchronously in as many cases as possible (especially when there's no |
- // AppCache) to simplify and speed the common case. |
- if (false /*appcache_handle_core*/) { |
- AppCacheRequestHandler::InitializeForNavigationNetworkService( |
- std::move(resource_request), resource_context, appcache_handle_core, |
- resource_type, |
- base::Callback<void( |
- mojom::URLLoaderFactoryPtrInfo, |
- std::unique_ptr<ResourceRequest>)>() /* TODO(ananta) */); |
- return; |
- } |
+ mojom::URLLoaderFactoryPtr url_loader_factory_ptr; |
+ if (service_worker_navigation_handle_core) { |
+ RequestContextFrameType frame_type = |
+ request_info->is_main_frame ? REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL |
+ : REQUEST_CONTEXT_FRAME_TYPE_NESTED; |
+ |
+ storage::BlobStorageContext* blob_storage_context = GetBlobStorageContext( |
+ GetChromeBlobStorageContextForResourceContext(resource_context)); |
+ url_loader_factory_ptr = |
+ ServiceWorkerRequestHandler::InitializeForNavigationNetworkService( |
+ *resource_request, resource_context, |
+ service_worker_navigation_handle_core, blob_storage_context, |
+ request_info->begin_params.skip_service_worker, resource_type, |
+ request_info->begin_params.request_context_type, frame_type, |
+ request_info->are_ancestors_secure, |
+ request_info->common_params.post_data, web_contents_getter); |
+ } |
- // If we haven't gotten one from the above, then use the one the UI thread |
- // gave us, or otherwise fallback to the default. |
- mojom::URLLoaderFactory* factory; |
- if (url_loader_factory_ptr) { |
- factory = url_loader_factory_ptr.get(); |
- } else { |
- if (factory_from_ui.is_valid()) { |
- url_loader_factory_ptr.Bind(std::move(factory_from_ui)); |
+ // TODO(scottmg): We need to rework AppCache to have it return a |
+ // URLLoaderFactoryPtr[Info] here. We should also try to have it return |
+ // synchronously in as many cases as possible (especially when there's no |
+ // AppCache) to simplify and speed the common case. |
+ if (false /*appcache_handle_core*/) { |
+ AppCacheRequestHandler::InitializeForNavigationNetworkService( |
+ std::move(resource_request), resource_context, appcache_handle_core, |
+ resource_type, |
+ base::Callback<void( |
+ mojom::URLLoaderFactoryPtrInfo, |
+ std::unique_ptr<ResourceRequest>)>() /* TODO(ananta) */); |
+ return; |
+ } |
+ |
+ // If we haven't gotten one from the above, then use the one the UI thread |
+ // gave us, or otherwise fallback to the default. |
+ mojom::URLLoaderFactory* factory; |
+ if (url_loader_factory_ptr) { |
factory = url_loader_factory_ptr.get(); |
} else { |
- factory = url_loader_factory_getter->GetNetworkFactory()->get(); |
+ if (factory_from_ui.is_valid()) { |
+ url_loader_factory_ptr.Bind(std::move(factory_from_ui)); |
+ factory = url_loader_factory_ptr.get(); |
+ } else { |
+ factory = url_loader_factory_getter->GetNetworkFactory()->get(); |
+ } |
} |
- } |
- factory->CreateLoaderAndStart( |
- std::move(url_loader_request), 0 /* routing_id? */, 0 /* request_id? */, |
- mojom::kURLLoadOptionSendSSLInfo, *resource_request, |
- std::move(url_loader_client_to_pass)); |
-} |
+ factory->CreateLoaderAndStart( |
+ std::move(url_loader_request), 0 /* routing_id? */, 0 /* request_id? */, |
+ mojom::kURLLoadOptionSendSSLInfo, *resource_request, |
+ std::move(url_loader_client_to_pass)); |
+ url_loader_factory_ptr_ = std::move(url_loader_factory_ptr); |
+ } |
-} // namespace |
+ private: |
+ mojom::URLLoaderFactoryPtr url_loader_factory_ptr_; |
+}; |
NavigationURLLoaderNetworkService::NavigationURLLoaderNetworkService( |
ResourceContext* resource_context, |
@@ -193,9 +202,11 @@ NavigationURLLoaderNetworkService::NavigationURLLoaderNetworkService( |
factory_ptr_info = GetWebUIURLLoader(frame_tree_node).PassInterface(); |
} |
+ io_loader_.reset(new IOLoader()); |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, |
- base::Bind(&PrepareNavigationStartOnIO, |
+ base::Bind(&IOLoader::PrepareNavigationStartOnIO, |
+ base::Unretained(io_loader_.get()), |
base::Passed(std::move(new_request)), resource_context, |
service_worker_navigation_handle |
? service_worker_navigation_handle->core() |