Index: chrome/browser/download/chrome_download_manager_delegate.cc |
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc |
index 296ae5e45ccb13d71d1d493e5ea4f4cea1e168a4..b805c4b3c733f184ee4d2b48b74bb7a19518d033 100644 |
--- a/chrome/browser/download/chrome_download_manager_delegate.cc |
+++ b/chrome/browser/download/chrome_download_manager_delegate.cc |
@@ -78,26 +78,10 @@ const char kSafeBrowsingUserDataKey[] = "Safe Browsing ID"; |
// The state of a safebrowsing check. |
class SafeBrowsingState : public DownloadCompletionBlocker { |
public: |
- SafeBrowsingState() |
- : verdict_(DownloadProtectionService::SAFE) { |
- } |
- |
+ SafeBrowsingState() {} |
virtual ~SafeBrowsingState(); |
- // The verdict that we got from calling CheckClientDownload. Only valid to |
- // call if |is_complete()|. |
- DownloadProtectionService::DownloadCheckResult verdict() const { |
- return verdict_; |
- } |
- |
- void SetVerdict(DownloadProtectionService::DownloadCheckResult result) { |
- verdict_ = result; |
- CompleteDownload(); |
- } |
- |
private: |
- DownloadProtectionService::DownloadCheckResult verdict_; |
- |
DISALLOW_COPY_AND_ASSIGN(SafeBrowsingState); |
}; |
@@ -159,7 +143,8 @@ void CheckDownloadUrlDone( |
bool is_content_check_supported, |
DownloadProtectionService::DownloadCheckResult result) { |
content::DownloadDangerType danger_type; |
- if (result == DownloadProtectionService::SAFE) { |
+ if (result == DownloadProtectionService::SAFE || |
+ result == DownloadProtectionService::UNKNOWN) { |
// If this type of files is handled by the enhanced SafeBrowsing download |
// protection, mark it as potentially dangerous content until we are done |
// with scanning it. |
@@ -293,7 +278,7 @@ void ChromeDownloadManagerDelegate::DisableSafeBrowsing(DownloadItem* item) { |
state = new SafeBrowsingState(); |
item->SetUserData(&kSafeBrowsingUserDataKey, state); |
} |
- state->SetVerdict(DownloadProtectionService::SAFE); |
+ state->CompleteDownload(); |
#endif |
} |
@@ -315,10 +300,25 @@ bool ChromeDownloadManagerDelegate::IsDownloadReadyForCompletion( |
item->SetUserData(&kSafeBrowsingUserDataKey, state); |
service->CheckClientDownload( |
item, |
- base::Bind( |
- &ChromeDownloadManagerDelegate::CheckClientDownloadDone, |
- weak_ptr_factory_.GetWeakPtr(), |
- item->GetId())); |
+ base::Bind(&ChromeDownloadManagerDelegate::CheckClientDownloadDone, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ item->GetId())); |
+ return false; |
+ } |
+ |
+ // In case the service was disabled between the download starting and now, |
+ // we need to restore the danger state. |
+ content::DownloadDangerType danger_type = item->GetDangerType(); |
+ if (DownloadItemModel(item).IsDangerousFileBasedOnType() && |
+ (danger_type == content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS || |
+ danger_type == |
+ content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT)) { |
+ DVLOG(2) << __FUNCTION__ |
+ << "() SB service disabled. Marking download as DANGEROUS FILE"; |
+ item->OnContentCheckCompleted( |
+ content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::UI, FROM_HERE, internal_complete_callback); |
return false; |
} |
} else if (!state->is_complete()) { |
@@ -326,6 +326,7 @@ bool ChromeDownloadManagerDelegate::IsDownloadReadyForCompletion( |
state->set_callback(internal_complete_callback); |
return false; |
} |
+ |
#endif |
return true; |
} |
@@ -636,6 +637,11 @@ void ChromeDownloadManagerDelegate::CheckClientDownloadDone( |
content::DownloadDangerType danger_type = |
content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS; |
switch (result) { |
+ case DownloadProtectionService::UNKNOWN: |
+ // The check failed or was inconclusive. |
+ if (DownloadItemModel(item).IsDangerousFileBasedOnType()) |
+ danger_type = content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE; |
+ break; |
case DownloadProtectionService::SAFE: |
// Do nothing. |
break; |
@@ -659,7 +665,7 @@ void ChromeDownloadManagerDelegate::CheckClientDownloadDone( |
SafeBrowsingState* state = static_cast<SafeBrowsingState*>( |
item->GetUserData(&kSafeBrowsingUserDataKey)); |
- state->SetVerdict(result); |
+ state->CompleteDownload(); |
} |
#endif // FULL_SAFE_BROWSING |
@@ -688,10 +694,15 @@ void ChromeDownloadManagerDelegate::OnDownloadTargetDetermined( |
scoped_ptr<DownloadTargetInfo> target_info) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DownloadItem* item = download_manager_->GetDownload(download_id); |
- if (!target_info->target_path.empty() && item && |
- IsOpenInBrowserPreferreredForFile(target_info->target_path) && |
- target_info->is_filetype_handled_safely) |
- DownloadItemModel(item).SetShouldPreferOpeningInBrowser(true); |
+ if (item) { |
+ if (!target_info->target_path.empty() && |
+ IsOpenInBrowserPreferreredForFile(target_info->target_path) && |
+ target_info->is_filetype_handled_safely) |
+ DownloadItemModel(item).SetShouldPreferOpeningInBrowser(true); |
+ |
+ if (target_info->is_dangerous_file) |
+ DownloadItemModel(item).SetIsDangerousFileBasedOnType(true); |
+ } |
callback.Run(target_info->target_path, |
target_info->target_disposition, |
target_info->danger_type, |