Index: chrome/browser/renderer_host/download_throttling_resource_handler.cc |
diff --git a/chrome/browser/renderer_host/download_throttling_resource_handler.cc b/chrome/browser/renderer_host/download_throttling_resource_handler.cc |
index d0648b15b64106ac05f4dd1da9466cba943edbb8..b6c499858605bf80189d082dd44343d3a34816ef 100644 |
--- a/chrome/browser/renderer_host/download_throttling_resource_handler.cc |
+++ b/chrome/browser/renderer_host/download_throttling_resource_handler.cc |
@@ -27,12 +27,18 @@ DownloadThrottlingResourceHandler::DownloadThrottlingResourceHandler( |
render_view_id_(render_view_id), |
request_id_(request_id), |
tmp_buffer_length_(0), |
- ignore_on_read_complete_(in_complete) { |
+ ignore_on_read_complete_(in_complete), |
+ request_closed_(false) { |
// Pause the request. |
host_->PauseRequest(render_process_host_id_, request_id_, true); |
- host_->download_request_limiter()->CanDownloadOnIOThread( |
- render_process_host_id_, render_view_id, this); |
+ // Add a reference to ourselves to keep this object alive until we |
+ // receive a callback from DownloadRequestLimiter. The reference is |
+ // released in ContinueDownload() and CancelDownload(). |
+ AddRef(); |
+ |
+ host_->download_request_limiter()->CanDownloadOnIOThread( |
+ render_process_host_id_, render_view_id, request_id, this); |
BrowserThread::PostTask( |
BrowserThread::UI, FROM_HERE, |
NewRunnableFunction(&download_util::NotifyDownloadInitiated, |
@@ -45,6 +51,7 @@ DownloadThrottlingResourceHandler::~DownloadThrottlingResourceHandler() { |
bool DownloadThrottlingResourceHandler::OnUploadProgress(int request_id, |
uint64 position, |
uint64 size) { |
+ DCHECK(!request_closed_); |
if (download_handler_.get()) |
return download_handler_->OnUploadProgress(request_id, position, size); |
return true; |
@@ -55,6 +62,7 @@ bool DownloadThrottlingResourceHandler::OnRequestRedirected( |
const GURL& url, |
ResourceResponse* response, |
bool* defer) { |
+ DCHECK(!request_closed_); |
if (download_handler_.get()) { |
return download_handler_->OnRequestRedirected( |
request_id, url, response, defer); |
@@ -66,6 +74,7 @@ bool DownloadThrottlingResourceHandler::OnRequestRedirected( |
bool DownloadThrottlingResourceHandler::OnResponseStarted( |
int request_id, |
ResourceResponse* response) { |
+ DCHECK(!request_closed_); |
if (download_handler_.get()) |
return download_handler_->OnResponseStarted(request_id, response); |
response_ = response; |
@@ -75,6 +84,7 @@ bool DownloadThrottlingResourceHandler::OnResponseStarted( |
bool DownloadThrottlingResourceHandler::OnWillStart(int request_id, |
const GURL& url, |
bool* defer) { |
+ DCHECK(!request_closed_); |
if (download_handler_.get()) |
return download_handler_->OnWillStart(request_id, url, defer); |
return true; |
@@ -84,6 +94,7 @@ bool DownloadThrottlingResourceHandler::OnWillRead(int request_id, |
net::IOBuffer** buf, |
int* buf_size, |
int min_size) { |
+ DCHECK(!request_closed_); |
if (download_handler_.get()) |
return download_handler_->OnWillRead(request_id, buf, buf_size, min_size); |
@@ -103,6 +114,7 @@ bool DownloadThrottlingResourceHandler::OnWillRead(int request_id, |
bool DownloadThrottlingResourceHandler::OnReadCompleted(int request_id, |
int* bytes_read) { |
+ DCHECK(!request_closed_); |
if (ignore_on_read_complete_) { |
// See comments above definition for details on this. |
ignore_on_read_complete_ = false; |
@@ -127,6 +139,7 @@ bool DownloadThrottlingResourceHandler::OnResponseCompleted( |
int request_id, |
const net::URLRequestStatus& status, |
const std::string& security_info) { |
+ DCHECK(!request_closed_); |
if (download_handler_.get()) |
return download_handler_->OnResponseCompleted(request_id, status, |
security_info); |
@@ -142,38 +155,41 @@ bool DownloadThrottlingResourceHandler::OnResponseCompleted( |
} |
void DownloadThrottlingResourceHandler::OnRequestClosed() { |
+ DCHECK(!request_closed_); |
if (download_handler_.get()) |
download_handler_->OnRequestClosed(); |
+ request_closed_ = true; |
} |
void DownloadThrottlingResourceHandler::CancelDownload() { |
- host_->CancelRequest(render_process_host_id_, request_id_, false); |
+ if (!request_closed_) |
+ host_->CancelRequest(render_process_host_id_, request_id_, false); |
+ Release(); // Release the additional reference from constructor. |
} |
void DownloadThrottlingResourceHandler::ContinueDownload() { |
DCHECK(!download_handler_.get()); |
- download_handler_ = |
- new DownloadResourceHandler(host_, |
- render_process_host_id_, |
- render_view_id_, |
- request_id_, |
- url_, |
- host_->download_file_manager(), |
- request_, |
- false, |
- DownloadSaveInfo()); |
- if (response_.get()) |
- download_handler_->OnResponseStarted(request_id_, response_.get()); |
- |
- if (tmp_buffer_length_) |
- CopyTmpBufferToDownloadHandler(); |
- |
- // And let the request continue. |
- host_->PauseRequest(render_process_host_id_, request_id_, false); |
-} |
+ if (!request_closed_) { |
+ download_handler_ = |
+ new DownloadResourceHandler(host_, |
+ render_process_host_id_, |
+ render_view_id_, |
+ request_id_, |
+ url_, |
+ host_->download_file_manager(), |
+ request_, |
+ false, |
+ DownloadSaveInfo()); |
+ if (response_.get()) |
+ download_handler_->OnResponseStarted(request_id_, response_.get()); |
+ |
+ if (tmp_buffer_length_) |
+ CopyTmpBufferToDownloadHandler(); |
-int DownloadThrottlingResourceHandler::GetRequestId() { |
- return request_id_; |
+ // And let the request continue. |
+ host_->PauseRequest(render_process_host_id_, request_id_, false); |
+ } |
+ Release(); // Release the addtional reference from constructor. |
} |
void DownloadThrottlingResourceHandler::CopyTmpBufferToDownloadHandler() { |