| Index: content/browser/loader/mojo_async_resource_handler.cc
|
| diff --git a/content/browser/loader/mojo_async_resource_handler.cc b/content/browser/loader/mojo_async_resource_handler.cc
|
| index f1f0f4c1a3dd83cab24afe9d4a96f6b378eebe6a..4d42b594d8fb242bae964bca2532f09ce6a525c2 100644
|
| --- a/content/browser/loader/mojo_async_resource_handler.cc
|
| +++ b/content/browser/loader/mojo_async_resource_handler.cc
|
| @@ -145,16 +145,17 @@ MojoAsyncResourceHandler::~MojoAsyncResourceHandler() {
|
| rdh_->FinishedWithResourcesForRequest(request());
|
| }
|
|
|
| -bool MojoAsyncResourceHandler::OnRequestRedirected(
|
| +void MojoAsyncResourceHandler::OnRequestRedirected(
|
| const net::RedirectInfo& redirect_info,
|
| ResourceResponse* response,
|
| - bool* defer) {
|
| + std::unique_ptr<ResourceController> controller) {
|
| // Unlike OnResponseStarted, OnRequestRedirected will NOT be preceded by
|
| // OnWillRead.
|
| + DCHECK(!has_controller());
|
| DCHECK(!shared_writer_);
|
|
|
| - *defer = true;
|
| request()->LogBlockedBy("MojoAsyncResourceHandler");
|
| + HoldController(std::move(controller));
|
| did_defer_on_redirect_ = true;
|
|
|
| NetLogObserver::PopulateResponseInfo(request(), response);
|
| @@ -166,11 +167,13 @@ bool MojoAsyncResourceHandler::OnRequestRedirected(
|
| // and hopefully those will eventually all be owned by the browser. It's
|
| // possible this is still needed while renderer-owned ones exist.
|
| url_loader_client_->OnReceiveRedirect(redirect_info, response->head);
|
| - return true;
|
| }
|
|
|
| -bool MojoAsyncResourceHandler::OnResponseStarted(ResourceResponse* response,
|
| - bool* defer) {
|
| +void MojoAsyncResourceHandler::OnResponseStarted(
|
| + ResourceResponse* response,
|
| + std::unique_ptr<ResourceController> controller) {
|
| + DCHECK(!has_controller());
|
| +
|
| if (upload_progress_tracker_) {
|
| upload_progress_tracker_->OnUploadCompleted();
|
| upload_progress_tracker_ = nullptr;
|
| @@ -208,10 +211,13 @@ bool MojoAsyncResourceHandler::OnResponseStarted(ResourceResponse* response,
|
| url_loader_client_->OnReceiveCachedMetadata(
|
| std::vector<uint8_t>(data, data + metadata->size()));
|
| }
|
| - return true;
|
| +
|
| + controller->Resume();
|
| }
|
|
|
| -bool MojoAsyncResourceHandler::OnWillStart(const GURL& url, bool* defer) {
|
| +void MojoAsyncResourceHandler::OnWillStart(
|
| + const GURL& url,
|
| + std::unique_ptr<ResourceController> controller) {
|
| if (GetRequestInfo()->is_upload_progress_enabled() &&
|
| request()->has_upload()) {
|
| upload_progress_tracker_ = CreateUploadProgressTracker(
|
| @@ -220,7 +226,7 @@ bool MojoAsyncResourceHandler::OnWillStart(const GURL& url, bool* defer) {
|
| base::Unretained(this)));
|
| }
|
|
|
| - return true;
|
| + controller->Resume();
|
| }
|
|
|
| bool MojoAsyncResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf,
|
| @@ -228,6 +234,7 @@ bool MojoAsyncResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf,
|
| int min_size) {
|
| DCHECK_EQ(-1, min_size);
|
|
|
| + // TODO(mmenke): Cancel with net::ERR_INSUFFICIENT_RESOURCES instead.
|
| if (!CheckForSufficientResource())
|
| return false;
|
|
|
| @@ -274,12 +281,17 @@ bool MojoAsyncResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf,
|
| return true;
|
| }
|
|
|
| -bool MojoAsyncResourceHandler::OnReadCompleted(int bytes_read, bool* defer) {
|
| +void MojoAsyncResourceHandler::OnReadCompleted(
|
| + int bytes_read,
|
| + std::unique_ptr<ResourceController> controller) {
|
| + DCHECK(!has_controller());
|
| DCHECK_GE(bytes_read, 0);
|
| DCHECK(buffer_);
|
|
|
| - if (!bytes_read)
|
| - return true;
|
| + if (!bytes_read) {
|
| + controller->Resume();
|
| + return;
|
| + }
|
|
|
| const ResourceRequestInfoImpl* info = GetRequestInfo();
|
| if (info->ShouldReportRawHeaders()) {
|
| @@ -299,26 +311,40 @@ bool MojoAsyncResourceHandler::OnReadCompleted(int bytes_read, bool* defer) {
|
| // Couldn't allocate a buffer on the data pipe in OnWillRead.
|
| DCHECK_EQ(0u, buffer_bytes_read_);
|
| buffer_bytes_read_ = bytes_read;
|
| - if (!CopyReadDataToDataPipe(defer))
|
| - return false;
|
| - if (*defer) {
|
| + bool defer = false;
|
| + if (!CopyReadDataToDataPipe(&defer)) {
|
| + controller->Cancel();
|
| + return;
|
| + }
|
| + if (defer) {
|
| request()->LogBlockedBy("MojoAsyncResourceHandler");
|
| did_defer_on_writing_ = true;
|
| + HoldController(std::move(controller));
|
| + return;
|
| }
|
| - return true;
|
| + controller->Resume();
|
| + return;
|
| }
|
|
|
| - if (EndWrite(bytes_read) != MOJO_RESULT_OK)
|
| - return false;
|
| + if (EndWrite(bytes_read) != MOJO_RESULT_OK) {
|
| + controller->Cancel();
|
| + return;
|
| + }
|
| // Allocate a buffer for the next OnWillRead call here, because OnWillRead
|
| // doesn't have |defer| parameter.
|
| - if (!AllocateWriterIOBuffer(&buffer_, defer))
|
| - return false;
|
| - if (*defer) {
|
| + bool defer = false;
|
| + if (!AllocateWriterIOBuffer(&buffer_, &defer)) {
|
| + controller->Cancel();
|
| + return;
|
| + }
|
| + if (defer) {
|
| request()->LogBlockedBy("MojoAsyncResourceHandler");
|
| did_defer_on_writing_ = true;
|
| + HoldController(std::move(controller));
|
| + return;
|
| }
|
| - return true;
|
| +
|
| + controller->Resume();
|
| }
|
|
|
| void MojoAsyncResourceHandler::OnDataDownloaded(int bytes_downloaded) {
|
| @@ -340,7 +366,7 @@ void MojoAsyncResourceHandler::FollowRedirect() {
|
| DCHECK(!did_defer_on_writing_);
|
| did_defer_on_redirect_ = false;
|
| request()->LogUnblocked();
|
| - controller()->Resume();
|
| + Resume();
|
| }
|
|
|
| void MojoAsyncResourceHandler::SetPriority(net::RequestPriority priority,
|
| @@ -377,7 +403,7 @@ net::IOBufferWithSize* MojoAsyncResourceHandler::GetResponseMetadata(
|
|
|
| void MojoAsyncResourceHandler::OnResponseCompleted(
|
| const net::URLRequestStatus& status,
|
| - bool* defer) {
|
| + std::unique_ptr<ResourceController> controller) {
|
| // Ensure sending the final upload progress message here, since
|
| // OnResponseCompleted can be called without OnResponseStarted on cancellation
|
| // or error cases.
|
| @@ -419,6 +445,7 @@ void MojoAsyncResourceHandler::OnResponseCompleted(
|
| request_complete_data.encoded_body_length = request()->GetRawBodyBytes();
|
|
|
| url_loader_client_->OnComplete(request_complete_data);
|
| + controller->Resume();
|
| }
|
|
|
| bool MojoAsyncResourceHandler::CopyReadDataToDataPipe(bool* defer) {
|
| @@ -474,13 +501,13 @@ bool MojoAsyncResourceHandler::CheckForSufficientResource() {
|
| if (rdh_->HasSufficientResourcesForRequest(request()))
|
| return true;
|
|
|
| - controller()->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES);
|
| return false;
|
| }
|
|
|
| void MojoAsyncResourceHandler::OnWritable(MojoResult result) {
|
| if (!did_defer_on_writing_)
|
| return;
|
| + DCHECK(has_controller());
|
| DCHECK(!did_defer_on_redirect_);
|
| did_defer_on_writing_ = false;
|
|
|
| @@ -489,13 +516,13 @@ void MojoAsyncResourceHandler::OnWritable(MojoResult result) {
|
| // to the data pipe.
|
| DCHECK_GT(buffer_bytes_read_, 0u);
|
| if (!CopyReadDataToDataPipe(&did_defer_on_writing_)) {
|
| - controller()->CancelWithError(net::ERR_FAILED);
|
| + CancelWithError(net::ERR_FAILED);
|
| return;
|
| }
|
| } else {
|
| // Allocate a buffer for the next OnWillRead call here.
|
| if (!AllocateWriterIOBuffer(&buffer_, &did_defer_on_writing_)) {
|
| - controller()->CancelWithError(net::ERR_FAILED);
|
| + CancelWithError(net::ERR_FAILED);
|
| return;
|
| }
|
| }
|
| @@ -505,7 +532,7 @@ void MojoAsyncResourceHandler::OnWritable(MojoResult result) {
|
| return;
|
| }
|
| request()->LogUnblocked();
|
| - controller()->Resume();
|
| + Resume();
|
| }
|
|
|
| void MojoAsyncResourceHandler::Cancel() {
|
|
|