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

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