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

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

Issue 2526983002: Refactor ResourceHandler API. (Closed)
Patch Set: Fix merge Created 3 years, 11 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/mojo_async_resource_handler.h" 5 #include "content/browser/loader/mojo_async_resource_handler.h"
6 6
7 #include <utility> 7 #include <utility>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 124
125 GetRequestInfo()->set_on_transfer(base::Bind( 125 GetRequestInfo()->set_on_transfer(base::Bind(
126 &MojoAsyncResourceHandler::OnTransfer, weak_factory_.GetWeakPtr())); 126 &MojoAsyncResourceHandler::OnTransfer, weak_factory_.GetWeakPtr()));
127 } 127 }
128 128
129 MojoAsyncResourceHandler::~MojoAsyncResourceHandler() { 129 MojoAsyncResourceHandler::~MojoAsyncResourceHandler() {
130 if (has_checked_for_sufficient_resources_) 130 if (has_checked_for_sufficient_resources_)
131 rdh_->FinishedWithResourcesForRequest(request()); 131 rdh_->FinishedWithResourcesForRequest(request());
132 } 132 }
133 133
134 bool MojoAsyncResourceHandler::OnRequestRedirected( 134 void MojoAsyncResourceHandler::OnRequestRedirected(
135 const net::RedirectInfo& redirect_info, 135 const net::RedirectInfo& redirect_info,
136 ResourceResponse* response, 136 ResourceResponse* response,
137 bool* defer) { 137 std::unique_ptr<ResourceController> controller) {
138 // Unlike OnResponseStarted, OnRequestRedirected will NOT be preceded by 138 // Unlike OnResponseStarted, OnRequestRedirected will NOT be preceded by
139 // OnWillRead. 139 // OnWillRead.
140 DCHECK(!has_controller());
140 DCHECK(!shared_writer_); 141 DCHECK(!shared_writer_);
141 142
142 *defer = true;
143 request()->LogBlockedBy("MojoAsyncResourceHandler"); 143 request()->LogBlockedBy("MojoAsyncResourceHandler");
144 HoldController(std::move(controller));
144 did_defer_on_redirect_ = true; 145 did_defer_on_redirect_ = true;
145 146
146 NetLogObserver::PopulateResponseInfo(request(), response); 147 NetLogObserver::PopulateResponseInfo(request(), response);
147 response->head.encoded_data_length = request()->GetTotalReceivedBytes(); 148 response->head.encoded_data_length = request()->GetTotalReceivedBytes();
148 response->head.request_start = request()->creation_time(); 149 response->head.request_start = request()->creation_time();
149 response->head.response_start = base::TimeTicks::Now(); 150 response->head.response_start = base::TimeTicks::Now();
150 // TODO(davidben): Is it necessary to pass the new first party URL for 151 // TODO(davidben): Is it necessary to pass the new first party URL for
151 // cookies? The only case where it can change is top-level navigation requests 152 // cookies? The only case where it can change is top-level navigation requests
152 // and hopefully those will eventually all be owned by the browser. It's 153 // and hopefully those will eventually all be owned by the browser. It's
153 // possible this is still needed while renderer-owned ones exist. 154 // possible this is still needed while renderer-owned ones exist.
154 url_loader_client_->OnReceiveRedirect(redirect_info, response->head); 155 url_loader_client_->OnReceiveRedirect(redirect_info, response->head);
155 return true;
156 } 156 }
157 157
158 bool MojoAsyncResourceHandler::OnResponseStarted(ResourceResponse* response, 158 void MojoAsyncResourceHandler::OnResponseStarted(
159 bool* defer) { 159 ResourceResponse* response,
160 std::unique_ptr<ResourceController> controller) {
161 DCHECK(!has_controller());
162
160 const ResourceRequestInfoImpl* info = GetRequestInfo(); 163 const ResourceRequestInfoImpl* info = GetRequestInfo();
161 164
162 if (rdh_->delegate()) { 165 if (rdh_->delegate()) {
163 rdh_->delegate()->OnResponseStarted(request(), info->GetContext(), 166 rdh_->delegate()->OnResponseStarted(request(), info->GetContext(),
164 response); 167 response);
165 } 168 }
166 169
167 NetLogObserver::PopulateResponseInfo(request(), response); 170 NetLogObserver::PopulateResponseInfo(request(), response);
168 response->head.encoded_data_length = request()->raw_header_size(); 171 response->head.encoded_data_length = request()->raw_header_size();
169 reported_total_received_bytes_ = response->head.encoded_data_length; 172 reported_total_received_bytes_ = response->head.encoded_data_length;
(...skipping 13 matching lines...) Expand all
183 url_loader_client_->OnReceiveResponse(response->head, 186 url_loader_client_->OnReceiveResponse(response->head,
184 std::move(downloaded_file_ptr)); 187 std::move(downloaded_file_ptr));
185 188
186 net::IOBufferWithSize* metadata = GetResponseMetadata(request()); 189 net::IOBufferWithSize* metadata = GetResponseMetadata(request());
187 if (metadata) { 190 if (metadata) {
188 const uint8_t* data = reinterpret_cast<const uint8_t*>(metadata->data()); 191 const uint8_t* data = reinterpret_cast<const uint8_t*>(metadata->data());
189 192
190 url_loader_client_->OnReceiveCachedMetadata( 193 url_loader_client_->OnReceiveCachedMetadata(
191 std::vector<uint8_t>(data, data + metadata->size())); 194 std::vector<uint8_t>(data, data + metadata->size()));
192 } 195 }
193 return true; 196
197 controller->Resume();
194 } 198 }
195 199
196 bool MojoAsyncResourceHandler::OnWillStart(const GURL& url, bool* defer) { 200 void MojoAsyncResourceHandler::OnWillStart(
197 return true; 201 const GURL& url,
202 std::unique_ptr<ResourceController> controller) {
203 controller->Resume();
198 } 204 }
199 205
200 bool MojoAsyncResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, 206 bool MojoAsyncResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf,
201 int* buf_size, 207 int* buf_size,
202 int min_size) { 208 int min_size) {
203 DCHECK_EQ(-1, min_size); 209 DCHECK_EQ(-1, min_size);
204 210
211 // TODO(mmenke): Cancel with net::ERR_INSUFFICIENT_RESOURCES instead.
205 if (!CheckForSufficientResource()) 212 if (!CheckForSufficientResource())
206 return false; 213 return false;
207 214
208 if (!shared_writer_) { 215 if (!shared_writer_) {
209 MojoCreateDataPipeOptions options; 216 MojoCreateDataPipeOptions options;
210 options.struct_size = sizeof(MojoCreateDataPipeOptions); 217 options.struct_size = sizeof(MojoCreateDataPipeOptions);
211 options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE; 218 options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
212 options.element_num_bytes = 1; 219 options.element_num_bytes = 1;
213 options.capacity_num_bytes = g_allocation_size; 220 options.capacity_num_bytes = g_allocation_size;
214 mojo::DataPipe data_pipe(options); 221 mojo::DataPipe data_pipe(options);
(...skipping 27 matching lines...) Expand all
242 is_using_io_buffer_not_from_writer_ = true; 249 is_using_io_buffer_not_from_writer_ = true;
243 buffer_ = new net::IOBufferWithSize(kMinAllocationSize); 250 buffer_ = new net::IOBufferWithSize(kMinAllocationSize);
244 } 251 }
245 252
246 DCHECK_EQ(0u, buffer_offset_); 253 DCHECK_EQ(0u, buffer_offset_);
247 *buf = buffer_; 254 *buf = buffer_;
248 *buf_size = buffer_->size(); 255 *buf_size = buffer_->size();
249 return true; 256 return true;
250 } 257 }
251 258
252 bool MojoAsyncResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { 259 void MojoAsyncResourceHandler::OnReadCompleted(
260 int bytes_read,
261 std::unique_ptr<ResourceController> controller) {
262 DCHECK(!has_controller());
253 DCHECK_GE(bytes_read, 0); 263 DCHECK_GE(bytes_read, 0);
254 DCHECK(buffer_); 264 DCHECK(buffer_);
255 265
256 if (!bytes_read) 266 if (!bytes_read) {
257 return true; 267 controller->Resume();
268 return;
269 }
258 270
259 const ResourceRequestInfoImpl* info = GetRequestInfo(); 271 const ResourceRequestInfoImpl* info = GetRequestInfo();
260 if (info->ShouldReportRawHeaders()) { 272 if (info->ShouldReportRawHeaders()) {
261 auto transfer_size_diff = CalculateRecentlyReceivedBytes(); 273 auto transfer_size_diff = CalculateRecentlyReceivedBytes();
262 if (transfer_size_diff > 0) 274 if (transfer_size_diff > 0)
263 url_loader_client_->OnTransferSizeUpdated(transfer_size_diff); 275 url_loader_client_->OnTransferSizeUpdated(transfer_size_diff);
264 } 276 }
265 277
266 if (is_using_io_buffer_not_from_writer_) { 278 if (is_using_io_buffer_not_from_writer_) {
267 // Couldn't allocate a buffer on the data pipe in OnWillRead. 279 // Couldn't allocate a buffer on the data pipe in OnWillRead.
268 DCHECK_EQ(0u, buffer_bytes_read_); 280 DCHECK_EQ(0u, buffer_bytes_read_);
269 buffer_bytes_read_ = bytes_read; 281 buffer_bytes_read_ = bytes_read;
270 if (!CopyReadDataToDataPipe(defer)) 282 bool defer = false;
271 return false; 283 if (!CopyReadDataToDataPipe(&defer)) {
272 if (*defer) { 284 controller->Cancel();
285 return;
286 }
287 if (defer) {
273 request()->LogBlockedBy("MojoAsyncResourceHandler"); 288 request()->LogBlockedBy("MojoAsyncResourceHandler");
274 did_defer_on_writing_ = true; 289 did_defer_on_writing_ = true;
290 HoldController(std::move(controller));
291 return;
275 } 292 }
276 return true; 293 controller->Resume();
294 return;
277 } 295 }
278 296
279 if (EndWrite(bytes_read) != MOJO_RESULT_OK) 297 if (EndWrite(bytes_read) != MOJO_RESULT_OK) {
280 return false; 298 controller->Cancel();
299 return;
300 }
281 // Allocate a buffer for the next OnWillRead call here, because OnWillRead 301 // Allocate a buffer for the next OnWillRead call here, because OnWillRead
282 // doesn't have |defer| parameter. 302 // doesn't have |defer| parameter.
283 if (!AllocateWriterIOBuffer(&buffer_, defer)) 303 bool defer = false;
284 return false; 304 if (!AllocateWriterIOBuffer(&buffer_, &defer)) {
285 if (*defer) { 305 controller->Cancel();
306 return;
307 }
308 if (defer) {
286 request()->LogBlockedBy("MojoAsyncResourceHandler"); 309 request()->LogBlockedBy("MojoAsyncResourceHandler");
287 did_defer_on_writing_ = true; 310 did_defer_on_writing_ = true;
311 HoldController(std::move(controller));
312 return;
288 } 313 }
289 return true; 314
315 controller->Resume();
290 } 316 }
291 317
292 void MojoAsyncResourceHandler::OnDataDownloaded(int bytes_downloaded) { 318 void MojoAsyncResourceHandler::OnDataDownloaded(int bytes_downloaded) {
293 url_loader_client_->OnDataDownloaded(bytes_downloaded, 319 url_loader_client_->OnDataDownloaded(bytes_downloaded,
294 CalculateRecentlyReceivedBytes()); 320 CalculateRecentlyReceivedBytes());
295 } 321 }
296 322
297 void MojoAsyncResourceHandler::FollowRedirect() { 323 void MojoAsyncResourceHandler::FollowRedirect() {
298 if (!request()->status().is_success()) { 324 if (!request()->status().is_success()) {
299 DVLOG(1) << "FollowRedirect for invalid request"; 325 DVLOG(1) << "FollowRedirect for invalid request";
300 return; 326 return;
301 } 327 }
302 if (!did_defer_on_redirect_) { 328 if (!did_defer_on_redirect_) {
303 DVLOG(1) << "Malformed FollowRedirect request"; 329 DVLOG(1) << "Malformed FollowRedirect request";
304 ReportBadMessage("Malformed FollowRedirect request"); 330 ReportBadMessage("Malformed FollowRedirect request");
305 return; 331 return;
306 } 332 }
307 333
308 DCHECK(!did_defer_on_writing_); 334 DCHECK(!did_defer_on_writing_);
309 did_defer_on_redirect_ = false; 335 did_defer_on_redirect_ = false;
310 request()->LogUnblocked(); 336 request()->LogUnblocked();
311 controller()->Resume(); 337 Resume();
312 } 338 }
313 339
314 void MojoAsyncResourceHandler::OnWritableForTesting() { 340 void MojoAsyncResourceHandler::OnWritableForTesting() {
315 OnWritable(MOJO_RESULT_OK); 341 OnWritable(MOJO_RESULT_OK);
316 } 342 }
317 343
318 void MojoAsyncResourceHandler::SetAllocationSizeForTesting(size_t size) { 344 void MojoAsyncResourceHandler::SetAllocationSizeForTesting(size_t size) {
319 g_allocation_size = size; 345 g_allocation_size = size;
320 } 346 }
321 347
(...skipping 10 matching lines...) Expand all
332 return mojo::EndWriteDataRaw(shared_writer_->writer(), written); 358 return mojo::EndWriteDataRaw(shared_writer_->writer(), written);
333 } 359 }
334 360
335 net::IOBufferWithSize* MojoAsyncResourceHandler::GetResponseMetadata( 361 net::IOBufferWithSize* MojoAsyncResourceHandler::GetResponseMetadata(
336 net::URLRequest* request) { 362 net::URLRequest* request) {
337 return request->response_info().metadata.get(); 363 return request->response_info().metadata.get();
338 } 364 }
339 365
340 void MojoAsyncResourceHandler::OnResponseCompleted( 366 void MojoAsyncResourceHandler::OnResponseCompleted(
341 const net::URLRequestStatus& status, 367 const net::URLRequestStatus& status,
342 bool* defer) { 368 std::unique_ptr<ResourceController> controller) {
343 shared_writer_ = nullptr; 369 shared_writer_ = nullptr;
344 buffer_ = nullptr; 370 buffer_ = nullptr;
345 handle_watcher_.Cancel(); 371 handle_watcher_.Cancel();
346 372
347 const ResourceRequestInfoImpl* info = GetRequestInfo(); 373 const ResourceRequestInfoImpl* info = GetRequestInfo();
348 374
349 // TODO(gavinp): Remove this CHECK when we figure out the cause of 375 // TODO(gavinp): Remove this CHECK when we figure out the cause of
350 // http://crbug.com/124680 . This check mirrors closely check in 376 // http://crbug.com/124680 . This check mirrors closely check in
351 // WebURLLoaderImpl::OnCompletedRequest that routes this message to a WebCore 377 // WebURLLoaderImpl::OnCompletedRequest that routes this message to a WebCore
352 // ResourceHandleInternal which asserts on its state and crashes. By crashing 378 // ResourceHandleInternal which asserts on its state and crashes. By crashing
(...skipping 13 matching lines...) Expand all
366 ResourceRequestCompletionStatus request_complete_data; 392 ResourceRequestCompletionStatus request_complete_data;
367 request_complete_data.error_code = error_code; 393 request_complete_data.error_code = error_code;
368 request_complete_data.was_ignored_by_handler = was_ignored_by_handler; 394 request_complete_data.was_ignored_by_handler = was_ignored_by_handler;
369 request_complete_data.exists_in_cache = request()->response_info().was_cached; 395 request_complete_data.exists_in_cache = request()->response_info().was_cached;
370 request_complete_data.completion_time = base::TimeTicks::Now(); 396 request_complete_data.completion_time = base::TimeTicks::Now();
371 request_complete_data.encoded_data_length = 397 request_complete_data.encoded_data_length =
372 request()->GetTotalReceivedBytes(); 398 request()->GetTotalReceivedBytes();
373 request_complete_data.encoded_body_length = request()->GetRawBodyBytes(); 399 request_complete_data.encoded_body_length = request()->GetRawBodyBytes();
374 400
375 url_loader_client_->OnComplete(request_complete_data); 401 url_loader_client_->OnComplete(request_complete_data);
402 controller->Resume();
376 } 403 }
377 404
378 bool MojoAsyncResourceHandler::CopyReadDataToDataPipe(bool* defer) { 405 bool MojoAsyncResourceHandler::CopyReadDataToDataPipe(bool* defer) {
379 while (true) { 406 while (true) {
380 scoped_refptr<net::IOBufferWithSize> dest; 407 scoped_refptr<net::IOBufferWithSize> dest;
381 if (!AllocateWriterIOBuffer(&dest, defer)) 408 if (!AllocateWriterIOBuffer(&dest, defer))
382 return false; 409 return false;
383 if (*defer) 410 if (*defer)
384 return true; 411 return true;
385 if (buffer_bytes_read_ == 0) { 412 if (buffer_bytes_read_ == 0) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 } 448 }
422 449
423 bool MojoAsyncResourceHandler::CheckForSufficientResource() { 450 bool MojoAsyncResourceHandler::CheckForSufficientResource() {
424 if (has_checked_for_sufficient_resources_) 451 if (has_checked_for_sufficient_resources_)
425 return true; 452 return true;
426 has_checked_for_sufficient_resources_ = true; 453 has_checked_for_sufficient_resources_ = true;
427 454
428 if (rdh_->HasSufficientResourcesForRequest(request())) 455 if (rdh_->HasSufficientResourcesForRequest(request()))
429 return true; 456 return true;
430 457
431 controller()->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES);
432 return false; 458 return false;
433 } 459 }
434 460
435 void MojoAsyncResourceHandler::OnWritable(MojoResult result) { 461 void MojoAsyncResourceHandler::OnWritable(MojoResult result) {
436 if (!did_defer_on_writing_) 462 if (!did_defer_on_writing_)
437 return; 463 return;
464 DCHECK(has_controller());
438 DCHECK(!did_defer_on_redirect_); 465 DCHECK(!did_defer_on_redirect_);
439 did_defer_on_writing_ = false; 466 did_defer_on_writing_ = false;
440 467
441 if (is_using_io_buffer_not_from_writer_) { 468 if (is_using_io_buffer_not_from_writer_) {
442 // |buffer_| is set to a net::IOBufferWithSize. Write the buffer contents 469 // |buffer_| is set to a net::IOBufferWithSize. Write the buffer contents
443 // to the data pipe. 470 // to the data pipe.
444 DCHECK_GT(buffer_bytes_read_, 0u); 471 DCHECK_GT(buffer_bytes_read_, 0u);
445 if (!CopyReadDataToDataPipe(&did_defer_on_writing_)) { 472 if (!CopyReadDataToDataPipe(&did_defer_on_writing_)) {
446 controller()->CancelWithError(net::ERR_FAILED); 473 CancelWithError(net::ERR_FAILED);
447 return; 474 return;
448 } 475 }
449 } else { 476 } else {
450 // Allocate a buffer for the next OnWillRead call here. 477 // Allocate a buffer for the next OnWillRead call here.
451 if (!AllocateWriterIOBuffer(&buffer_, &did_defer_on_writing_)) { 478 if (!AllocateWriterIOBuffer(&buffer_, &did_defer_on_writing_)) {
452 controller()->CancelWithError(net::ERR_FAILED); 479 CancelWithError(net::ERR_FAILED);
453 return; 480 return;
454 } 481 }
455 } 482 }
456 483
457 if (did_defer_on_writing_) { 484 if (did_defer_on_writing_) {
458 // Continue waiting. 485 // Continue waiting.
459 return; 486 return;
460 } 487 }
461 request()->LogUnblocked(); 488 request()->LogUnblocked();
462 controller()->Resume(); 489 Resume();
463 } 490 }
464 491
465 void MojoAsyncResourceHandler::Cancel() { 492 void MojoAsyncResourceHandler::Cancel() {
466 const ResourceRequestInfoImpl* info = GetRequestInfo(); 493 const ResourceRequestInfoImpl* info = GetRequestInfo();
467 ResourceDispatcherHostImpl::Get()->CancelRequestFromRenderer( 494 ResourceDispatcherHostImpl::Get()->CancelRequestFromRenderer(
468 GlobalRequestID(info->GetChildID(), info->GetRequestID())); 495 GlobalRequestID(info->GetChildID(), info->GetRequestID()));
469 } 496 }
470 497
471 int64_t MojoAsyncResourceHandler::CalculateRecentlyReceivedBytes() { 498 int64_t MojoAsyncResourceHandler::CalculateRecentlyReceivedBytes() {
472 int64_t total_received_bytes = request()->GetTotalReceivedBytes(); 499 int64_t total_received_bytes = request()->GetTotalReceivedBytes();
(...skipping 12 matching lines...) Expand all
485 mojom::URLLoaderAssociatedRequest mojo_request, 512 mojom::URLLoaderAssociatedRequest mojo_request,
486 mojom::URLLoaderClientAssociatedPtr url_loader_client) { 513 mojom::URLLoaderClientAssociatedPtr url_loader_client) {
487 binding_.Unbind(); 514 binding_.Unbind();
488 binding_.Bind(std::move(mojo_request)); 515 binding_.Bind(std::move(mojo_request));
489 binding_.set_connection_error_handler( 516 binding_.set_connection_error_handler(
490 base::Bind(&MojoAsyncResourceHandler::Cancel, base::Unretained(this))); 517 base::Bind(&MojoAsyncResourceHandler::Cancel, base::Unretained(this)));
491 url_loader_client_ = std::move(url_loader_client); 518 url_loader_client_ = std::move(url_loader_client);
492 } 519 }
493 520
494 } // namespace content 521 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698