Index: content/browser/download/download_item_impl.cc |
diff --git a/content/browser/download/download_item_impl.cc b/content/browser/download/download_item_impl.cc |
index a3e72ffa469e50f0efd18f92c63a50c2a99e0e16..1a29fad6dfc7c823a6fe3a3fc968ca9b102202d2 100644 |
--- a/content/browser/download/download_item_impl.cc |
+++ b/content/browser/download/download_item_impl.cc |
@@ -700,7 +700,7 @@ void DownloadItemImpl::TogglePause() { |
UpdateObservers(); |
} |
-void DownloadItemImpl::OnDownloadCompleting(DownloadFileManager* file_manager) { |
+void DownloadItemImpl::OnDownloadCompleting() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
VLOG(20) << __FUNCTION__ << "()" |
@@ -708,31 +708,28 @@ void DownloadItemImpl::OnDownloadCompleting(DownloadFileManager* file_manager) { |
<< " " << DebugString(true); |
DCHECK(!GetTargetName().empty()); |
DCHECK_NE(DANGEROUS, GetSafetyState()); |
- DCHECK(file_manager); |
if (NeedsRename()) { |
DownloadFileManager::RenameCompletionCallback callback = |
base::Bind(&DownloadItemImpl::OnDownloadRenamedToFinalName, |
- weak_ptr_factory_.GetWeakPtr(), |
- base::Unretained(file_manager)); |
+ weak_ptr_factory_.GetWeakPtr()); |
BrowserThread::PostTask( |
BrowserThread::FILE, FROM_HERE, |
base::Bind(&DownloadFileManager::RenameDownloadFile, |
- file_manager, GetGlobalId(), GetTargetFilePath(), |
- true, callback)); |
+ delegate_->GetDownloadFileManager(), GetGlobalId(), |
+ GetTargetFilePath(), true, callback)); |
} else { |
// Complete the download and release the DownloadFile. |
BrowserThread::PostTask( |
BrowserThread::FILE, FROM_HERE, |
base::Bind(&DownloadFileManager::CompleteDownload, |
- file_manager, GetGlobalId(), |
+ delegate_->GetDownloadFileManager(), GetGlobalId(), |
base::Bind(&DownloadItemImpl::OnDownloadFileReleased, |
weak_ptr_factory_.GetWeakPtr()))); |
} |
} |
void DownloadItemImpl::OnDownloadRenamedToFinalName( |
- DownloadFileManager* file_manager, |
content::DownloadInterruptReason reason, |
const FilePath& full_path) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
@@ -758,7 +755,7 @@ void DownloadItemImpl::OnDownloadRenamedToFinalName( |
BrowserThread::PostTask( |
BrowserThread::FILE, FROM_HERE, |
base::Bind(&DownloadFileManager::CompleteDownload, |
- file_manager, GetGlobalId(), |
+ delegate_->GetDownloadFileManager(), GetGlobalId(), |
base::Bind(&DownloadItemImpl::OnDownloadFileReleased, |
weak_ptr_factory_.GetWeakPtr()))); |
} |
@@ -867,21 +864,44 @@ DownloadItem::TargetDisposition DownloadItemImpl::GetTargetDisposition() const { |
return target_disposition_; |
} |
-void DownloadItemImpl::OnTargetPathDetermined( |
+void DownloadItemImpl::OnDownloadTargetDetermined( |
const FilePath& target_path, |
TargetDisposition disposition, |
- content::DownloadDangerType danger_type) { |
+ content::DownloadDangerType danger_type, |
+ const FilePath& intermediate_path) { |
// TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ |
+ // If the |target_path| is empty, then we consider this download to be |
+ // canceled. |
+ if (target_path.empty()) { |
+ Cancel(true); |
+ return; |
+ } |
+ |
target_path_ = target_path; |
target_disposition_ = disposition; |
SetDangerType(danger_type); |
-} |
- |
-void DownloadItemImpl::OnTargetPathSelected(const FilePath& target_path) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK_EQ(TARGET_DISPOSITION_PROMPT, target_disposition_); |
- target_path_ = target_path; |
+ // TODO(asanka): SetDangerType() doesn't need to send a notification here. |
+ |
+ // We want the intermediate and target paths to refer to the same directory so |
+ // that they are both on the same device and subject to same |
+ // space/permission/availability constraints. |
+ DCHECK(intermediate_path.DirName() == target_path.DirName()); |
+ |
+ // Rename to intermediate name. |
+ // TODO(asanka): Skip this rename if AllDataSaved() is true. This avoids a |
+ // spurious rename when we can just rename to the final |
+ // filename. Unnecessary renames may cause bugs like |
+ // http://crbug.com/74187. |
+ DownloadFileManager::RenameCompletionCallback callback = |
+ base::Bind(&DownloadItemImpl::OnDownloadRenamedToIntermediateName, |
+ weak_ptr_factory_.GetWeakPtr()); |
+ BrowserThread::PostTask( |
+ BrowserThread::FILE, FROM_HERE, |
+ base::Bind(&DownloadFileManager::RenameDownloadFile, |
+ delegate_->GetDownloadFileManager(), GetGlobalId(), |
+ intermediate_path, false, callback)); |
} |
void DownloadItemImpl::OnContentCheckCompleted( |
@@ -892,19 +912,6 @@ void DownloadItemImpl::OnContentCheckCompleted( |
SetDangerType(danger_type); |
} |
-void DownloadItemImpl::OnIntermediatePathDetermined( |
- DownloadFileManager* file_manager, |
- const FilePath& intermediate_path) { |
- DownloadFileManager::RenameCompletionCallback callback = |
- base::Bind(&DownloadItemImpl::OnDownloadRenamedToIntermediateName, |
- weak_ptr_factory_.GetWeakPtr()); |
- BrowserThread::PostTask( |
- BrowserThread::FILE, FROM_HERE, |
- base::Bind(&DownloadFileManager::RenameDownloadFile, |
- file_manager, GetGlobalId(), intermediate_path, |
- false, callback)); |
-} |
- |
const FilePath& DownloadItemImpl::GetFullPath() const { |
return current_path_; |
} |
@@ -924,14 +931,14 @@ FilePath DownloadItemImpl::GetUserVerifiedFilePath() const { |
GetTargetFilePath() : GetFullPath(); |
} |
-void DownloadItemImpl::OffThreadCancel(DownloadFileManager* file_manager) { |
+void DownloadItemImpl::OffThreadCancel() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
request_handle_->CancelRequest(); |
BrowserThread::PostTask( |
BrowserThread::FILE, FROM_HERE, |
base::Bind(&DownloadFileManager::CancelDownload, |
- file_manager, download_id_)); |
+ delegate_->GetDownloadFileManager(), download_id_)); |
} |
void DownloadItemImpl::Init(bool active, |