Chromium Code Reviews| Index: content/browser/loader/async_resource_handler.cc |
| diff --git a/content/browser/loader/async_resource_handler.cc b/content/browser/loader/async_resource_handler.cc |
| index 3481fc561c5795a49defdb2e8e6cfda8844ca642..2701255c88237127f3d95934ec79c80c8e82893e 100644 |
| --- a/content/browser/loader/async_resource_handler.cc |
| +++ b/content/browser/loader/async_resource_handler.cc |
| @@ -211,7 +211,6 @@ AsyncResourceHandler::AsyncResourceHandler(net::URLRequest* request, |
| pending_data_count_(0), |
| allocation_size_(0), |
| total_read_body_bytes_(0), |
| - did_defer_(false), |
| has_checked_for_sufficient_resources_(false), |
| sent_received_response_msg_(false), |
| sent_data_buffer_msg_(false), |
| @@ -261,16 +260,15 @@ void AsyncResourceHandler::OnUploadProgressACK(int request_id) { |
| upload_progress_tracker_->OnAckReceived(); |
| } |
| -bool AsyncResourceHandler::OnRequestRedirected( |
| +void AsyncResourceHandler::OnRequestRedirected( |
| const net::RedirectInfo& redirect_info, |
| ResourceResponse* response, |
| - bool* defer) { |
| + std::unique_ptr<ResourceController> controller) { |
| ResourceMessageFilter* filter = GetFilter(); |
| - if (!filter) |
| - return false; |
| - |
| - *defer = did_defer_ = true; |
| - OnDefer(); |
| + if (!filter) { |
| + controller->Cancel(); |
| + return; |
| + } |
| NetLogObserver::PopulateResponseInfo(request(), response); |
| response->head.encoded_data_length = request()->GetTotalReceivedBytes(); |
| @@ -281,17 +279,24 @@ bool AsyncResourceHandler::OnRequestRedirected( |
| // cookies? The only case where it can change is top-level navigation requests |
| // and hopefully those will eventually all be owned by the browser. It's |
| // possible this is still needed while renderer-owned ones exist. |
| - return filter->Send(new ResourceMsg_ReceivedRedirect( |
| - GetRequestID(), redirect_info, response->head)); |
| + if (!filter->Send(new ResourceMsg_ReceivedRedirect( |
|
Charlie Harrison
2017/01/25 20:22:59
optional: would prefer reversed conditional.
mmenke
2017/01/25 22:07:58
Done. Interesting, my preference is for error cas
|
| + GetRequestID(), redirect_info, response->head))) { |
| + controller->Cancel(); |
| + } else { |
| + OnDefer(); |
| + HoldController(std::move(controller)); |
|
Charlie Harrison
2017/01/25 20:22:59
optional: I think OnDefer should call HoldControll
mmenke
2017/01/25 22:07:58
Done.
|
| + } |
| } |
| -bool AsyncResourceHandler::OnResponseStarted(ResourceResponse* response, |
| - bool* defer) { |
| +void AsyncResourceHandler::OnResponseStarted( |
| + ResourceResponse* response, |
| + std::unique_ptr<ResourceController> controller) { |
| // For changes to the main frame, inform the renderer of the new URL's |
| // per-host settings before the request actually commits. This way the |
| // renderer will be able to set these precisely at the time the |
| // request commits, avoiding the possibility of e.g. zooming the old content |
| // or of having to layout the new content twice. |
| + DCHECK(!has_controller()); |
| response_started_ticks_ = base::TimeTicks::Now(); |
| @@ -310,8 +315,10 @@ bool AsyncResourceHandler::OnResponseStarted(ResourceResponse* response, |
| } |
| ResourceMessageFilter* filter = GetFilter(); |
| - if (!filter) |
| - return false; |
| + if (!filter) { |
| + controller->Cancel(); |
| + return; |
| + } |
| NetLogObserver::PopulateResponseInfo(request(), response); |
| response->head.encoded_data_length = request()->raw_header_size(); |
| @@ -338,13 +345,17 @@ bool AsyncResourceHandler::OnResponseStarted(ResourceResponse* response, |
| } |
| inlining_helper_->OnResponseReceived(*response); |
| - return true; |
| + controller->Resume(); |
| } |
| -bool AsyncResourceHandler::OnWillStart(const GURL& url, bool* defer) { |
| +void AsyncResourceHandler::OnWillStart( |
| + const GURL& url, |
| + std::unique_ptr<ResourceController> controller) { |
| ResourceMessageFilter* filter = GetFilter(); |
| - if (!filter) |
| - return false; |
| + if (!filter) { |
| + controller->Cancel(); |
| + return; |
| + } |
| if (GetRequestInfo()->is_upload_progress_enabled() && |
| request()->has_upload()) { |
| @@ -354,14 +365,16 @@ bool AsyncResourceHandler::OnWillStart(const GURL& url, bool* defer) { |
| base::Unretained(this)), |
| request()); |
| } |
| - return true; |
| + controller->Resume(); |
| } |
| bool AsyncResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, |
| int* buf_size, |
| int min_size) { |
| + DCHECK(!has_controller()); |
| DCHECK_EQ(-1, min_size); |
| + // TODO(mmenke): Should fail with ERR_INSUFFICIENT_RESOURCES here. |
| if (!CheckForSufficientResource()) |
| return false; |
| @@ -383,15 +396,22 @@ bool AsyncResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, |
| return true; |
| } |
| -bool AsyncResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { |
| +void AsyncResourceHandler::OnReadCompleted( |
| + int bytes_read, |
| + std::unique_ptr<ResourceController> controller) { |
| + DCHECK(!has_controller()); |
| DCHECK_GE(bytes_read, 0); |
| - if (!bytes_read) |
| - return true; |
| + if (!bytes_read) { |
| + controller->Resume(); |
| + return; |
| + } |
| ResourceMessageFilter* filter = GetFilter(); |
| - if (!filter) |
| - return false; |
| + if (!filter) { |
| + controller->Cancel(); |
| + return; |
| + } |
| int encoded_data_length = CalculateEncodedDataLengthToReport(); |
| if (!first_chunk_read_) |
| @@ -401,9 +421,10 @@ bool AsyncResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { |
| // Return early if InliningHelper handled the received data. |
| if (inlining_helper_->SendInlinedDataIfApplicable( |
| - bytes_read, encoded_data_length, filter, |
| - GetRequestID())) |
| - return true; |
| + bytes_read, encoded_data_length, filter, GetRequestID())) { |
| + controller->Resume(); |
| + return; |
| + } |
| buffer_->ShrinkLastAllocation(bytes_read); |
| @@ -412,8 +433,10 @@ bool AsyncResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { |
| if (!sent_data_buffer_msg_) { |
| base::SharedMemoryHandle handle = base::SharedMemory::DuplicateHandle( |
| buffer_->GetSharedMemory().handle()); |
| - if (!base::SharedMemory::IsHandleValid(handle)) |
| - return false; |
| + if (!base::SharedMemory::IsHandleValid(handle)) { |
| + controller->Cancel(); |
| + return; |
| + } |
| filter->Send(new ResourceMsg_SetDataBuffer( |
| GetRequestID(), handle, buffer_->GetSharedMemory().mapped_size(), |
| filter->peer_pid())); |
| @@ -427,11 +450,11 @@ bool AsyncResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { |
| ++pending_data_count_; |
| if (!buffer_->CanAllocate()) { |
| - *defer = did_defer_ = true; |
| OnDefer(); |
| + HoldController(std::move(controller)); |
| + } else { |
| + controller->Resume(); |
| } |
| - |
| - return true; |
| } |
| void AsyncResourceHandler::OnDataDownloaded(int bytes_downloaded) { |
| @@ -446,10 +469,12 @@ void AsyncResourceHandler::OnDataDownloaded(int bytes_downloaded) { |
| void AsyncResourceHandler::OnResponseCompleted( |
| const net::URLRequestStatus& status, |
| - bool* defer) { |
| + std::unique_ptr<ResourceController> controller) { |
| ResourceMessageFilter* filter = GetFilter(); |
| - if (!filter) |
| + if (!filter) { |
| + controller->Resume(); |
| return; |
| + } |
| // Ensure sending the final upload progress message here, since |
| // OnResponseCompleted can be called without OnResponseStarted on cancellation |
| @@ -496,6 +521,7 @@ void AsyncResourceHandler::OnResponseCompleted( |
| if (status.is_success()) |
| RecordHistogram(); |
| + controller->Resume(); |
| } |
| bool AsyncResourceHandler::EnsureResourceBufferIsInitialized() { |
| @@ -511,10 +537,9 @@ bool AsyncResourceHandler::EnsureResourceBufferIsInitialized() { |
| } |
| void AsyncResourceHandler::ResumeIfDeferred() { |
| - if (did_defer_) { |
| - did_defer_ = false; |
| + if (has_controller()) { |
| request()->LogUnblocked(); |
| - controller()->Resume(); |
| + Resume(); |
| } |
| } |
| @@ -530,7 +555,6 @@ bool AsyncResourceHandler::CheckForSufficientResource() { |
| if (rdh_->HasSufficientResourcesForRequest(request())) |
| return true; |
| - controller()->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES); |
| return false; |
| } |