Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(981)

Unified Diff: content/browser/loader/navigation_url_loader_network_service.cc

Issue 2924723002: Network service: SafeBrowsing check for frame-resources from browser. (Closed)
Patch Set: . Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_);
« no previous file with comments | « content/browser/loader/navigation_url_loader_network_service.h ('k') | content/child/resource_dispatcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698