diff options
Diffstat (limited to 'chrome/browser/download/download_manager.cc')
-rw-r--r-- | chrome/browser/download/download_manager.cc | 142 |
1 files changed, 41 insertions, 101 deletions
diff --git a/chrome/browser/download/download_manager.cc b/chrome/browser/download/download_manager.cc index f2e6ec7..c24f096 100644 --- a/chrome/browser/download/download_manager.cc +++ b/chrome/browser/download/download_manager.cc @@ -439,7 +439,8 @@ void DownloadManager::OnPathExistenceAvailable(DownloadCreateInfo* info) { info->suggested_path, &file_type_info, 0, FILE_PATH_LITERAL(""), owning_window, info); - FOR_EACH_OBSERVER(Observer, observers_, SelectFileDialogDisplayed()); + FOR_EACH_OBSERVER(Observer, observers_, + SelectFileDialogDisplayed(info->download_id)); } else { // No prompting for download, just continue with the suggested name. info->path = info->suggested_path; @@ -485,30 +486,29 @@ void DownloadManager::AttachDownloadItem(DownloadCreateInfo* info) { UpdateAppIcon(); // Reflect entry into in_progress_. // Rename to intermediate name. + FilePath download_path; if (info->IsDangerous()) { // The download is not safe. We can now rename the file to its - // tentative name using OnFinalDownloadName (the actual final - // name after user confirmation will be set in - // ProceedWithFinishedDangerousDownload). - BrowserThread::PostTask( - BrowserThread::FILE, FROM_HERE, - NewRunnableMethod( - file_manager_, &DownloadFileManager::OnFinalDownloadName, - download->id(), info->path, make_scoped_refptr(this))); + // tentative name using RenameInProgressDownloadFile. + // NOTE: The |Rename| below will be a no-op for dangerous files, as we're + // renaming it to the same name. + download_path = info->path; } else { // The download is a safe download. We need to // rename it to its intermediate '.crdownload' path. The final // name after user confirmation will be set from - // DownloadItem::OnSafeDownloadFinished. - FilePath download_path = download_util::GetCrDownloadPath(info->path); - BrowserThread::PostTask( - BrowserThread::FILE, FROM_HERE, - NewRunnableMethod( - file_manager_, &DownloadFileManager::OnIntermediateDownloadName, - download->id(), download_path, make_scoped_refptr(this))); - download->Rename(download_path); + // DownloadItem::OnDownloadFinished. + download_path = download_util::GetCrDownloadPath(info->path); } + BrowserThread::PostTask( + BrowserThread::FILE, FROM_HERE, + NewRunnableMethod( + file_manager_, &DownloadFileManager::RenameInProgressDownloadFile, + download->id(), download_path)); + + download->Rename(download_path); + download_history_->AddEntry(*info, download, NewCallback(this, &DownloadManager::OnCreateDownloadEntryComplete)); } @@ -627,30 +627,8 @@ void DownloadManager::MaybeCompleteDownload(DownloadItem* download) { download->MarkAsComplete(); download_history_->UpdateEntry(download); - switch (download->safety_state()) { - case DownloadItem::DANGEROUS: - // If this a dangerous download not yet validated by the user, don't do - // anything. When the user notifies us, it will trigger a call to - // ProceedWithFinishedDangerousDownload. - NOTREACHED(); - return; - case DownloadItem::DANGEROUS_BUT_VALIDATED: - // The dangerous download has been validated by the user. We first - // need to rename the downloaded file from its temporary name to - // its final name. We will continue the download processing in the - // callback. - BrowserThread::PostTask( - BrowserThread::FILE, FROM_HERE, - NewRunnableMethod( - this, &DownloadManager::ProceedWithFinishedDangerousDownload, - download->db_handle(), - download->full_path(), download->target_name())); - return; - case DownloadItem::SAFE: - // The download is safe; just finish it. - download->OnSafeDownloadFinished(file_manager_); - return; - } + // Finish the download. + download->OnDownloadFinished(file_manager_); } void DownloadManager::RemoveFromActiveList(int32 download_id) { @@ -658,72 +636,39 @@ void DownloadManager::RemoveFromActiveList(int32 download_id) { active_downloads_.erase(download_id); } -void DownloadManager::DownloadRenamedToFinalName(int download_id, - const FilePath& full_path) { +void DownloadManager::OnDownloadRenamedToFinalName(int download_id, + const FilePath& full_path, + int uniquifier) { VLOG(20) << __FUNCTION__ << "()" << " download_id = " << download_id - << " full_path = \"" << full_path.value() << "\""; + << " full_path = \"" << full_path.value() << "\"" + << " uniquifier = " << uniquifier; DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + DownloadItem* item = GetDownloadItem(download_id); if (!item) return; - item->OnDownloadRenamedToFinalName(full_path); -} - -// Called on the file thread. Renames the downloaded file to its original name. -void DownloadManager::ProceedWithFinishedDangerousDownload( - int64 download_handle, - const FilePath& path, - const FilePath& original_name) { - bool success = false; - FilePath new_path; - int uniquifier = 0; - if (file_util::PathExists(path)) { - new_path = path.DirName().Append(original_name); - // Make our name unique at this point, as if a dangerous file is downloading - // and a 2nd download is started for a file with the same name, they would - // have the same path. This is because we uniquify the name on download - // start, and at that time the first file does not exists yet, so the second - // file gets the same name. - uniquifier = download_util::GetUniquePathNumber(new_path); - if (uniquifier > 0) - download_util::AppendNumberToPath(&new_path, uniquifier); - success = file_util::Move(path, new_path); - } else { - NOTREACHED(); - } BrowserThread::PostTask( - BrowserThread::UI, FROM_HERE, - NewRunnableMethod(this, &DownloadManager::DangerousDownloadRenamed, - download_handle, success, new_path, uniquifier)); -} + BrowserThread::FILE, FROM_HERE, + NewRunnableMethod( + file_manager_, &DownloadFileManager::CompleteDownload, download_id)); -// Call from the file thread when the finished dangerous download was renamed. -void DownloadManager::DangerousDownloadRenamed(int64 download_handle, - bool success, - const FilePath& new_path, - int new_path_uniquifier) { - VLOG(20) << __FUNCTION__ << "()" << " download_handle = " << download_handle - << " success = " << success - << " new_path = \"" << new_path.value() << "\"" - << " new_path_uniquifier = " << new_path_uniquifier; - DownloadMap::iterator it = history_downloads_.find(download_handle); - if (it == history_downloads_.end()) { - NOTREACHED(); + if ((item->safety_state() == DownloadItem::SAFE) && (uniquifier != 0)) { + // File name conflict: the file name we expected to use at the start + // of the safe download was taken. + // TODO(ahendrickson): Warn the user that we're cancelling the download. + BrowserThread::PostTask( + BrowserThread::FILE, FROM_HERE, + NewRunnableMethod( + file_manager_, &DownloadFileManager::CancelDownload, download_id)); return; } - DownloadItem* download = it->second; - // If we failed to rename the file, we'll just keep the name as is. - if (success) { - // We need to update the path uniquifier so that the UI shows the right - // name when calling GetFileNameToReportUser(). - download->set_path_uniquifier(new_path_uniquifier); - RenameDownload(download, new_path); - } + if (uniquifier) + item->set_path_uniquifier(uniquifier); - // Continue the download finished sequence. - download->Finished(); + item->OnDownloadRenamedToFinalName(full_path); + download_history_->UpdateDownloadPath(item, full_path); } void DownloadManager::DownloadCancelled(int32 download_id) { @@ -753,6 +698,7 @@ void DownloadManager::DownloadCancelled(int32 download_id) { void DownloadManager::DownloadCancelledInternal(int download_id, int render_process_id, int request_id) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); // Cancel the network request. RDH is guaranteed to outlive the IO thread. BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, @@ -791,12 +737,6 @@ void DownloadManager::UpdateAppIcon() { status_updater_->Update(); } -void DownloadManager::RenameDownload(DownloadItem* download, - const FilePath& new_path) { - download->Rename(new_path); - download_history_->UpdateDownloadPath(download, new_path); -} - void DownloadManager::PauseDownloadRequest(ResourceDispatcherHost* rdh, int render_process_id, int request_id, |