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 e2bf57a2c0cbc6dde6e0b190f61c8a87db147ed6..f4adec41437ee1c8a798bffdd0d9d0ec6e6faf9a 100644 |
--- a/content/browser/download/download_item_impl.cc |
+++ b/content/browser/download/download_item_impl.cc |
@@ -68,9 +68,12 @@ void DeleteDownloadedFile(const base::FilePath& path) { |
// Wrapper around DownloadFile::Detach and DownloadFile::Cancel that |
// takes ownership of the DownloadFile and hence implicitly destroys it |
// at the end of the function. |
-static void DownloadFileDetach(scoped_ptr<DownloadFile> download_file) { |
+static base::FilePath DownloadFileDetach( |
+ scoped_ptr<DownloadFile> download_file) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
+ base::FilePath full_path = download_file->FullPath(); |
download_file->Detach(); |
+ return full_path; |
} |
static void DownloadFileCancel(scoped_ptr<DownloadFile> download_file) { |
@@ -275,7 +278,7 @@ void DownloadItemImpl::UpdateObservers() { |
FOR_EACH_OBSERVER(Observer, observers_, OnDownloadUpdated(this)); |
} |
-void DownloadItemImpl::DangerousDownloadValidated() { |
+void DownloadItemImpl::ValidateDangerousDownload() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK_EQ(IN_PROGRESS, GetState()); |
DCHECK(IsDangerous()); |
@@ -285,9 +288,7 @@ void DownloadItemImpl::DangerousDownloadValidated() { |
if (GetState() != IN_PROGRESS) |
return; |
- UMA_HISTOGRAM_ENUMERATION("Download.DangerousDownloadValidated", |
- GetDangerType(), |
- DOWNLOAD_DANGER_TYPE_MAX); |
+ RecordDangerousDownloadAccept(GetDangerType()); |
danger_type_ = DOWNLOAD_DANGER_TYPE_USER_VALIDATED; |
@@ -300,6 +301,25 @@ void DownloadItemImpl::DangerousDownloadValidated() { |
MaybeCompleteDownload(); |
} |
+void DownloadItemImpl::StealDangerousDownload( |
Randy Smith (Not in Mondays)
2013/05/28 17:29:40
Given that this is one of the ways that we can tra
asanka
2013/05/28 22:01:39
The Steal() -> Remove() -> Cancel(true) call adds
|
+ const AcquireFileCallback& callback) { |
+ VLOG(20) << __FUNCTION__ << "() download = " << DebugString(true); |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DCHECK(IsDangerous()); |
+ if (download_file_) { |
+ BrowserThread::PostTaskAndReplyWithResult( |
+ BrowserThread::FILE, |
+ FROM_HERE, |
+ base::Bind(&DownloadFileDetach, base::Passed(&download_file_)), |
+ callback); |
+ } else { |
+ callback.Run(current_path_); |
+ } |
+ current_path_.clear(); |
+ Remove(); |
+ // We have now been deleted. |
+} |
+ |
void DownloadItemImpl::Pause() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
@@ -350,9 +370,15 @@ void DownloadItemImpl::Cancel(bool user_cancel) { |
return; |
} |
- last_reason_ = user_cancel ? |
- DOWNLOAD_INTERRUPT_REASON_USER_CANCELED : |
- DOWNLOAD_INTERRUPT_REASON_USER_SHUTDOWN; |
+ if (IsDangerous()) { |
+ RecordDangerousDownloadDiscard( |
+ user_cancel ? DOWNLOAD_DISCARD_DUE_TO_USER_ACTION |
+ : DOWNLOAD_DISCARD_DUE_TO_SHUTDOWN, |
+ GetDangerType()); |
+ } |
+ |
+ last_reason_ = user_cancel ? DOWNLOAD_INTERRUPT_REASON_USER_CANCELED |
+ : DOWNLOAD_INTERRUPT_REASON_USER_SHUTDOWN; |
RecordDownloadCount(CANCELLED_COUNT); |
@@ -381,36 +407,6 @@ void DownloadItemImpl::Cancel(bool user_cancel) { |
TransitionTo(CANCELLED_INTERNAL); |
} |
-void DownloadItemImpl::Delete(DeleteReason reason) { |
- VLOG(20) << __FUNCTION__ << "() download = " << DebugString(true); |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- switch (reason) { |
- case DELETE_DUE_TO_USER_DISCARD: |
- UMA_HISTOGRAM_ENUMERATION( |
- "Download.UserDiscard", GetDangerType(), |
- DOWNLOAD_DANGER_TYPE_MAX); |
- break; |
- case DELETE_DUE_TO_BROWSER_SHUTDOWN: |
- UMA_HISTOGRAM_ENUMERATION( |
- "Download.Discard", GetDangerType(), |
- DOWNLOAD_DANGER_TYPE_MAX); |
- break; |
- default: |
- NOTREACHED(); |
- } |
- |
- // Delete the file if it exists and is not owned by a DownloadFile object. |
- // (In the latter case the DownloadFile object will delete it on cancel.) |
- if (!current_path_.empty() && download_file_.get() == NULL) { |
- BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
- base::Bind(&DeleteDownloadedFile, current_path_)); |
- current_path_.clear(); |
- } |
- Remove(); |
- // We have now been deleted. |
-} |
- |
void DownloadItemImpl::Remove() { |
VLOG(20) << __FUNCTION__ << "() download = " << DebugString(true); |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
@@ -1399,9 +1395,11 @@ void DownloadItemImpl::ReleaseDownloadFile(bool destroy_file) { |
current_path_.clear(); |
} else { |
BrowserThread::PostTask( |
- BrowserThread::FILE, FROM_HERE, |
- // Will be deleted at end of task execution. |
- base::Bind(&DownloadFileDetach, base::Passed(&download_file_))); |
+ BrowserThread::FILE, |
+ FROM_HERE, |
+ base::Bind(base::IgnoreResult(&DownloadFileDetach), |
+ // Will be deleted at end of task execution. |
+ base::Passed(&download_file_))); |
} |
// Don't accept any more messages from the DownloadFile, and null |
// out any previous "all data received". This also breaks links to |