Chromium Code Reviews| Index: content/browser/download/download_resource_handler.cc |
| diff --git a/content/browser/download/download_resource_handler.cc b/content/browser/download/download_resource_handler.cc |
| index 1227651c99ee033ea1fd6c5ace6fbf152c871306..5986a6443e3586e9db94e12381ea53c40da50dac 100644 |
| --- a/content/browser/download/download_resource_handler.cc |
| +++ b/content/browser/download/download_resource_handler.cc |
| @@ -34,6 +34,20 @@ using content::DownloadId; |
| using content::DownloadItem; |
| using content::DownloadManager; |
| +namespace { |
| + |
| +void CallStartedCBOnUIThread( |
| + const DownloadResourceHandler::OnStartedCallback& started_cb, |
| + DownloadId id, |
| + net::Error error) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + if (started_cb.is_null()) |
|
Randy Smith (Not in Mondays)
2012/03/07 21:16:57
When you null a callback, doesn't that mean that r
ahendrickson
2012/03/08 21:33:07
I tried it, and got a NULL function pointer which
Randy Smith (Not in Mondays)
2012/03/09 19:14:02
I spent a bit of time digging around to see if the
|
| + return; |
| + started_cb.Run(id, error); |
| +} |
| + |
| +} // namespace |
| + |
| DownloadResourceHandler::DownloadResourceHandler( |
| ResourceDispatcherHost* rdh, |
| int render_process_host_id, |
| @@ -159,10 +173,11 @@ bool DownloadResourceHandler::OnResponseStarted( |
| } |
| void DownloadResourceHandler::CallStartedCB(DownloadId id, net::Error error) { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| if (started_cb_.is_null()) |
| return; |
| - started_cb_.Run(id, error); |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(&CallStartedCBOnUIThread, started_cb_, id, error)); |
|
Randy Smith (Not in Mondays)
2012/03/07 21:16:57
As noted elsewhere, I think this can be simplified
|
| started_cb_.Reset(); |
| } |
| @@ -298,10 +313,7 @@ void DownloadResourceHandler::OnResponseCompletedInternal( |
| download_stats::RecordAcceptsRanges(accept_ranges_, bytes_read_); |
| // If the callback was already run on the UI thread, this will be a noop. |
| - BrowserThread::PostTask( |
| - BrowserThread::UI, FROM_HERE, |
| - base::Bind(&DownloadResourceHandler::CallStartedCB, this, |
| - download_id_, error_code)); |
| + CallStartedCB(download_id_, error_code); |
| // We transfer ownership to |DownloadFileManager| to delete |buffer_|, |
| // so that any functions queued up on the FILE thread are executed |
| @@ -326,6 +338,7 @@ void DownloadResourceHandler::StartOnUIThread( |
| if (!download_manager) { |
| // NULL in unittests or if the page closed right after starting the |
| // download. |
| + CallStartedCB(download_id_, net::ERR_ACCESS_DENIED); |
| return; |
| } |
| DownloadId download_id = download_manager->delegate()->GetNextId(); |
| @@ -381,6 +394,10 @@ void DownloadResourceHandler::CheckWriteProgress() { |
| } |
| DownloadResourceHandler::~DownloadResourceHandler() { |
| + // This won't do anything if the callback was called before. |
| + // If it goes through, it will likely be because OnWillStart() returned |
| + // false somewhere in the chain of resource handlers. |
| + CallStartedCB(download_id_, net::ERR_ACCESS_DENIED); |
| } |
| void DownloadResourceHandler::StartPauseTimer() { |
| @@ -401,7 +418,9 @@ std::string DownloadResourceHandler::DebugString() const { |
| " render_view_id_ = " "%d" |
| " save_info_.file_path = \"%" PRFilePath "\"" |
| " }", |
| - request_->url().spec().c_str(), |
| + request_ ? |
| + request_->url().spec().c_str() : |
| + "<NULL request>", |
| download_id_.local(), |
| global_id_.child_id, |
| global_id_.request_id, |