| Index: chrome/browser/download/download_file_manager.cc
|
| diff --git a/chrome/browser/download/download_file_manager.cc b/chrome/browser/download/download_file_manager.cc
|
| index 68c5e9c87afd25c79ffcfac73baf70bd5bf73b87..a1d08e79a29782083d2f6e60fbe398555876c3d8 100644
|
| --- a/chrome/browser/download/download_file_manager.cc
|
| +++ b/chrome/browser/download/download_file_manager.cc
|
| @@ -202,7 +202,8 @@ void DownloadFileManager::StartDownload(DownloadCreateInfo* info) {
|
|
|
| DCHECK(GetDownloadFile(info->download_id) == NULL);
|
| downloads_[info->download_id] = download;
|
| - info->path = download->full_path();
|
| + // TODO(phajdan.jr): fix the duplication of path info below.
|
| + info->path = info->save_info.file_path;
|
| {
|
| AutoLock lock(progress_lock_);
|
| ui_progress_[info->download_id] = info->received_bytes;
|
| @@ -226,18 +227,24 @@ void DownloadFileManager::UpdateDownload(int id, DownloadBuffer* buffer) {
|
| contents.swap(buffer->contents);
|
| }
|
|
|
| + // Keep track of how many bytes we have successfully saved to update
|
| + // our progress status in the UI.
|
| + int64 progress_bytes = 0;
|
| +
|
| DownloadFile* download = GetDownloadFile(id);
|
| for (size_t i = 0; i < contents.size(); ++i) {
|
| net::IOBuffer* data = contents[i].first;
|
| const int data_len = contents[i].second;
|
| - if (download)
|
| - download->AppendDataToFile(data->data(), data_len);
|
| + if (download) {
|
| + if (download->AppendDataToFile(data->data(), data_len))
|
| + progress_bytes += data_len;
|
| + }
|
| data->Release();
|
| }
|
|
|
| if (download) {
|
| AutoLock lock(progress_lock_);
|
| - ui_progress_[download->id()] = download->bytes_so_far();
|
| + ui_progress_[download->id()] += progress_bytes;
|
| }
|
| }
|
|
|
| @@ -247,13 +254,19 @@ void DownloadFileManager::DownloadFinished(int id, DownloadBuffer* buffer) {
|
| DownloadFileMap::iterator it = downloads_.find(id);
|
| if (it != downloads_.end()) {
|
| DownloadFile* download = it->second;
|
| - download->set_in_progress(false);
|
| + download->Finish();
|
| +
|
| + int64 download_size = -1;
|
| + {
|
| + AutoLock lock(progress_lock_);
|
| + download_size = ui_progress_[download->id()];
|
| + }
|
|
|
| ChromeThread::PostTask(
|
| ChromeThread::UI, FROM_HERE,
|
| NewRunnableMethod(
|
| this, &DownloadFileManager::OnDownloadFinished,
|
| - id, download->bytes_so_far()));
|
| + id, download_size));
|
|
|
| // We need to keep the download around until the UI thread has finalized
|
| // the name.
|
| @@ -277,8 +290,6 @@ void DownloadFileManager::CancelDownload(int id) {
|
| DownloadFileMap::iterator it = downloads_.find(id);
|
| if (it != downloads_.end()) {
|
| DownloadFile* download = it->second;
|
| - download->set_in_progress(false);
|
| -
|
| download->Cancel();
|
|
|
| ChromeThread::PostTask(
|
| @@ -437,12 +448,7 @@ void DownloadFileManager::OnFinalDownloadName(int id,
|
| ChromeThread::UI, FROM_HERE,
|
| NewRunnableMethod(dlm, &DownloadManager::DownloadCancelled, id));
|
| } else {
|
| - ChromeThread::PostTask(
|
| - ChromeThread::IO, FROM_HERE,
|
| - NewRunnableFunction(&download_util::CancelDownloadRequest,
|
| - resource_dispatcher_host_,
|
| - download->child_id(),
|
| - download->request_id()));
|
| + download->CancelDownloadRequest(resource_dispatcher_host_);
|
| }
|
| }
|
|
|
|
|