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

Side by Side 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 unified diff | Download patch
OLDNEW
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"
11 #include "content/browser/appcache/appcache_navigation_handle.h" 11 #include "content/browser/appcache/appcache_navigation_handle.h"
12 #include "content/browser/appcache/appcache_request_handler.h" 12 #include "content/browser/appcache/appcache_request_handler.h"
13 #include "content/browser/blob_storage/chrome_blob_storage_context.h" 13 #include "content/browser/blob_storage/chrome_blob_storage_context.h"
14 #include "content/browser/frame_host/frame_tree_node.h" 14 #include "content/browser/frame_host/frame_tree_node.h"
15 #include "content/browser/frame_host/navigation_request_info.h" 15 #include "content/browser/frame_host/navigation_request_info.h"
16 #include "content/browser/loader/navigation_resource_handler.h" 16 #include "content/browser/loader/navigation_resource_handler.h"
17 #include "content/browser/loader/navigation_resource_throttle.h" 17 #include "content/browser/loader/navigation_resource_throttle.h"
18 #include "content/browser/loader/navigation_url_loader_delegate.h" 18 #include "content/browser/loader/navigation_url_loader_delegate.h"
19 #include "content/browser/loader/url_loader_request_handler.h" 19 #include "content/browser/loader/url_loader_request_handler.h"
20 #include "content/browser/resource_context_impl.h" 20 #include "content/browser/resource_context_impl.h"
21 #include "content/browser/service_worker/service_worker_navigation_handle.h" 21 #include "content/browser/service_worker/service_worker_navigation_handle.h"
22 #include "content/browser/service_worker/service_worker_navigation_handle_core.h " 22 #include "content/browser/service_worker/service_worker_navigation_handle_core.h "
23 #include "content/browser/service_worker/service_worker_request_handler.h" 23 #include "content/browser/service_worker/service_worker_request_handler.h"
24 #include "content/browser/storage_partition_impl.h" 24 #include "content/browser/storage_partition_impl.h"
25 #include "content/browser/url_loader_factory_getter.h" 25 #include "content/browser/url_loader_factory_getter.h"
26 #include "content/browser/web_contents/web_contents_impl.h" 26 #include "content/browser/web_contents/web_contents_impl.h"
27 #include "content/browser/webui/url_data_manager_backend.h" 27 #include "content/browser/webui/url_data_manager_backend.h"
28 #include "content/browser/webui/web_ui_url_loader_factory.h" 28 #include "content/browser/webui/web_ui_url_loader_factory.h"
29 #include "content/common/throttling_url_loader.h"
30 #include "content/common/url_loader_factory.mojom.h"
29 #include "content/public/browser/browser_context.h" 31 #include "content/public/browser/browser_context.h"
30 #include "content/public/browser/browser_thread.h" 32 #include "content/public/browser/browser_thread.h"
33 #include "content/public/browser/content_browser_client.h"
31 #include "content/public/browser/global_request_id.h" 34 #include "content/public/browser/global_request_id.h"
32 #include "content/public/browser/navigation_data.h" 35 #include "content/public/browser/navigation_data.h"
33 #include "content/public/browser/navigation_ui_data.h" 36 #include "content/public/browser/navigation_ui_data.h"
34 #include "content/public/browser/ssl_status.h" 37 #include "content/public/browser/ssl_status.h"
35 #include "content/public/browser/stream_handle.h" 38 #include "content/public/browser/stream_handle.h"
36 #include "content/public/common/referrer.h" 39 #include "content/public/common/referrer.h"
37 #include "content/public/common/url_constants.h" 40 #include "content/public/common/url_constants.h"
38 #include "mojo/public/cpp/bindings/strong_binding.h"
39 #include "net/base/load_flags.h" 41 #include "net/base/load_flags.h"
40 #include "net/traffic_annotation/network_traffic_annotation.h" 42 #include "net/traffic_annotation/network_traffic_annotation.h"
41 #include "net/url_request/url_request_context.h" 43 #include "net/url_request/url_request_context.h"
44 #include "services/service_manager/public/cpp/connector.h"
42 45
43 namespace content { 46 namespace content {
44 47
45 namespace { 48 namespace {
46 49
47 // Request ID for browser initiated requests. We start at -2 on the same lines 50 // Request ID for browser initiated requests. We start at -2 on the same lines
48 // as ResourceDispatcherHostImpl. 51 // as ResourceDispatcherHostImpl.
49 int g_next_request_id = -2; 52 int g_next_request_id = -2;
50 53
51 WebContents* GetWebContentsFromFrameTreeNodeID(int frame_tree_node_id) { 54 WebContents* GetWebContentsFromFrameTreeNodeID(int frame_tree_node_id) {
52 DCHECK_CURRENTLY_ON(BrowserThread::UI); 55 DCHECK_CURRENTLY_ON(BrowserThread::UI);
53 FrameTreeNode* frame_tree_node = 56 FrameTreeNode* frame_tree_node =
54 FrameTreeNode::GloballyFindByID(frame_tree_node_id); 57 FrameTreeNode::GloballyFindByID(frame_tree_node_id);
55 if (!frame_tree_node) 58 if (!frame_tree_node)
56 return nullptr; 59 return nullptr;
57 60
58 return WebContentsImpl::FromFrameTreeNode(frame_tree_node); 61 return WebContentsImpl::FromFrameTreeNode(frame_tree_node);
59 } 62 }
60 63
61 class AssociatedURLLoaderWrapper final : public mojom::URLLoader {
62 public:
63 static void CreateLoaderAndStart(
64 mojom::URLLoaderFactory* factory,
65 mojom::URLLoaderRequest request,
66 uint32_t options,
67 const ResourceRequest& resource_request,
68 mojom::URLLoaderClientPtr client,
69 const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) {
70 mojom::URLLoaderAssociatedPtr associated_ptr;
71 mojom::URLLoaderAssociatedRequest associated_request =
72 mojo::MakeRequest(&associated_ptr);
73 factory->CreateLoaderAndStart(
74 std::move(associated_request), 0 /* routing_id */, 0 /* request_id */,
75 options, resource_request, std::move(client), traffic_annotation);
76 mojo::MakeStrongBinding(
77 base::MakeUnique<AssociatedURLLoaderWrapper>(std::move(associated_ptr)),
78 std::move(request));
79 }
80
81 explicit AssociatedURLLoaderWrapper(
82 mojom::URLLoaderAssociatedPtr associated_ptr)
83 : associated_ptr_(std::move(associated_ptr)) {}
84 ~AssociatedURLLoaderWrapper() override {}
85
86 void FollowRedirect() override { associated_ptr_->FollowRedirect(); }
87
88 void SetPriority(net::RequestPriority priority,
89 int intra_priority_value) override {
90 associated_ptr_->SetPriority(priority, intra_priority_value);
91 }
92
93 private:
94 mojom::URLLoaderAssociatedPtr associated_ptr_;
95 DISALLOW_COPY_AND_ASSIGN(AssociatedURLLoaderWrapper);
96 };
97
98 } // namespace 64 } // namespace
99 65
100 // Kept around during the lifetime of the navigation request, and is 66 // Kept around during the lifetime of the navigation request, and is
101 // responsible for dispatching a ResourceRequest to the appropriate 67 // responsible for dispatching a ResourceRequest to the appropriate
102 // URLLoader. In order to get the right URLLoader it builds a vector 68 // URLLoader. In order to get the right URLLoader it builds a vector
103 // of URLLoaderRequestHandler's and successively calls MaybeCreateLoader 69 // of URLLoaderRequestHandler's and successively calls MaybeCreateLoader
104 // on each until the request is successfully handled. The same sequence 70 // on each until the request is successfully handled. The same sequence
105 // may be performed multiple times when redirects happen. 71 // may be performed multiple times when redirects happen.
106 class NavigationURLLoaderNetworkService::URLLoaderRequestController { 72 class NavigationURLLoaderNetworkService::URLLoaderRequestController
73 : public mojom::URLLoaderClient {
107 public: 74 public:
108 URLLoaderRequestController( 75 URLLoaderRequestController(
109 std::unique_ptr<ResourceRequest> resource_request, 76 std::unique_ptr<ResourceRequest> resource_request,
110 ResourceContext* resource_context, 77 ResourceContext* resource_context,
111 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter) 78 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter,
79 const base::WeakPtr<NavigationURLLoaderNetworkService>& owner)
112 : resource_request_(std::move(resource_request)), 80 : resource_request_(std::move(resource_request)),
113 resource_context_(resource_context), 81 resource_context_(resource_context),
114 url_loader_factory_getter_(url_loader_factory_getter) {} 82 url_loader_factory_getter_(url_loader_factory_getter),
83 owner_(owner) {}
115 84
116 virtual ~URLLoaderRequestController() { 85 ~URLLoaderRequestController() override {
117 DCHECK_CURRENTLY_ON(BrowserThread::IO); 86 DCHECK_CURRENTLY_ON(BrowserThread::IO);
118 } 87 }
119 88
120 void Start( 89 void Start(
121 ServiceWorkerNavigationHandleCore* service_worker_navigation_handle_core, 90 ServiceWorkerNavigationHandleCore* service_worker_navigation_handle_core,
122 AppCacheNavigationHandleCore* appcache_handle_core, 91 AppCacheNavigationHandleCore* appcache_handle_core,
123 std::unique_ptr<NavigationRequestInfo> request_info, 92 std::unique_ptr<NavigationRequestInfo> request_info,
124 mojom::URLLoaderFactoryPtrInfo factory_for_webui, 93 mojom::URLLoaderFactoryPtrInfo factory_for_webui,
125 const base::Callback<WebContents*(void)>& web_contents_getter, 94 const base::Callback<WebContents*(void)>& web_contents_getter,
126 mojom::URLLoaderRequest url_loader_request,
127 mojom::URLLoaderClientPtrInfo url_loader_client_ptr_info,
128 std::unique_ptr<service_manager::Connector> connector) { 95 std::unique_ptr<service_manager::Connector> connector) {
129 DCHECK_CURRENTLY_ON(BrowserThread::IO); 96 DCHECK_CURRENTLY_ON(BrowserThread::IO);
130 url_loader_client_ptr_.Bind(std::move(url_loader_client_ptr_info)); 97 web_contents_getter_ = web_contents_getter;
131 const ResourceType resource_type = request_info->is_main_frame 98 const ResourceType resource_type = request_info->is_main_frame
132 ? RESOURCE_TYPE_MAIN_FRAME 99 ? RESOURCE_TYPE_MAIN_FRAME
133 : RESOURCE_TYPE_SUB_FRAME; 100 : RESOURCE_TYPE_SUB_FRAME;
134 101
135 if (resource_request_->request_body) { 102 if (resource_request_->request_body) {
136 AttachRequestBodyBlobDataHandles(resource_request_->request_body.get(), 103 AttachRequestBodyBlobDataHandles(resource_request_->request_body.get(),
137 resource_context_); 104 resource_context_);
138 } 105 }
139 106
140 // Requests to WebUI scheme won't get redirected to/from other schemes 107 // Requests to WebUI scheme won't get redirected to/from other schemes
141 // or be intercepted, so we just let it go here. 108 // or be intercepted, so we just let it go here.
142 if (factory_for_webui.is_valid()) { 109 if (factory_for_webui.is_valid()) {
143 mojom::URLLoaderFactoryPtr factory_ptr; 110 webui_factory_ptr_.Bind(std::move(factory_for_webui));
144 factory_ptr.Bind(std::move(factory_for_webui)); 111 url_loader_ = ThrottlingURLLoader::CreateLoaderAndStart(
145 AssociatedURLLoaderWrapper::CreateLoaderAndStart( 112 webui_factory_ptr_.get(),
146 factory_ptr.get(), std::move(url_loader_request), 113 GetContentClient()->browser()->CreateURLLoaderThrottles(
147 mojom::kURLLoadOptionSendSSLInfo, *resource_request_, 114 web_contents_getter_),
148 std::move(url_loader_client_ptr_), 115 0 /* routing_id? */, 0 /* request_id? */,
116 mojom::kURLLoadOptionSendSSLInfo, *resource_request_, this,
149 net::MutableNetworkTrafficAnnotationTag(NO_TRAFFIC_ANNOTATION_YET)); 117 net::MutableNetworkTrafficAnnotationTag(NO_TRAFFIC_ANNOTATION_YET));
150 return; 118 return;
151 } 119 }
152 120
153 DCHECK(handlers_.empty()); 121 DCHECK(handlers_.empty());
154 if (service_worker_navigation_handle_core) { 122 if (service_worker_navigation_handle_core) {
155 RequestContextFrameType frame_type = 123 RequestContextFrameType frame_type =
156 request_info->is_main_frame ? REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL 124 request_info->is_main_frame ? REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL
157 : REQUEST_CONTEXT_FRAME_TYPE_NESTED; 125 : REQUEST_CONTEXT_FRAME_TYPE_NESTED;
158 126
(...skipping 12 matching lines...) Expand all
171 } 139 }
172 140
173 if (appcache_handle_core) { 141 if (appcache_handle_core) {
174 std::unique_ptr<URLLoaderRequestHandler> appcache_handler = 142 std::unique_ptr<URLLoaderRequestHandler> appcache_handler =
175 AppCacheRequestHandler::InitializeForNavigationNetworkService( 143 AppCacheRequestHandler::InitializeForNavigationNetworkService(
176 *resource_request_, appcache_handle_core); 144 *resource_request_, appcache_handle_core);
177 if (appcache_handler) 145 if (appcache_handler)
178 handlers_.push_back(std::move(appcache_handler)); 146 handlers_.push_back(std::move(appcache_handler));
179 } 147 }
180 148
181 Restart(std::move(url_loader_request), std::move(url_loader_client_ptr_)); 149 Restart();
182 } 150 }
183 151
184 // This could be called multiple times. 152 // This could be called multiple times.
185 void Restart(mojom::URLLoaderRequest url_loader_request, 153 void Restart() {
186 mojom::URLLoaderClientPtr url_loader_client_ptr) {
187 url_loader_request_ = std::move(url_loader_request);
188 url_loader_client_ptr_ = std::move(url_loader_client_ptr);
189 handler_index_ = 0; 154 handler_index_ = 0;
190 MaybeStartLoader(StartLoaderCallback()); 155 MaybeStartLoader(StartLoaderCallback());
191 } 156 }
192 157
193 void MaybeStartLoader(StartLoaderCallback start_loader_callback) { 158 void MaybeStartLoader(StartLoaderCallback start_loader_callback) {
194 DCHECK(url_loader_client_ptr_.is_bound());
195
196 if (start_loader_callback) { 159 if (start_loader_callback) {
197 std::move(start_loader_callback) 160 url_loader_ = ThrottlingURLLoader::CreateLoaderAndStart(
198 .Run(std::move(url_loader_request_), 161 std::move(start_loader_callback),
199 std::move(url_loader_client_ptr_)); 162 GetContentClient()->browser()->CreateURLLoaderThrottles(
163 web_contents_getter_),
164 *resource_request_, this);
200 return; 165 return;
201 } 166 }
202 167
203 if (handler_index_ < handlers_.size()) { 168 if (handler_index_ < handlers_.size()) {
204 handlers_[handler_index_++]->MaybeCreateLoader( 169 handlers_[handler_index_++]->MaybeCreateLoader(
205 *resource_request_, resource_context_, 170 *resource_request_, resource_context_,
206 base::BindOnce(&URLLoaderRequestController::MaybeStartLoader, 171 base::BindOnce(&URLLoaderRequestController::MaybeStartLoader,
207 base::Unretained(this))); 172 base::Unretained(this)));
208 return; 173 return;
209 } 174 }
210 175
211 mojom::URLLoaderFactory* factory = nullptr; 176 mojom::URLLoaderFactory* factory = nullptr;
212 DCHECK_EQ(handlers_.size(), handler_index_); 177 DCHECK_EQ(handlers_.size(), handler_index_);
213 if (resource_request_->url.SchemeIs(url::kBlobScheme)) { 178 if (resource_request_->url.SchemeIs(url::kBlobScheme)) {
214 factory = url_loader_factory_getter_->GetBlobFactory()->get(); 179 factory = url_loader_factory_getter_->GetBlobFactory()->get();
215 } else { 180 } else {
216 factory = url_loader_factory_getter_->GetNetworkFactory()->get(); 181 factory = url_loader_factory_getter_->GetNetworkFactory()->get();
217 } 182 }
218 AssociatedURLLoaderWrapper::CreateLoaderAndStart( 183 url_loader_ = ThrottlingURLLoader::CreateLoaderAndStart(
219 factory, std::move(url_loader_request_), 184 factory,
220 mojom::kURLLoadOptionSendSSLInfo, *resource_request_, 185 GetContentClient()->browser()->CreateURLLoaderThrottles(
221 std::move(url_loader_client_ptr_), 186 web_contents_getter_),
187 0 /* routing_id? */, 0 /* request_id? */,
188 mojom::kURLLoadOptionSendSSLInfo, *resource_request_, this,
222 net::MutableNetworkTrafficAnnotationTag(NO_TRAFFIC_ANNOTATION_YET)); 189 net::MutableNetworkTrafficAnnotationTag(NO_TRAFFIC_ANNOTATION_YET));
223 } 190 }
224 191
192 void FollowRedirect() {
193 DCHECK_CURRENTLY_ON(BrowserThread::IO);
194 DCHECK(url_loader_);
195
196 url_loader_->FollowRedirect();
197 }
198
225 private: 199 private:
200 // mojom::URLLoaderClient implementation:
201 void OnReceiveResponse(
202 const ResourceResponseHead& head,
203 const base::Optional<net::SSLInfo>& ssl_info,
204 mojom::DownloadedTempFilePtr downloaded_file) override {
205 BrowserThread::PostTask(
206 BrowserThread::UI, FROM_HERE,
207 base::Bind(&NavigationURLLoaderNetworkService::OnReceiveResponse,
208 owner_, head, ssl_info, base::Passed(&downloaded_file)));
209 }
210
211 void OnReceiveRedirect(const net::RedirectInfo& redirect_info,
212 const ResourceResponseHead& head) override {
213 BrowserThread::PostTask(
214 BrowserThread::UI, FROM_HERE,
215 base::Bind(&NavigationURLLoaderNetworkService::OnReceiveRedirect,
216 owner_, redirect_info, head));
217 }
218
219 void OnDataDownloaded(int64_t data_length, int64_t encoded_length) override {}
220
221 void OnUploadProgress(int64_t current_position,
222 int64_t total_size,
223 OnUploadProgressCallback callback) override {}
224
225 void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override {}
226
227 void OnTransferSizeUpdated(int32_t transfer_size_diff) override {}
228
229 void OnStartLoadingResponseBody(
230 mojo::ScopedDataPipeConsumerHandle body) override {
231 BrowserThread::PostTask(
232 BrowserThread::UI, FROM_HERE,
233 base::Bind(
234 &NavigationURLLoaderNetworkService::OnStartLoadingResponseBody,
235 owner_, base::Passed(&body)));
236 }
237
238 void OnComplete(
239 const ResourceRequestCompletionStatus& completion_status) override {
240 BrowserThread::PostTask(
241 BrowserThread::UI, FROM_HERE,
242 base::Bind(&NavigationURLLoaderNetworkService::OnComplete, owner_,
243 completion_status));
244 }
245
226 std::vector<std::unique_ptr<URLLoaderRequestHandler>> handlers_; 246 std::vector<std::unique_ptr<URLLoaderRequestHandler>> handlers_;
227 size_t handler_index_ = 0; 247 size_t handler_index_ = 0;
228 248
229 std::unique_ptr<ResourceRequest> resource_request_; 249 std::unique_ptr<ResourceRequest> resource_request_;
230 ResourceContext* resource_context_; 250 ResourceContext* resource_context_;
251 base::Callback<WebContents*()> web_contents_getter_;
231 252
232 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter_; 253 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter_;
233 254
234 // Kept around until we create a loader. 255 mojom::URLLoaderFactoryPtr webui_factory_ptr_;
235 mojom::URLLoaderRequest url_loader_request_; 256
236 mojom::URLLoaderClientPtr url_loader_client_ptr_; 257 std::unique_ptr<ThrottlingURLLoader> url_loader_;
258
259 // This is referenced only on the UI thread.
260 base::WeakPtr<NavigationURLLoaderNetworkService> owner_;
237 261
238 DISALLOW_COPY_AND_ASSIGN(URLLoaderRequestController); 262 DISALLOW_COPY_AND_ASSIGN(URLLoaderRequestController);
239 }; 263 };
240 264
241 NavigationURLLoaderNetworkService::NavigationURLLoaderNetworkService( 265 NavigationURLLoaderNetworkService::NavigationURLLoaderNetworkService(
242 ResourceContext* resource_context, 266 ResourceContext* resource_context,
243 StoragePartition* storage_partition, 267 StoragePartition* storage_partition,
244 std::unique_ptr<NavigationRequestInfo> request_info, 268 std::unique_ptr<NavigationRequestInfo> request_info,
245 std::unique_ptr<NavigationUIData> navigation_ui_data, 269 std::unique_ptr<NavigationUIData> navigation_ui_data,
246 ServiceWorkerNavigationHandle* service_worker_navigation_handle, 270 ServiceWorkerNavigationHandle* service_worker_navigation_handle,
247 AppCacheNavigationHandle* appcache_handle, 271 AppCacheNavigationHandle* appcache_handle,
248 NavigationURLLoaderDelegate* delegate) 272 NavigationURLLoaderDelegate* delegate)
249 : delegate_(delegate), binding_(this) { 273 : delegate_(delegate), weak_factory_(this) {
250 DCHECK_CURRENTLY_ON(BrowserThread::UI); 274 DCHECK_CURRENTLY_ON(BrowserThread::UI);
251 275
252 TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP1( 276 TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP1(
253 "navigation", "Navigation timeToResponseStarted", this, 277 "navigation", "Navigation timeToResponseStarted", this,
254 request_info->common_params.navigation_start, "FrameTreeNode id", 278 request_info->common_params.navigation_start, "FrameTreeNode id",
255 request_info->frame_tree_node_id); 279 request_info->frame_tree_node_id);
256 280
257 // TODO(scottmg): Port over stuff from RDHI::BeginNavigationRequest() here. 281 // TODO(scottmg): Port over stuff from RDHI::BeginNavigationRequest() here.
258 auto new_request = base::MakeUnique<ResourceRequest>(); 282 auto new_request = base::MakeUnique<ResourceRequest>();
259 283
(...skipping 19 matching lines...) Expand all
279 // Sync loads should have maximum priority and should be the only 303 // Sync loads should have maximum priority and should be the only
280 // requests that have the ignore limits flag set. 304 // requests that have the ignore limits flag set.
281 DCHECK(!(load_flags & net::LOAD_IGNORE_LIMITS)); 305 DCHECK(!(load_flags & net::LOAD_IGNORE_LIMITS));
282 306
283 new_request->load_flags = load_flags; 307 new_request->load_flags = load_flags;
284 308
285 new_request->request_body = request_info->common_params.post_data.get(); 309 new_request->request_body = request_info->common_params.post_data.get();
286 310
287 int frame_tree_node_id = request_info->frame_tree_node_id; 311 int frame_tree_node_id = request_info->frame_tree_node_id;
288 312
289 mojom::URLLoaderRequest loader_request = mojo::MakeRequest(&url_loader_ptr_);
290 mojom::URLLoaderClientPtr url_loader_client_ptr_to_pass;
291 binding_.Bind(mojo::MakeRequest(&url_loader_client_ptr_to_pass));
292
293 // Check if a web UI scheme wants to handle this request. 313 // Check if a web UI scheme wants to handle this request.
294 mojom::URLLoaderFactoryPtrInfo factory_for_webui; 314 mojom::URLLoaderFactoryPtrInfo factory_for_webui;
295 const auto& schemes = URLDataManagerBackend::GetWebUISchemes(); 315 const auto& schemes = URLDataManagerBackend::GetWebUISchemes();
296 if (std::find(schemes.begin(), schemes.end(), new_request->url.scheme()) != 316 if (std::find(schemes.begin(), schemes.end(), new_request->url.scheme()) !=
297 schemes.end()) { 317 schemes.end()) {
298 FrameTreeNode* frame_tree_node = 318 FrameTreeNode* frame_tree_node =
299 FrameTreeNode::GloballyFindByID(frame_tree_node_id); 319 FrameTreeNode::GloballyFindByID(frame_tree_node_id);
300 factory_for_webui = CreateWebUIURLLoader(frame_tree_node).PassInterface(); 320 factory_for_webui = CreateWebUIURLLoader(frame_tree_node).PassInterface();
301 } 321 }
302 322
303 g_next_request_id--; 323 g_next_request_id--;
304 324
305 DCHECK(!request_controller_); 325 DCHECK(!request_controller_);
306 request_controller_ = base::MakeUnique<URLLoaderRequestController>( 326 request_controller_ = base::MakeUnique<URLLoaderRequestController>(
307 std::move(new_request), resource_context, 327 std::move(new_request), resource_context,
308 static_cast<StoragePartitionImpl*>(storage_partition) 328 static_cast<StoragePartitionImpl*>(storage_partition)
309 ->url_loader_factory_getter()); 329 ->url_loader_factory_getter(),
330 weak_factory_.GetWeakPtr());
310 BrowserThread::PostTask( 331 BrowserThread::PostTask(
311 BrowserThread::IO, FROM_HERE, 332 BrowserThread::IO, FROM_HERE,
312 base::Bind( 333 base::Bind(
313 &URLLoaderRequestController::Start, 334 &URLLoaderRequestController::Start,
314 base::Unretained(request_controller_.get()), 335 base::Unretained(request_controller_.get()),
315 service_worker_navigation_handle 336 service_worker_navigation_handle
316 ? service_worker_navigation_handle->core() 337 ? service_worker_navigation_handle->core()
317 : nullptr, 338 : nullptr,
318 appcache_handle ? appcache_handle->core() : nullptr, 339 appcache_handle ? appcache_handle->core() : nullptr,
319 base::Passed(std::move(request_info)), 340 base::Passed(std::move(request_info)),
320 base::Passed(std::move(factory_for_webui)), 341 base::Passed(std::move(factory_for_webui)),
321 base::Bind(&GetWebContentsFromFrameTreeNodeID, frame_tree_node_id), 342 base::Bind(&GetWebContentsFromFrameTreeNodeID, frame_tree_node_id),
322 base::Passed(std::move(loader_request)),
323 base::Passed(url_loader_client_ptr_to_pass.PassInterface()),
324 base::Passed(ServiceManagerConnection::GetForProcess() 343 base::Passed(ServiceManagerConnection::GetForProcess()
325 ->GetConnector() 344 ->GetConnector()
326 ->Clone()))); 345 ->Clone())));
327 } 346 }
328 347
329 NavigationURLLoaderNetworkService::~NavigationURLLoaderNetworkService() { 348 NavigationURLLoaderNetworkService::~NavigationURLLoaderNetworkService() {
330 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, 349 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE,
331 request_controller_.release()); 350 request_controller_.release());
332 } 351 }
333 352
334 void NavigationURLLoaderNetworkService::FollowRedirect() { 353 void NavigationURLLoaderNetworkService::FollowRedirect() {
335 url_loader_ptr_->FollowRedirect(); 354 BrowserThread::PostTask(
355 BrowserThread::IO, FROM_HERE,
356 base::Bind(&URLLoaderRequestController::FollowRedirect,
357 base::Unretained(request_controller_.get())));
336 } 358 }
337 359
338 void NavigationURLLoaderNetworkService::ProceedWithResponse() {} 360 void NavigationURLLoaderNetworkService::ProceedWithResponse() {}
339 361
340 void NavigationURLLoaderNetworkService::OnReceiveResponse( 362 void NavigationURLLoaderNetworkService::OnReceiveResponse(
341 const ResourceResponseHead& head, 363 const ResourceResponseHead& head,
342 const base::Optional<net::SSLInfo>& ssl_info, 364 const base::Optional<net::SSLInfo>& ssl_info,
343 mojom::DownloadedTempFilePtr downloaded_file) { 365 mojom::DownloadedTempFilePtr downloaded_file) {
344 // TODO(scottmg): This needs to do more of what 366 // TODO(scottmg): This needs to do more of what
345 // NavigationResourceHandler::OnReponseStarted() does. Or maybe in 367 // NavigationResourceHandler::OnReponseStarted() does. Or maybe in
346 // OnStartLoadingResponseBody(). 368 // OnStartLoadingResponseBody().
347 if (ssl_info && ssl_info->cert) 369 if (ssl_info && ssl_info->cert)
348 NavigationResourceHandler::GetSSLStatusForRequest(*ssl_info, &ssl_status_); 370 NavigationResourceHandler::GetSSLStatusForRequest(*ssl_info, &ssl_status_);
349 response_ = base::MakeRefCounted<ResourceResponse>(); 371 response_ = base::MakeRefCounted<ResourceResponse>();
350 response_->head = head; 372 response_->head = head;
351 } 373 }
352 374
353 void NavigationURLLoaderNetworkService::OnReceiveRedirect( 375 void NavigationURLLoaderNetworkService::OnReceiveRedirect(
354 const net::RedirectInfo& redirect_info, 376 const net::RedirectInfo& redirect_info,
355 const ResourceResponseHead& head) { 377 const ResourceResponseHead& head) {
356 DCHECK_CURRENTLY_ON(BrowserThread::UI); 378 DCHECK_CURRENTLY_ON(BrowserThread::UI);
357 // TODO(kinuko): Perform the necessary check and call 379 // TODO(kinuko): Perform the necessary check and call
358 // URLLoaderRequestController::Restart with the new URL?? 380 // URLLoaderRequestController::Restart with the new URL??
359 scoped_refptr<ResourceResponse> response(new ResourceResponse()); 381 scoped_refptr<ResourceResponse> response(new ResourceResponse());
360 response->head = head; 382 response->head = head;
361 delegate_->OnRequestRedirected(redirect_info, response); 383 delegate_->OnRequestRedirected(redirect_info, response);
362 } 384 }
363 385
364 void NavigationURLLoaderNetworkService::OnDataDownloaded(
365 int64_t data_length,
366 int64_t encoded_length) {}
367
368 void NavigationURLLoaderNetworkService::OnUploadProgress(
369 int64_t current_position,
370 int64_t total_size,
371 OnUploadProgressCallback callback) {}
372
373 void NavigationURLLoaderNetworkService::OnReceiveCachedMetadata(
374 const std::vector<uint8_t>& data) {}
375
376 void NavigationURLLoaderNetworkService::OnTransferSizeUpdated(
377 int32_t transfer_size_diff) {}
378
379 void NavigationURLLoaderNetworkService::OnStartLoadingResponseBody( 386 void NavigationURLLoaderNetworkService::OnStartLoadingResponseBody(
380 mojo::ScopedDataPipeConsumerHandle body) { 387 mojo::ScopedDataPipeConsumerHandle body) {
381 DCHECK(response_); 388 DCHECK(response_);
382 389
383 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted", this, 390 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted", this,
384 "&NavigationURLLoaderNetworkService", this, "success", 391 "&NavigationURLLoaderNetworkService", this, "success",
385 true); 392 true);
386 393
387 // Temporarily, we pass both a stream (null) and the data pipe to the 394 // Temporarily, we pass both a stream (null) and the data pipe to the
388 // delegate until PlzNavigate has shipped and we can be comfortable fully 395 // delegate until PlzNavigate has shipped and we can be comfortable fully
(...skipping 10 matching lines...) Expand all
399 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted", 406 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted",
400 this, "&NavigationURLLoaderNetworkService", this, 407 this, "&NavigationURLLoaderNetworkService", this,
401 "success", false); 408 "success", false);
402 409
403 delegate_->OnRequestFailed(completion_status.exists_in_cache, 410 delegate_->OnRequestFailed(completion_status.exists_in_cache,
404 completion_status.error_code); 411 completion_status.error_code);
405 } 412 }
406 } 413 }
407 414
408 } // namespace content 415 } // namespace content
OLDNEW
« 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