| Index: chrome/browser/renderer_host/download_resource_handler.cc | 
| diff --git a/chrome/browser/renderer_host/download_resource_handler.cc b/chrome/browser/renderer_host/download_resource_handler.cc | 
| index f35d5e4166ce7a127ce62a813137ecc2081b24e6..b4d522d8f0e0151884edf5a20aee9adcdaeb3c77 100644 | 
| --- a/chrome/browser/renderer_host/download_resource_handler.cc | 
| +++ b/chrome/browser/renderer_host/download_resource_handler.cc | 
| @@ -13,6 +13,8 @@ | 
| #include "chrome/browser/download/download_create_info.h" | 
| #include "chrome/browser/download/download_item.h" | 
| #include "chrome/browser/download/download_file_manager.h" | 
| +#include "chrome/browser/download/download_manager.h" | 
| +#include "chrome/browser/download/download_prefs.h" | 
| #include "chrome/browser/download/download_request_handle.h" | 
| #include "chrome/browser/download/download_util.h" | 
| #include "content/browser/browser_thread.h" | 
| @@ -33,6 +35,7 @@ DownloadResourceHandler::DownloadResourceHandler( | 
| DownloadFileManager* download_file_manager, | 
| net::URLRequest* request, | 
| bool save_as, | 
| +    OnStartedCallback started_cb, | 
| const DownloadSaveInfo& save_info) | 
| : download_id_(-1), | 
| global_id_(render_process_host_id, request_id), | 
| @@ -41,6 +44,7 @@ DownloadResourceHandler::DownloadResourceHandler( | 
| download_file_manager_(download_file_manager), | 
| request_(request), | 
| save_as_(save_as), | 
| +      started_cb_(started_cb), | 
| save_info_(save_info), | 
| buffer_(new DownloadBuffer), | 
| rdh_(rdh), | 
| @@ -77,8 +81,6 @@ bool DownloadResourceHandler::OnResponseStarted(int request_id, | 
| const ResourceDispatcherHostRequestInfo* request_info = | 
| ResourceDispatcherHost::InfoForRequest(request_); | 
|  | 
| -  download_id_ = download_file_manager_->GetNextId(); | 
| - | 
| // Deleted in DownloadManager. | 
| DownloadCreateInfo* info = new DownloadCreateInfo; | 
| info->url_chain = request_->url_chain(); | 
| @@ -87,7 +89,6 @@ bool DownloadResourceHandler::OnResponseStarted(int request_id, | 
| info->received_bytes = 0; | 
| info->total_bytes = content_length_; | 
| info->state = DownloadItem::IN_PROGRESS; | 
| -  info->download_id = download_id_; | 
| info->has_user_gesture = request_info->has_user_gesture(); | 
| info->request_handle = DownloadRequestHandle(rdh_, | 
| global_id_.child_id, | 
| @@ -108,10 +109,11 @@ bool DownloadResourceHandler::OnResponseStarted(int request_id, | 
| save_as_ && save_info_.file_path.empty(); | 
| info->referrer_charset = request_->context()->referrer_charset(); | 
| info->save_info = save_info_; | 
| + | 
| BrowserThread::PostTask( | 
| BrowserThread::UI, FROM_HERE, | 
| NewRunnableMethod( | 
| -          download_file_manager_, &DownloadFileManager::StartDownload, info)); | 
| +          this, &DownloadResourceHandler::OnResponseStartedOnUIThread, info)); | 
|  | 
| // We can't start saving the data before we create the file on disk. | 
| // The request will be un-paused in DownloadFileManager::CreateDownloadFile. | 
| @@ -120,6 +122,25 @@ bool DownloadResourceHandler::OnResponseStarted(int request_id, | 
| return true; | 
| } | 
|  | 
| +void DownloadResourceHandler::OnResponseStartedOnUIThread( | 
| +    DownloadCreateInfo* info) { | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| +  download_id_ = info->request_handle.GetDownloadManager()-> | 
| +    download_prefs()->GetNextId(); | 
| +  VLOG(1) << __PRETTY_FUNCTION__ << " " << download_id_; | 
| +  BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, NewRunnableMethod( | 
| +      this, &DownloadResourceHandler::CallStartedCB, 0)); | 
| +  info->download_id = download_id_; | 
| +  download_file_manager_->StartDownload(info); | 
| +} | 
| + | 
| +void DownloadResourceHandler::CallStartedCB(int error) { | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
| +  if (started_cb_.is_null()) return; | 
| +  started_cb_.Run(download_id_, error); | 
| +  started_cb_.Reset(); | 
| +} | 
| + | 
| bool DownloadResourceHandler::OnWillStart(int request_id, | 
| const GURL& url, | 
| bool* defer) { | 
| @@ -178,6 +199,9 @@ bool DownloadResourceHandler::OnResponseCompleted( | 
| << " status.os_error() = " << status.os_error(); | 
| int error_code = (status.status() == net::URLRequestStatus::FAILED) ? | 
| status.os_error() : 0; | 
| +  if (download_id_ == -1) { | 
| +    CallStartedCB(error_code); | 
| +  } | 
| // We transfer ownership to |DownloadFileManager| to delete |buffer_|, | 
| // so that any functions queued up on the FILE thread are executed | 
| // before deletion. | 
|  |