Index: content/browser/download/download_manager_impl.cc |
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc |
index 1705678218f674266595dc212c0fc0894c188156..f3fa4dd59a68f3582eb9200fc4ac5daef46c0e35 100644 |
--- a/content/browser/download/download_manager_impl.cc |
+++ b/content/browser/download/download_manager_impl.cc |
@@ -356,6 +356,9 @@ void DownloadManagerImpl::StartDownload( |
const DownloadUrlParameters::OnStartedCallback& on_started) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK(info); |
+ // |stream| is only non-nil if the download request was successful. |
+ DCHECK(info->interrupt_reason != DOWNLOAD_INTERRUPT_REASON_NONE || |
+ stream.get()); |
uint32 download_id = info->download_id; |
const bool new_download = (download_id == content::DownloadItem::kInvalidId); |
base::Callback<void(uint32)> got_id(base::Bind( |
@@ -374,7 +377,7 @@ void DownloadManagerImpl::StartDownload( |
void DownloadManagerImpl::StartDownloadWithId( |
scoped_ptr<DownloadCreateInfo> info, |
- scoped_ptr<ByteStreamReader> stream, |
+ scoped_ptr<ByteStreamReader> byte_stream, |
const DownloadUrlParameters::OnStartedCallback& on_started, |
bool new_download, |
uint32 id) { |
@@ -398,7 +401,6 @@ void DownloadManagerImpl::StartDownloadWithId( |
} |
download = item_iterator->second; |
DCHECK_EQ(DownloadItem::INTERRUPTED, download->GetState()); |
- download->MergeOriginInfoOnResume(*info); |
} |
base::FilePath default_download_directory; |
@@ -409,35 +411,45 @@ void DownloadManagerImpl::StartDownloadWithId( |
&default_download_directory, &skip_dir_check); |
} |
- // Create the download file and start the download. |
- scoped_ptr<DownloadFile> download_file( |
- file_factory_->CreateFile( |
- info->save_info.Pass(), default_download_directory, |
- info->url(), info->referrer_url, |
- delegate_ && delegate_->GenerateFileHash(), |
- stream.Pass(), download->GetBoundNetLog(), |
- download->DestinationObserverAsWeakPtr())); |
- |
- // Attach the client ID identifying the app to the AV system. |
- if (download_file.get() && delegate_) { |
- download_file->SetClientGuid( |
- delegate_->ApplicationClientIdForFileScanning()); |
+ scoped_ptr<DownloadFile> download_file; |
+ |
+ if (info->interrupt_reason == DOWNLOAD_INTERRUPT_REASON_NONE) { |
+ DCHECK(byte_stream.get()); |
+ // Create the download file and start the download. |
+ download_file.reset( |
+ file_factory_->CreateFile(*info->save_info, |
+ default_download_directory, |
+ info->url(), |
+ info->referrer_url, |
+ delegate_ && delegate_->GenerateFileHash(), |
+ info->save_info->file_stream.Pass(), |
Randy Smith (Not in Mondays)
2014/03/18 21:07:28
Just curious: Why make this an explicit argument?
asanka
2014/03/19 20:37:06
The ownership of FileStream is being passed into t
|
+ byte_stream.Pass(), |
+ download->GetBoundNetLog(), |
+ download->DestinationObserverAsWeakPtr())); |
+ |
+ // Attach the client ID identifying the app to the AV system. |
+ if (download_file.get() && delegate_) { |
+ download_file->SetClientGuid( |
+ delegate_->ApplicationClientIdForFileScanning()); |
+ } |
} |
- scoped_ptr<DownloadRequestHandleInterface> req_handle( |
- new DownloadRequestHandle(info->request_handle)); |
- download->Start(download_file.Pass(), req_handle.Pass()); |
- |
- // For interrupted downloads, Start() will transition the state to |
- // IN_PROGRESS and consumers will be notified via OnDownloadUpdated(). |
- // For new downloads, we notify here, rather than earlier, so that |
- // the download_file is bound to download and all the usual |
- // setters (e.g. Cancel) work. |
+ // OnDownloadCreated notification needs to be issued before Start() is called |
+ // so that observers can choose to observe the initial state transition that |
+ // happens during DownloadItem::Start(). Active DownloadItems are created in |
+ // an IN_PROGRESS state. If the download is already interrupted, then Start() |
+ // will transition the download to INTERRUPTED. This is currently the only |
+ // distinction between a download created in response to an interrupted |
+ // request, and an interrupted download being recreated from history. |
Randy Smith (Not in Mondays)
2014/03/18 21:07:28
How are you dealing with the issue in the deleted
Randy Smith (Not in Mondays)
2014/03/18 21:07:28
As an alternative to the above comment, we could j
Randy Smith (Not in Mondays)
2014/03/18 21:07:28
The above thoughts bring up a side issue: When we'
asanka
2014/03/19 20:37:06
I've been mulling a STARTING state as mentioned el
asanka
2014/03/19 20:37:06
Yeah. The consumer is supposed to see an OnDownloa
|
if (new_download) |
FOR_EACH_OBSERVER(Observer, observers_, OnDownloadCreated(this, download)); |
+ scoped_ptr<DownloadRequestHandleInterface> req_handle( |
+ new DownloadRequestHandle(info->request_handle)); |
+ download->Start(download_file.Pass(), req_handle.Pass(), *info); |
+ |
if (!on_started.is_null()) |
- on_started.Run(download, DOWNLOAD_INTERRUPT_REASON_NONE); |
+ on_started.Run(download, info->interrupt_reason); |
Randy Smith (Not in Mondays)
2014/03/18 21:07:28
nit: This violates the contract on started_cb desc
asanka
2014/03/19 20:37:06
Done.
|
} |
void DownloadManagerImpl::CheckForHistoryFilesRemoval() { |