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 69df993843453e1105111ba1193f1c8dc8fe3edd..162345836480fbde18d24a78c0967b598b8a2334 100644 |
--- a/content/browser/loader/async_resource_handler.cc |
+++ b/content/browser/loader/async_resource_handler.cc |
@@ -296,16 +296,17 @@ void AsyncResourceHandler::ReportUploadProgress() { |
} |
} |
-bool AsyncResourceHandler::OnRequestRedirected( |
+void AsyncResourceHandler::OnRequestRedirected( |
const net::RedirectInfo& redirect_info, |
ResourceResponse* response, |
- bool* defer) { |
- const ResourceRequestInfoImpl* info = GetRequestInfo(); |
- if (!info->filter()) |
- return false; |
+ std::unique_ptr<ResourceController> controller) { |
+ DCHECK(!has_controller()); |
- *defer = did_defer_ = true; |
- OnDefer(); |
+ const ResourceRequestInfoImpl* info = GetRequestInfo(); |
+ if (!info->filter()) { |
+ controller->Cancel(); |
+ return; |
+ } |
NetLogObserver::PopulateResponseInfo(request(), response); |
response->head.encoded_data_length = request()->GetTotalReceivedBytes(); |
@@ -316,24 +317,34 @@ 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 info->filter()->Send(new ResourceMsg_ReceivedRedirect( |
- GetRequestID(), redirect_info, response->head)); |
+ if (!info->filter()->Send(new ResourceMsg_ReceivedRedirect( |
+ GetRequestID(), redirect_info, response->head))) { |
+ controller->Cancel(); |
+ } else { |
+ did_defer_ = true; |
+ OnDefer(); |
+ set_controller(std::move(controller)); |
+ } |
} |
-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(); |
progress_timer_.Stop(); |
const ResourceRequestInfoImpl* info = GetRequestInfo(); |
- if (!info->filter()) |
- return false; |
+ if (!info->filter()) { |
+ Cancel(); |
+ return; |
+ } |
// We want to send a final upload progress message prior to sending the |
// response complete message even if we're waiting for an ack to to a |
@@ -374,10 +385,12 @@ 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) { |
if (GetRequestInfo()->is_upload_progress_enabled() && |
request()->has_upload()) { |
ReportUploadProgress(); |
@@ -387,14 +400,16 @@ bool AsyncResourceHandler::OnWillStart(const GURL& url, bool* defer) { |
this, |
&AsyncResourceHandler::ReportUploadProgress); |
} |
- 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. |
Randy Smith (Not in Mondays)
2016/12/16 21:37:26
Is there a reason why CancelWithError() can't be c
mmenke
2016/12/22 16:29:35
We don't have a ResourceController to call it on.
|
if (!CheckForSufficientResource()) |
return false; |
@@ -416,15 +431,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_) |
@@ -436,16 +458,20 @@ 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, encoded_body_length, filter, |
- GetRequestID())) |
- return true; |
+ GetRequestID())) { |
+ controller->Resume(); |
+ return; |
+ } |
buffer_->ShrinkLastAllocation(bytes_read); |
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())); |
@@ -460,11 +486,12 @@ bool AsyncResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { |
++pending_data_count_; |
if (!buffer_->CanAllocate()) { |
- *defer = did_defer_ = true; |
+ did_defer_ = true; |
OnDefer(); |
+ set_controller(std::move(controller)); |
+ } else { |
+ controller->Resume(); |
} |
- |
- return true; |
} |
void AsyncResourceHandler::OnDataDownloaded(int bytes_downloaded) { |
@@ -479,10 +506,12 @@ void AsyncResourceHandler::OnDataDownloaded(int bytes_downloaded) { |
void AsyncResourceHandler::OnResponseCompleted( |
const net::URLRequestStatus& status, |
- bool* defer) { |
+ std::unique_ptr<ResourceController> controller) { |
const ResourceRequestInfoImpl* info = GetRequestInfo(); |
- if (!info->filter()) |
+ if (!info->filter()) { |
+ controller->Resume(); |
return; |
+ } |
// If we crash here, figure out what URL the renderer was requesting. |
// http://crbug.com/107692 |
@@ -519,6 +548,7 @@ void AsyncResourceHandler::OnResponseCompleted( |
if (status.is_success()) |
RecordHistogram(); |
+ controller->Resume(); |
} |
bool AsyncResourceHandler::EnsureResourceBufferIsInitialized() { |
@@ -537,7 +567,7 @@ void AsyncResourceHandler::ResumeIfDeferred() { |
if (did_defer_) { |
did_defer_ = false; |
request()->LogUnblocked(); |
- controller()->Resume(); |
+ Resume(); |
} |
} |
@@ -553,7 +583,6 @@ bool AsyncResourceHandler::CheckForSufficientResource() { |
if (rdh_->HasSufficientResourcesForRequest(request())) |
return true; |
- controller()->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES); |
return false; |
} |