| Index: content/browser/loader/detachable_resource_handler.cc
|
| diff --git a/content/browser/loader/detachable_resource_handler.cc b/content/browser/loader/detachable_resource_handler.cc
|
| index 2e1af5e7c6c396821e762203c1d9628012f1093b..bb383399744bbd7e4ed391e04e18f4aa39f09e64 100644
|
| --- a/content/browser/loader/detachable_resource_handler.cc
|
| +++ b/content/browser/loader/detachable_resource_handler.cc
|
| @@ -29,7 +29,8 @@ DetachableResourceHandler::DetachableResourceHandler(
|
| next_handler_(std::move(next_handler)),
|
| cancel_delay_(cancel_delay),
|
| is_deferred_(false),
|
| - is_finished_(false) {
|
| + is_finished_(false),
|
| + is_canceled_(false) {
|
| GetRequestInfo()->set_detachable_handler(this);
|
| }
|
|
|
| @@ -46,9 +47,9 @@ void DetachableResourceHandler::Detach() {
|
| // Simulate a cancel on the next handler before destroying it.
|
| net::URLRequestStatus status(net::URLRequestStatus::CANCELED,
|
| net::ERR_ABORTED);
|
| - bool defer_ignored = false;
|
| - next_handler_->OnResponseCompleted(status, &defer_ignored);
|
| - DCHECK(!defer_ignored);
|
| + bool defer_or_cancel_ignored = false;
|
| + next_handler_->OnResponseCompleted(status, &defer_or_cancel_ignored);
|
| + DCHECK(!defer_or_cancel_ignored);
|
| // If |next_handler_| were to defer its shutdown in OnResponseCompleted,
|
| // this would destroy it anyway. Fortunately, AsyncResourceHandler never
|
| // does this anyway, so DCHECK it. MimeTypeResourceHandler and RVH shutdown
|
| @@ -89,43 +90,49 @@ void DetachableResourceHandler::SetController(ResourceController* controller) {
|
| next_handler_->SetController(this);
|
| }
|
|
|
| -bool DetachableResourceHandler::OnRequestRedirected(
|
| +void DetachableResourceHandler::OnRequestRedirected(
|
| const net::RedirectInfo& redirect_info,
|
| ResourceResponse* response,
|
| - bool* defer) {
|
| + bool* defer_or_cancel) {
|
| DCHECK(!is_deferred_);
|
|
|
| if (!next_handler_)
|
| - return true;
|
| + return;
|
|
|
| - bool ret = next_handler_->OnRequestRedirected(
|
| - redirect_info, response, &is_deferred_);
|
| - *defer = is_deferred_;
|
| - return ret;
|
| + bool is_deferred_or_canceled = false;
|
| + next_handler_->OnRequestRedirected(redirect_info, response,
|
| + &is_deferred_or_canceled);
|
| + *defer_or_cancel = is_deferred_or_canceled;
|
| + if (is_deferred_or_canceled && !is_canceled_)
|
| + is_deferred_ = true;
|
| }
|
|
|
| -bool DetachableResourceHandler::OnResponseStarted(ResourceResponse* response,
|
| - bool* defer) {
|
| +void DetachableResourceHandler::OnResponseStarted(ResourceResponse* response,
|
| + bool* defer_or_cancel) {
|
| DCHECK(!is_deferred_);
|
|
|
| if (!next_handler_)
|
| - return true;
|
| + return;
|
|
|
| - bool ret =
|
| - next_handler_->OnResponseStarted(response, &is_deferred_);
|
| - *defer = is_deferred_;
|
| - return ret;
|
| + bool is_deferred_or_canceled = false;
|
| + next_handler_->OnResponseStarted(response, &is_deferred_or_canceled);
|
| + *defer_or_cancel = is_deferred_or_canceled;
|
| + if (is_deferred_or_canceled && !is_canceled_)
|
| + is_deferred_ = true;
|
| }
|
|
|
| -bool DetachableResourceHandler::OnWillStart(const GURL& url, bool* defer) {
|
| +void DetachableResourceHandler::OnWillStart(const GURL& url,
|
| + bool* defer_or_cancel) {
|
| DCHECK(!is_deferred_);
|
|
|
| if (!next_handler_)
|
| - return true;
|
| + return;
|
|
|
| - bool ret = next_handler_->OnWillStart(url, &is_deferred_);
|
| - *defer = is_deferred_;
|
| - return ret;
|
| + bool is_deferred_or_canceled = false;
|
| + next_handler_->OnWillStart(url, &is_deferred_or_canceled);
|
| + *defer_or_cancel = is_deferred_or_canceled;
|
| + if (is_deferred_or_canceled && !is_canceled_)
|
| + is_deferred_ = true;
|
| }
|
|
|
| bool DetachableResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf,
|
| @@ -143,22 +150,25 @@ bool DetachableResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf,
|
| return next_handler_->OnWillRead(buf, buf_size, min_size);
|
| }
|
|
|
| -bool DetachableResourceHandler::OnReadCompleted(int bytes_read, bool* defer) {
|
| +void DetachableResourceHandler::OnReadCompleted(int bytes_read,
|
| + bool* defer_or_cancel) {
|
| DCHECK(!is_deferred_);
|
|
|
| if (!next_handler_)
|
| - return true;
|
| + return;
|
|
|
| - bool ret =
|
| - next_handler_->OnReadCompleted(bytes_read, &is_deferred_);
|
| - *defer = is_deferred_;
|
| - return ret;
|
| + bool is_deferred_or_canceled = false;
|
| + next_handler_->OnReadCompleted(bytes_read, &is_deferred_or_canceled);
|
| + *defer_or_cancel = is_deferred_or_canceled;
|
| + if (is_deferred_or_canceled && !is_canceled_)
|
| + is_deferred_ = true;
|
| }
|
|
|
| void DetachableResourceHandler::OnResponseCompleted(
|
| const net::URLRequestStatus& status,
|
| bool* defer) {
|
| - // No DCHECK(!is_deferred_) as the request may have been cancelled while
|
| + // No DCHECK(!is_deferred_or_canceled_) as the request may have been cancelled
|
| + // while
|
| // deferred.
|
|
|
| if (!next_handler_)
|
| @@ -184,6 +194,7 @@ void DetachableResourceHandler::Resume() {
|
| }
|
|
|
| void DetachableResourceHandler::Cancel() {
|
| + is_canceled_ = true;
|
| controller()->Cancel();
|
| }
|
|
|
|
|