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

Side by Side Diff: content/browser/loader/navigation_url_loader_network_service.cc

Issue 2897063002: Network service: Implement URLLoader chaining for interceptors (Closed)
Patch Set: MaybeCreateLoaderFactory 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/debug/stack_trace.h"
9 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
10 #include "base/trace_event/trace_event.h" 11 #include "base/trace_event/trace_event.h"
11 #include "content/browser/appcache/appcache_navigation_handle.h" 12 #include "content/browser/appcache/appcache_navigation_handle.h"
12 #include "content/browser/blob_storage/chrome_blob_storage_context.h" 13 #include "content/browser/blob_storage/chrome_blob_storage_context.h"
13 #include "content/browser/frame_host/frame_tree_node.h" 14 #include "content/browser/frame_host/frame_tree_node.h"
14 #include "content/browser/frame_host/navigation_request_info.h" 15 #include "content/browser/frame_host/navigation_request_info.h"
15 #include "content/browser/loader/navigation_resource_handler.h" 16 #include "content/browser/loader/navigation_resource_handler.h"
16 #include "content/browser/loader/navigation_resource_throttle.h" 17 #include "content/browser/loader/navigation_resource_throttle.h"
17 #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"
18 #include "content/browser/resource_context_impl.h" 20 #include "content/browser/resource_context_impl.h"
19 #include "content/browser/service_worker/service_worker_navigation_handle.h" 21 #include "content/browser/service_worker/service_worker_navigation_handle.h"
20 #include "content/browser/service_worker/service_worker_navigation_handle_core.h " 22 #include "content/browser/service_worker/service_worker_navigation_handle_core.h "
21 #include "content/browser/service_worker/service_worker_request_handler.h" 23 #include "content/browser/service_worker/service_worker_request_handler.h"
22 #include "content/browser/storage_partition_impl.h" 24 #include "content/browser/storage_partition_impl.h"
23 #include "content/browser/url_loader_factory_getter.h" 25 #include "content/browser/url_loader_factory_getter.h"
24 #include "content/browser/web_contents/web_contents_impl.h" 26 #include "content/browser/web_contents/web_contents_impl.h"
25 #include "content/browser/webui/url_data_manager_backend.h" 27 #include "content/browser/webui/url_data_manager_backend.h"
26 #include "content/browser/webui/web_ui_url_loader_factory.h" 28 #include "content/browser/webui/web_ui_url_loader_factory.h"
27 #include "content/public/browser/browser_context.h" 29 #include "content/public/browser/browser_context.h"
(...skipping 19 matching lines...) Expand all
47 WebContents* GetWebContentsFromFrameTreeNodeID(int frame_tree_node_id) { 49 WebContents* GetWebContentsFromFrameTreeNodeID(int frame_tree_node_id) {
48 DCHECK_CURRENTLY_ON(BrowserThread::UI); 50 DCHECK_CURRENTLY_ON(BrowserThread::UI);
49 FrameTreeNode* frame_tree_node = 51 FrameTreeNode* frame_tree_node =
50 FrameTreeNode::GloballyFindByID(frame_tree_node_id); 52 FrameTreeNode::GloballyFindByID(frame_tree_node_id);
51 if (!frame_tree_node) 53 if (!frame_tree_node)
52 return nullptr; 54 return nullptr;
53 55
54 return WebContentsImpl::FromFrameTreeNode(frame_tree_node); 56 return WebContentsImpl::FromFrameTreeNode(frame_tree_node);
55 } 57 }
56 58
57 void PrepareNavigationStartOnIO(
58 std::unique_ptr<ResourceRequest> resource_request,
59 ResourceContext* resource_context,
60 ServiceWorkerNavigationHandleCore* service_worker_navigation_handle_core,
61 AppCacheNavigationHandleCore* appcache_handle_core,
62 NavigationRequestInfo* request_info,
63 mojom::URLLoaderFactoryPtrInfo factory_from_ui,
64 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter,
65 const base::Callback<WebContents*(void)>& web_contents_getter,
66 mojom::URLLoaderAssociatedRequest url_loader_request,
67 mojom::URLLoaderClientPtr url_loader_client_to_pass,
68 std::unique_ptr<service_manager::Connector> connector) {
69 DCHECK_CURRENTLY_ON(BrowserThread::IO);
70
71 const ResourceType resource_type = request_info->is_main_frame
72 ? RESOURCE_TYPE_MAIN_FRAME
73 : RESOURCE_TYPE_SUB_FRAME;
74
75 if (resource_request->request_body) {
76 AttachRequestBodyBlobDataHandles(resource_request->request_body.get(),
77 resource_context);
78 }
79
80 mojom::URLLoaderFactoryPtr url_loader_factory_ptr;
81 if (service_worker_navigation_handle_core) {
82 RequestContextFrameType frame_type =
83 request_info->is_main_frame ? REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL
84 : REQUEST_CONTEXT_FRAME_TYPE_NESTED;
85
86 storage::BlobStorageContext* blob_storage_context = GetBlobStorageContext(
87 GetChromeBlobStorageContextForResourceContext(resource_context));
88 url_loader_factory_ptr =
89 ServiceWorkerRequestHandler::InitializeForNavigationNetworkService(
90 *resource_request, resource_context,
91 service_worker_navigation_handle_core, blob_storage_context,
92 request_info->begin_params.skip_service_worker, resource_type,
93 request_info->begin_params.request_context_type, frame_type,
94 request_info->are_ancestors_secure,
95 request_info->common_params.post_data, web_contents_getter);
96 }
97
98 // If we haven't gotten one from the above, then use the one the UI thread
99 // gave us, or otherwise fallback to the default.
100 mojom::URLLoaderFactory* factory;
101 if (url_loader_factory_ptr) {
102 factory = url_loader_factory_ptr.get();
103 } else {
104 if (factory_from_ui.is_valid()) {
105 url_loader_factory_ptr.Bind(std::move(factory_from_ui));
106 factory = url_loader_factory_ptr.get();
107 } else {
108 if (appcache_handle_core) {
109 factory = url_loader_factory_getter->GetAppCacheFactory()->get();
110 } else {
111 factory = url_loader_factory_getter->GetNetworkFactory()->get();
112 }
113 }
114 }
115
116 factory->CreateLoaderAndStart(
117 std::move(url_loader_request), 0 /* routing_id? */, 0 /* request_id? */,
118 mojom::kURLLoadOptionSendSSLInfo, *resource_request,
119 std::move(url_loader_client_to_pass));
120 }
121
122 } // namespace 59 } // namespace
123 60
61 class NavigationURLLoaderNetworkService::URLLoaderRequestController {
62 public:
63 URLLoaderRequestController(std::unique_ptr<ResourceRequest> resource_request,
64 ResourceContext* resource_context)
65 : resource_request_(std::move(resource_request)),
66 resource_context_(resource_context) {}
scottmg 2017/05/26 20:19:27 Don't forget to initialize fallback_factory_(nullp
kinuko 2017/05/29 06:12:23 Done.
67
68 virtual ~URLLoaderRequestController() {
69 DCHECK_CURRENTLY_ON(BrowserThread::IO);
70 }
71
72 void Start(
73 ServiceWorkerNavigationHandleCore* service_worker_navigation_handle_core,
74 AppCacheNavigationHandleCore* appcache_handle_core,
75 std::unique_ptr<NavigationRequestInfo> request_info,
76 mojom::URLLoaderFactoryPtrInfo factory_for_webui,
77 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter,
78 const base::Callback<WebContents*(void)>& web_contents_getter,
79 mojom::URLLoaderAssociatedRequest url_loader_request,
80 mojom::URLLoaderClientPtr url_loader_client_ptr,
81 std::unique_ptr<service_manager::Connector> connector) {
82 DCHECK_CURRENTLY_ON(BrowserThread::IO);
83 const ResourceType resource_type = request_info->is_main_frame
84 ? RESOURCE_TYPE_MAIN_FRAME
85 : RESOURCE_TYPE_SUB_FRAME;
86
87 if (resource_request_->request_body) {
88 AttachRequestBodyBlobDataHandles(resource_request_->request_body.get(),
89 resource_context_);
90 }
91
92 // Requests to WebUI scheme won't get redirected to/from other schemes
93 // or be intercepted, so we just let it go here.
94 if (factory_for_webui.is_valid()) {
95 fallback_factory_ptr_.Bind(std::move(factory_for_webui));
96 fallback_factory_ = fallback_factory_ptr_.get();
97 Restart(std::move(url_loader_request), std::move(url_loader_client_ptr));
michaeln 2017/05/26 17:42:27 Would it work to more directly invoke factory_for_
kinuko 2017/05/29 06:12:24 Done.
98 return;
99 }
100
101 DCHECK(handlers_.empty());
102 if (service_worker_navigation_handle_core) {
103 RequestContextFrameType frame_type =
104 request_info->is_main_frame ? REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL
105 : REQUEST_CONTEXT_FRAME_TYPE_NESTED;
106
107 storage::BlobStorageContext* blob_storage_context = GetBlobStorageContext(
108 GetChromeBlobStorageContextForResourceContext(resource_context_));
109 std::unique_ptr<URLLoaderRequestHandler> service_worker_handler =
110 ServiceWorkerRequestHandler::InitializeForNavigationNetworkService(
111 *resource_request_, resource_context_,
112 service_worker_navigation_handle_core, blob_storage_context,
113 request_info->begin_params.skip_service_worker, resource_type,
114 request_info->begin_params.request_context_type, frame_type,
115 request_info->are_ancestors_secure,
116 request_info->common_params.post_data, web_contents_getter);
117 if (service_worker_handler)
118 handlers_.push_back(std::move(service_worker_handler));
119 }
120
121 if (appcache_handle_core) {
122 // TODO: add appcache code here.
123 }
124
125 DCHECK(!fallback_factory_);
126 fallback_factory_ = url_loader_factory_getter->GetNetworkFactory()->get();
michaeln 2017/05/26 17:42:27 consider calling this the network_factory, i think
kinuko 2017/05/29 06:12:23 Done.
127
128 Restart(std::move(url_loader_request), std::move(url_loader_client_ptr));
129 }
130
131 // This could be called multiple times.
132 void Restart(mojom::URLLoaderAssociatedRequest url_loader_request,
133 mojom::URLLoaderClientPtr url_loader_client_ptr) {
134 url_loader_request_ = std::move(url_loader_request);
135 url_loader_client_ptr_ = std::move(url_loader_client_ptr);
136 handler_index_ = 0;
137 MaybeStartLoader(nullptr);
138 }
139
140 void MaybeStartLoader(mojom::URLLoaderFactory* factory) {
141 DCHECK(url_loader_client_ptr_.is_bound());
142
143 if (factory) {
144 factory->CreateLoaderAndStart(
145 std::move(url_loader_request_), 0 /* routing_id? */,
146 0 /* request_id? */, mojom::kURLLoadOptionSendSSLInfo,
147 *resource_request_, std::move(url_loader_client_ptr_));
148 return;
149 }
150
151 if (handler_index_ < handlers_.size()) {
152 handlers_[handler_index_++]->MaybeCreateLoaderFactory(
153 *resource_request_, resource_context_,
154 base::BindOnce(&URLLoaderRequestController::MaybeStartLoader,
155 base::Unretained(this)));
156 return;
157 }
158
159 DCHECK_EQ(handlers_.size(), handler_index_);
160 DCHECK(fallback_factory_ != nullptr);
161 MaybeStartLoader(fallback_factory_);
162 }
163
164 private:
165 std::vector<std::unique_ptr<URLLoaderRequestHandler>> handlers_;
166 size_t handler_index_ = 0;
167
168 std::unique_ptr<ResourceRequest> resource_request_;
169 ResourceContext* resource_context_;
170
171 mojom::URLLoaderFactoryPtr fallback_factory_ptr_;
172 mojom::URLLoaderFactory* fallback_factory_;
173
174 // Kept around until we create a loader.
175 mojom::URLLoaderAssociatedRequest url_loader_request_;
176 mojom::URLLoaderClientPtr url_loader_client_ptr_;
177
178 DISALLOW_COPY_AND_ASSIGN(URLLoaderRequestController);
179 };
180
124 NavigationURLLoaderNetworkService::NavigationURLLoaderNetworkService( 181 NavigationURLLoaderNetworkService::NavigationURLLoaderNetworkService(
125 ResourceContext* resource_context, 182 ResourceContext* resource_context,
126 StoragePartition* storage_partition, 183 StoragePartition* storage_partition,
127 std::unique_ptr<NavigationRequestInfo> request_info, 184 std::unique_ptr<NavigationRequestInfo> request_info,
128 std::unique_ptr<NavigationUIData> navigation_ui_data, 185 std::unique_ptr<NavigationUIData> navigation_ui_data,
129 ServiceWorkerNavigationHandle* service_worker_navigation_handle, 186 ServiceWorkerNavigationHandle* service_worker_navigation_handle,
130 AppCacheNavigationHandle* appcache_handle, 187 AppCacheNavigationHandle* appcache_handle,
131 NavigationURLLoaderDelegate* delegate) 188 NavigationURLLoaderDelegate* delegate)
132 : delegate_(delegate), 189 : delegate_(delegate), binding_(this) {
133 binding_(this),
134 request_info_(std::move(request_info)) {
135 DCHECK_CURRENTLY_ON(BrowserThread::UI); 190 DCHECK_CURRENTLY_ON(BrowserThread::UI);
136 191
137 TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP1( 192 TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP1(
138 "navigation", "Navigation timeToResponseStarted", this, 193 "navigation", "Navigation timeToResponseStarted", this,
139 request_info_->common_params.navigation_start, "FrameTreeNode id", 194 request_info->common_params.navigation_start, "FrameTreeNode id",
140 request_info_->frame_tree_node_id); 195 request_info->frame_tree_node_id);
141 196
142 // TODO(scottmg): Port over stuff from RDHI::BeginNavigationRequest() here. 197 // TODO(scottmg): Port over stuff from RDHI::BeginNavigationRequest() here.
143 auto new_request = base::MakeUnique<ResourceRequest>(); 198 auto new_request = base::MakeUnique<ResourceRequest>();
144 199
145 new_request->method = request_info_->common_params.method; 200 new_request->method = request_info->common_params.method;
146 new_request->url = request_info_->common_params.url; 201 new_request->url = request_info->common_params.url;
147 new_request->first_party_for_cookies = request_info_->first_party_for_cookies; 202 new_request->first_party_for_cookies = request_info->first_party_for_cookies;
148 new_request->priority = net::HIGHEST; 203 new_request->priority = net::HIGHEST;
149 204
150 // The code below to set fields like request_initiator, referrer, etc has 205 // The code below to set fields like request_initiator, referrer, etc has
151 // been copied from ResourceDispatcherHostImpl. We did not refactor the 206 // been copied from ResourceDispatcherHostImpl. We did not refactor the
152 // common code into a function, because RDHI uses accessor functions on the 207 // common code into a function, because RDHI uses accessor functions on the
153 // URLRequest class to set these fields. whereas we use ResourceRequest here. 208 // URLRequest class to set these fields. whereas we use ResourceRequest here.
154 new_request->request_initiator = request_info_->begin_params.initiator_origin; 209 new_request->request_initiator = request_info->begin_params.initiator_origin;
155 new_request->referrer = request_info_->common_params.referrer.url; 210 new_request->referrer = request_info->common_params.referrer.url;
156 new_request->referrer_policy = request_info_->common_params.referrer.policy; 211 new_request->referrer_policy = request_info->common_params.referrer.policy;
157 new_request->headers = request_info_->begin_params.headers; 212 new_request->headers = request_info->begin_params.headers;
158 213
159 int load_flags = request_info_->begin_params.load_flags; 214 int load_flags = request_info->begin_params.load_flags;
160 load_flags |= net::LOAD_VERIFY_EV_CERT; 215 load_flags |= net::LOAD_VERIFY_EV_CERT;
161 if (request_info_->is_main_frame) 216 if (request_info->is_main_frame)
162 load_flags |= net::LOAD_MAIN_FRAME_DEPRECATED; 217 load_flags |= net::LOAD_MAIN_FRAME_DEPRECATED;
163 218
164 // Sync loads should have maximum priority and should be the only 219 // Sync loads should have maximum priority and should be the only
165 // requests that have the ignore limits flag set. 220 // requests that have the ignore limits flag set.
166 DCHECK(!(load_flags & net::LOAD_IGNORE_LIMITS)); 221 DCHECK(!(load_flags & net::LOAD_IGNORE_LIMITS));
167 222
168 new_request->load_flags = load_flags; 223 new_request->load_flags = load_flags;
169 224
170 new_request->request_body = request_info_->common_params.post_data.get(); 225 new_request->request_body = request_info->common_params.post_data.get();
226
227 int frame_tree_node_id = request_info->frame_tree_node_id;
171 228
172 mojom::URLLoaderAssociatedRequest loader_associated_request = 229 mojom::URLLoaderAssociatedRequest loader_associated_request =
173 mojo::MakeRequest(&url_loader_associated_ptr_); 230 mojo::MakeRequest(&url_loader_associated_ptr_);
174 mojom::URLLoaderClientPtr url_loader_client_ptr_to_pass; 231 mojom::URLLoaderClientPtr url_loader_client_ptr_to_pass;
175 binding_.Bind(mojo::MakeRequest(&url_loader_client_ptr_to_pass)); 232 binding_.Bind(mojo::MakeRequest(&url_loader_client_ptr_to_pass));
176 233
177 // Check if a web UI scheme wants to handle this request. 234 // Check if a web UI scheme wants to handle this request.
178 mojom::URLLoaderFactoryPtrInfo factory_ptr_info; 235 mojom::URLLoaderFactoryPtrInfo factory_ptr_info;
michaeln 2017/05/26 17:42:27 nit: maybe rename this factory_for_webui to line u
kinuko 2017/05/29 06:12:24 Done.
179 236
180 const auto& schemes = URLDataManagerBackend::GetWebUISchemes(); 237 const auto& schemes = URLDataManagerBackend::GetWebUISchemes();
181 if (std::find(schemes.begin(), schemes.end(), new_request->url.scheme()) != 238 if (std::find(schemes.begin(), schemes.end(), new_request->url.scheme()) !=
182 schemes.end()) { 239 schemes.end()) {
183 FrameTreeNode* frame_tree_node = 240 FrameTreeNode* frame_tree_node =
184 FrameTreeNode::GloballyFindByID(request_info_->frame_tree_node_id); 241 FrameTreeNode::GloballyFindByID(frame_tree_node_id);
185 factory_ptr_info = GetWebUIURLLoader(frame_tree_node).PassInterface(); 242 factory_ptr_info = GetWebUIURLLoader(frame_tree_node).PassInterface();
186 } 243 }
187 244
188 g_next_request_id--; 245 g_next_request_id--;
michaeln 2017/05/26 21:36:25 is this global is being decremented on the UI thre
kinuko 2017/05/29 06:12:23 Currently this one's bound to UI thread, we only u
189 246
247 DCHECK(!request_controller_);
248 request_controller_ = base::MakeUnique<URLLoaderRequestController>(
249 std::move(new_request), resource_context);
190 BrowserThread::PostTask( 250 BrowserThread::PostTask(
191 BrowserThread::IO, FROM_HERE, 251 BrowserThread::IO, FROM_HERE,
192 base::Bind(&PrepareNavigationStartOnIO, 252 base::Bind(
193 base::Passed(std::move(new_request)), resource_context, 253 &URLLoaderRequestController::Start,
194 service_worker_navigation_handle 254 base::Unretained(request_controller_.get()),
195 ? service_worker_navigation_handle->core() 255 service_worker_navigation_handle
196 : nullptr, 256 ? service_worker_navigation_handle->core()
197 appcache_handle ? appcache_handle->core() : nullptr, 257 : nullptr,
198 request_info_.get(), base::Passed(std::move(factory_ptr_info)), 258 appcache_handle ? appcache_handle->core() : nullptr,
199 static_cast<StoragePartitionImpl*>(storage_partition) 259 base::Passed(std::move(request_info)),
200 ->url_loader_factory_getter(), 260 base::Passed(std::move(factory_ptr_info)),
201 base::Bind(&GetWebContentsFromFrameTreeNodeID, 261 static_cast<StoragePartitionImpl*>(storage_partition)
202 request_info_->frame_tree_node_id), 262 ->url_loader_factory_getter(),
203 base::Passed(std::move(loader_associated_request)), 263 base::Bind(&GetWebContentsFromFrameTreeNodeID, frame_tree_node_id),
204 base::Passed(std::move(url_loader_client_ptr_to_pass)), 264 base::Passed(std::move(loader_associated_request)),
205 base::Passed(ServiceManagerConnection::GetForProcess() 265 base::Passed(std::move(url_loader_client_ptr_to_pass)),
206 ->GetConnector() 266 base::Passed(ServiceManagerConnection::GetForProcess()
207 ->Clone()))); 267 ->GetConnector()
268 ->Clone())));
208 } 269 }
209 270
210 NavigationURLLoaderNetworkService::~NavigationURLLoaderNetworkService() {} 271 NavigationURLLoaderNetworkService::~NavigationURLLoaderNetworkService() {
272 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE,
273 request_controller_.release());
274 }
211 275
212 void NavigationURLLoaderNetworkService::FollowRedirect() { 276 void NavigationURLLoaderNetworkService::FollowRedirect() {
213 url_loader_associated_ptr_->FollowRedirect(); 277 url_loader_associated_ptr_->FollowRedirect();
214 } 278 }
215 279
216 void NavigationURLLoaderNetworkService::ProceedWithResponse() {} 280 void NavigationURLLoaderNetworkService::ProceedWithResponse() {}
217 281
218 void NavigationURLLoaderNetworkService::OnReceiveResponse( 282 void NavigationURLLoaderNetworkService::OnReceiveResponse(
219 const ResourceResponseHead& head, 283 const ResourceResponseHead& head,
220 const base::Optional<net::SSLInfo>& ssl_info, 284 const base::Optional<net::SSLInfo>& ssl_info,
221 mojom::DownloadedTempFilePtr downloaded_file) { 285 mojom::DownloadedTempFilePtr downloaded_file) {
222 // TODO(scottmg): This needs to do more of what 286 // TODO(scottmg): This needs to do more of what
223 // NavigationResourceHandler::OnReponseStarted() does. Or maybe in 287 // NavigationResourceHandler::OnReponseStarted() does. Or maybe in
224 // OnStartLoadingResponseBody(). 288 // OnStartLoadingResponseBody().
225 if (ssl_info && ssl_info->cert) 289 if (ssl_info && ssl_info->cert)
226 NavigationResourceHandler::GetSSLStatusForRequest(*ssl_info, &ssl_status_); 290 NavigationResourceHandler::GetSSLStatusForRequest(*ssl_info, &ssl_status_);
227 response_ = base::MakeRefCounted<ResourceResponse>(); 291 response_ = base::MakeRefCounted<ResourceResponse>();
228 response_->head = head; 292 response_->head = head;
229 } 293 }
230 294
231 void NavigationURLLoaderNetworkService::OnReceiveRedirect( 295 void NavigationURLLoaderNetworkService::OnReceiveRedirect(
232 const net::RedirectInfo& redirect_info, 296 const net::RedirectInfo& redirect_info,
233 const ResourceResponseHead& head) { 297 const ResourceResponseHead& head) {
234 DCHECK_CURRENTLY_ON(BrowserThread::UI); 298 DCHECK_CURRENTLY_ON(BrowserThread::UI);
299 // TODO(kinuko): Perform the necessary check and call
300 // URLLoaderRequestController::Restart with the new URL??
235 scoped_refptr<ResourceResponse> response(new ResourceResponse()); 301 scoped_refptr<ResourceResponse> response(new ResourceResponse());
236 response->head = head; 302 response->head = head;
237 delegate_->OnRequestRedirected(redirect_info, response); 303 delegate_->OnRequestRedirected(redirect_info, response);
238 } 304 }
239 305
240 void NavigationURLLoaderNetworkService::OnDataDownloaded( 306 void NavigationURLLoaderNetworkService::OnDataDownloaded(
241 int64_t data_length, 307 int64_t data_length,
242 int64_t encoded_length) {} 308 int64_t encoded_length) {}
243 309
244 void NavigationURLLoaderNetworkService::OnUploadProgress( 310 void NavigationURLLoaderNetworkService::OnUploadProgress(
(...skipping 13 matching lines...) Expand all
258 324
259 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted", this, 325 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted", this,
260 "&NavigationURLLoaderNetworkService", this, "success", 326 "&NavigationURLLoaderNetworkService", this, "success",
261 true); 327 true);
262 328
263 // Temporarily, we pass both a stream (null) and the data pipe to the 329 // Temporarily, we pass both a stream (null) and the data pipe to the
264 // delegate until PlzNavigate has shipped and we can be comfortable fully 330 // delegate until PlzNavigate has shipped and we can be comfortable fully
265 // switching to the data pipe. 331 // switching to the data pipe.
266 delegate_->OnResponseStarted(response_, nullptr, std::move(body), ssl_status_, 332 delegate_->OnResponseStarted(response_, nullptr, std::move(body), ssl_status_,
267 std::unique_ptr<NavigationData>(), 333 std::unique_ptr<NavigationData>(),
268 GlobalRequestID(-1, g_next_request_id), 334 GlobalRequestID(-1, g_next_request_id),
michaeln 2017/05/26 21:36:25 i was assuming we're on the IO thread here, but ma
kinuko 2017/05/29 06:12:24 Yep.
269 false /* is_download? */, false /* is_stream */); 335 false /* is_download? */, false /* is_stream */);
270 } 336 }
271 337
272 void NavigationURLLoaderNetworkService::OnComplete( 338 void NavigationURLLoaderNetworkService::OnComplete(
273 const ResourceRequestCompletionStatus& completion_status) { 339 const ResourceRequestCompletionStatus& completion_status) {
274 if (completion_status.error_code != net::OK) { 340 if (completion_status.error_code != net::OK) {
275 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted", 341 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted",
276 this, "&NavigationURLLoaderNetworkService", this, 342 this, "&NavigationURLLoaderNetworkService", this,
277 "success", false); 343 "success", false);
278 344
279 delegate_->OnRequestFailed(completion_status.exists_in_cache, 345 delegate_->OnRequestFailed(completion_status.exists_in_cache,
280 completion_status.error_code); 346 completion_status.error_code);
281 } 347 }
282 } 348 }
283 349
284 } // namespace content 350 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698