Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(311)

Unified Diff: chrome/browser/renderer_host/download_throttling_resource_handler.cc

Issue 6713008: Don't destroy a request while it is being processed (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Rebased. Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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() {

Powered by Google App Engine
This is Rietveld 408576698