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 8947d374e1cdaa53038bb97e7965b5ef336a5b76..df66bde52c66056a43039c906d258dbab0d14eb7 100644 |
--- a/content/browser/loader/navigation_url_loader_network_service.cc |
+++ b/content/browser/loader/navigation_url_loader_network_service.cc |
@@ -26,8 +26,11 @@ |
#include "content/browser/web_contents/web_contents_impl.h" |
#include "content/browser/webui/url_data_manager_backend.h" |
#include "content/browser/webui/web_ui_url_loader_factory.h" |
+#include "content/common/throttling_url_loader.h" |
+#include "content/common/url_loader_factory.mojom.h" |
#include "content/public/browser/browser_context.h" |
#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/content_browser_client.h" |
#include "content/public/browser/global_request_id.h" |
#include "content/public/browser/navigation_data.h" |
#include "content/public/browser/navigation_ui_data.h" |
@@ -35,10 +38,10 @@ |
#include "content/public/browser/stream_handle.h" |
#include "content/public/common/referrer.h" |
#include "content/public/common/url_constants.h" |
-#include "mojo/public/cpp/bindings/strong_binding.h" |
#include "net/base/load_flags.h" |
#include "net/traffic_annotation/network_traffic_annotation.h" |
#include "net/url_request/url_request_context.h" |
+#include "services/service_manager/public/cpp/connector.h" |
namespace content { |
@@ -58,43 +61,6 @@ WebContents* GetWebContentsFromFrameTreeNodeID(int frame_tree_node_id) { |
return WebContentsImpl::FromFrameTreeNode(frame_tree_node); |
} |
-class AssociatedURLLoaderWrapper final : public mojom::URLLoader { |
- public: |
- static void CreateLoaderAndStart( |
- mojom::URLLoaderFactory* factory, |
- mojom::URLLoaderRequest request, |
- uint32_t options, |
- const ResourceRequest& resource_request, |
- mojom::URLLoaderClientPtr client, |
- const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) { |
- mojom::URLLoaderAssociatedPtr associated_ptr; |
- mojom::URLLoaderAssociatedRequest associated_request = |
- mojo::MakeRequest(&associated_ptr); |
- factory->CreateLoaderAndStart( |
- std::move(associated_request), 0 /* routing_id */, 0 /* request_id */, |
- options, resource_request, std::move(client), traffic_annotation); |
- mojo::MakeStrongBinding( |
- base::MakeUnique<AssociatedURLLoaderWrapper>(std::move(associated_ptr)), |
- std::move(request)); |
- } |
- |
- explicit AssociatedURLLoaderWrapper( |
- mojom::URLLoaderAssociatedPtr associated_ptr) |
- : associated_ptr_(std::move(associated_ptr)) {} |
- ~AssociatedURLLoaderWrapper() override {} |
- |
- void FollowRedirect() override { associated_ptr_->FollowRedirect(); } |
- |
- void SetPriority(net::RequestPriority priority, |
- int intra_priority_value) override { |
- associated_ptr_->SetPriority(priority, intra_priority_value); |
- } |
- |
- private: |
- mojom::URLLoaderAssociatedPtr associated_ptr_; |
- DISALLOW_COPY_AND_ASSIGN(AssociatedURLLoaderWrapper); |
-}; |
- |
} // namespace |
// Kept around during the lifetime of the navigation request, and is |
@@ -103,17 +69,20 @@ class AssociatedURLLoaderWrapper final : public mojom::URLLoader { |
// of URLLoaderRequestHandler's and successively calls MaybeCreateLoader |
// on each until the request is successfully handled. The same sequence |
// may be performed multiple times when redirects happen. |
-class NavigationURLLoaderNetworkService::URLLoaderRequestController { |
+class NavigationURLLoaderNetworkService::URLLoaderRequestController |
+ : public mojom::URLLoaderClient { |
public: |
URLLoaderRequestController( |
std::unique_ptr<ResourceRequest> resource_request, |
ResourceContext* resource_context, |
- scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter) |
+ scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter, |
+ const base::WeakPtr<NavigationURLLoaderNetworkService>& owner) |
: resource_request_(std::move(resource_request)), |
resource_context_(resource_context), |
- url_loader_factory_getter_(url_loader_factory_getter) {} |
+ url_loader_factory_getter_(url_loader_factory_getter), |
+ owner_(owner) {} |
- virtual ~URLLoaderRequestController() { |
+ ~URLLoaderRequestController() override { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
} |
@@ -123,11 +92,9 @@ class NavigationURLLoaderNetworkService::URLLoaderRequestController { |
std::unique_ptr<NavigationRequestInfo> request_info, |
mojom::URLLoaderFactoryPtrInfo factory_for_webui, |
const base::Callback<WebContents*(void)>& web_contents_getter, |
- mojom::URLLoaderRequest url_loader_request, |
- mojom::URLLoaderClientPtrInfo url_loader_client_ptr_info, |
std::unique_ptr<service_manager::Connector> connector) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- url_loader_client_ptr_.Bind(std::move(url_loader_client_ptr_info)); |
+ web_contents_getter_ = web_contents_getter; |
const ResourceType resource_type = request_info->is_main_frame |
? RESOURCE_TYPE_MAIN_FRAME |
: RESOURCE_TYPE_SUB_FRAME; |
@@ -140,12 +107,13 @@ class NavigationURLLoaderNetworkService::URLLoaderRequestController { |
// Requests to WebUI scheme won't get redirected to/from other schemes |
// or be intercepted, so we just let it go here. |
if (factory_for_webui.is_valid()) { |
- mojom::URLLoaderFactoryPtr factory_ptr; |
- factory_ptr.Bind(std::move(factory_for_webui)); |
- AssociatedURLLoaderWrapper::CreateLoaderAndStart( |
- factory_ptr.get(), std::move(url_loader_request), |
- mojom::kURLLoadOptionSendSSLInfo, *resource_request_, |
- std::move(url_loader_client_ptr_), |
+ webui_factory_ptr_.Bind(std::move(factory_for_webui)); |
+ url_loader_ = ThrottlingURLLoader::CreateLoaderAndStart( |
+ webui_factory_ptr_.get(), |
+ GetContentClient()->browser()->CreateURLLoaderThrottles( |
+ web_contents_getter_), |
+ 0 /* routing_id? */, 0 /* request_id? */, |
+ mojom::kURLLoadOptionSendSSLInfo, *resource_request_, this, |
net::MutableNetworkTrafficAnnotationTag(NO_TRAFFIC_ANNOTATION_YET)); |
return; |
} |
@@ -178,25 +146,22 @@ class NavigationURLLoaderNetworkService::URLLoaderRequestController { |
handlers_.push_back(std::move(appcache_handler)); |
} |
- Restart(std::move(url_loader_request), std::move(url_loader_client_ptr_)); |
+ Restart(); |
} |
// This could be called multiple times. |
- void Restart(mojom::URLLoaderRequest url_loader_request, |
- mojom::URLLoaderClientPtr url_loader_client_ptr) { |
- url_loader_request_ = std::move(url_loader_request); |
- url_loader_client_ptr_ = std::move(url_loader_client_ptr); |
+ void Restart() { |
handler_index_ = 0; |
MaybeStartLoader(StartLoaderCallback()); |
} |
void MaybeStartLoader(StartLoaderCallback start_loader_callback) { |
- DCHECK(url_loader_client_ptr_.is_bound()); |
- |
if (start_loader_callback) { |
- std::move(start_loader_callback) |
- .Run(std::move(url_loader_request_), |
- std::move(url_loader_client_ptr_)); |
+ url_loader_ = ThrottlingURLLoader::CreateLoaderAndStart( |
+ std::move(start_loader_callback), |
+ GetContentClient()->browser()->CreateURLLoaderThrottles( |
+ web_contents_getter_), |
+ *resource_request_, this); |
return; |
} |
@@ -215,25 +180,84 @@ class NavigationURLLoaderNetworkService::URLLoaderRequestController { |
} else { |
factory = url_loader_factory_getter_->GetNetworkFactory()->get(); |
} |
- AssociatedURLLoaderWrapper::CreateLoaderAndStart( |
- factory, std::move(url_loader_request_), |
- mojom::kURLLoadOptionSendSSLInfo, *resource_request_, |
- std::move(url_loader_client_ptr_), |
+ url_loader_ = ThrottlingURLLoader::CreateLoaderAndStart( |
+ factory, |
+ GetContentClient()->browser()->CreateURLLoaderThrottles( |
+ web_contents_getter_), |
+ 0 /* routing_id? */, 0 /* request_id? */, |
+ mojom::kURLLoadOptionSendSSLInfo, *resource_request_, this, |
net::MutableNetworkTrafficAnnotationTag(NO_TRAFFIC_ANNOTATION_YET)); |
} |
+ void FollowRedirect() { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ DCHECK(url_loader_); |
+ |
+ url_loader_->FollowRedirect(); |
+ } |
+ |
private: |
+ // mojom::URLLoaderClient implementation: |
+ void OnReceiveResponse( |
+ const ResourceResponseHead& head, |
+ const base::Optional<net::SSLInfo>& ssl_info, |
+ mojom::DownloadedTempFilePtr downloaded_file) override { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&NavigationURLLoaderNetworkService::OnReceiveResponse, |
+ owner_, head, ssl_info, base::Passed(&downloaded_file))); |
+ } |
+ |
+ void OnReceiveRedirect(const net::RedirectInfo& redirect_info, |
+ const ResourceResponseHead& head) override { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&NavigationURLLoaderNetworkService::OnReceiveRedirect, |
+ owner_, redirect_info, head)); |
+ } |
+ |
+ void OnDataDownloaded(int64_t data_length, int64_t encoded_length) override {} |
+ |
+ void OnUploadProgress(int64_t current_position, |
+ int64_t total_size, |
+ OnUploadProgressCallback callback) override {} |
+ |
+ void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override {} |
+ |
+ void OnTransferSizeUpdated(int32_t transfer_size_diff) override {} |
+ |
+ void OnStartLoadingResponseBody( |
+ mojo::ScopedDataPipeConsumerHandle body) override { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind( |
+ &NavigationURLLoaderNetworkService::OnStartLoadingResponseBody, |
+ owner_, base::Passed(&body))); |
+ } |
+ |
+ void OnComplete( |
+ const ResourceRequestCompletionStatus& completion_status) override { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&NavigationURLLoaderNetworkService::OnComplete, owner_, |
+ completion_status)); |
+ } |
+ |
std::vector<std::unique_ptr<URLLoaderRequestHandler>> handlers_; |
size_t handler_index_ = 0; |
std::unique_ptr<ResourceRequest> resource_request_; |
ResourceContext* resource_context_; |
+ base::Callback<WebContents*()> web_contents_getter_; |
scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter_; |
- // Kept around until we create a loader. |
- mojom::URLLoaderRequest url_loader_request_; |
- mojom::URLLoaderClientPtr url_loader_client_ptr_; |
+ mojom::URLLoaderFactoryPtr webui_factory_ptr_; |
+ |
+ std::unique_ptr<ThrottlingURLLoader> url_loader_; |
+ |
+ // This is referenced only on the UI thread. |
+ base::WeakPtr<NavigationURLLoaderNetworkService> owner_; |
DISALLOW_COPY_AND_ASSIGN(URLLoaderRequestController); |
}; |
@@ -246,7 +270,7 @@ NavigationURLLoaderNetworkService::NavigationURLLoaderNetworkService( |
ServiceWorkerNavigationHandle* service_worker_navigation_handle, |
AppCacheNavigationHandle* appcache_handle, |
NavigationURLLoaderDelegate* delegate) |
- : delegate_(delegate), binding_(this) { |
+ : delegate_(delegate), weak_factory_(this) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP1( |
@@ -286,10 +310,6 @@ NavigationURLLoaderNetworkService::NavigationURLLoaderNetworkService( |
int frame_tree_node_id = request_info->frame_tree_node_id; |
- mojom::URLLoaderRequest loader_request = mojo::MakeRequest(&url_loader_ptr_); |
- mojom::URLLoaderClientPtr url_loader_client_ptr_to_pass; |
- binding_.Bind(mojo::MakeRequest(&url_loader_client_ptr_to_pass)); |
- |
// Check if a web UI scheme wants to handle this request. |
mojom::URLLoaderFactoryPtrInfo factory_for_webui; |
const auto& schemes = URLDataManagerBackend::GetWebUISchemes(); |
@@ -306,7 +326,8 @@ NavigationURLLoaderNetworkService::NavigationURLLoaderNetworkService( |
request_controller_ = base::MakeUnique<URLLoaderRequestController>( |
std::move(new_request), resource_context, |
static_cast<StoragePartitionImpl*>(storage_partition) |
- ->url_loader_factory_getter()); |
+ ->url_loader_factory_getter(), |
+ weak_factory_.GetWeakPtr()); |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, |
base::Bind( |
@@ -319,8 +340,6 @@ NavigationURLLoaderNetworkService::NavigationURLLoaderNetworkService( |
base::Passed(std::move(request_info)), |
base::Passed(std::move(factory_for_webui)), |
base::Bind(&GetWebContentsFromFrameTreeNodeID, frame_tree_node_id), |
- base::Passed(std::move(loader_request)), |
- base::Passed(url_loader_client_ptr_to_pass.PassInterface()), |
base::Passed(ServiceManagerConnection::GetForProcess() |
->GetConnector() |
->Clone()))); |
@@ -332,7 +351,10 @@ NavigationURLLoaderNetworkService::~NavigationURLLoaderNetworkService() { |
} |
void NavigationURLLoaderNetworkService::FollowRedirect() { |
- url_loader_ptr_->FollowRedirect(); |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&URLLoaderRequestController::FollowRedirect, |
+ base::Unretained(request_controller_.get()))); |
} |
void NavigationURLLoaderNetworkService::ProceedWithResponse() {} |
@@ -361,21 +383,6 @@ void NavigationURLLoaderNetworkService::OnReceiveRedirect( |
delegate_->OnRequestRedirected(redirect_info, response); |
} |
-void NavigationURLLoaderNetworkService::OnDataDownloaded( |
- int64_t data_length, |
- int64_t encoded_length) {} |
- |
-void NavigationURLLoaderNetworkService::OnUploadProgress( |
- int64_t current_position, |
- int64_t total_size, |
- OnUploadProgressCallback callback) {} |
- |
-void NavigationURLLoaderNetworkService::OnReceiveCachedMetadata( |
- const std::vector<uint8_t>& data) {} |
- |
-void NavigationURLLoaderNetworkService::OnTransferSizeUpdated( |
- int32_t transfer_size_diff) {} |
- |
void NavigationURLLoaderNetworkService::OnStartLoadingResponseBody( |
mojo::ScopedDataPipeConsumerHandle body) { |
DCHECK(response_); |