Index: chrome/browser/download/download_ui_controller.cc |
diff --git a/chrome/browser/download/download_ui_controller.cc b/chrome/browser/download/download_ui_controller.cc |
index 89a3694d8b5592ffca30fb61979f64df5e22a32a..9feecd41de46555a319a3ebeb928985551f34083 100644 |
--- a/chrome/browser/download/download_ui_controller.cc |
+++ b/chrome/browser/download/download_ui_controller.cc |
@@ -4,8 +4,12 @@ |
#include "chrome/browser/download/download_ui_controller.h" |
+#include "base/callback.h" |
#include "base/stl_util.h" |
+#include "chrome/browser/download/download_history.h" |
#include "chrome/browser/download/download_item_model.h" |
+#include "chrome/browser/download/download_service.h" |
+#include "chrome/browser/download/download_service_factory.h" |
#include "chrome/browser/ui/browser_finder.h" |
#include "chrome/browser/ui/browser_tabstrip.h" |
#include "content/public/browser/download_item.h" |
@@ -37,6 +41,12 @@ class DefaultUIControllerDelegateAndroid |
void DefaultUIControllerDelegateAndroid::NotifyDownloadStarting( |
content::DownloadItem* item) { |
+ // The Android DownloadController is only interested in IN_PROGRESS downloads. |
+ // Ones which are INTERRUPTED etc. can't be handed over to the Android |
+ // DownloadManager. |
+ if (item->GetState() != content::DownloadItem::IN_PROGRESS) |
+ return; |
+ |
// GET downloads without authentication are delegated to the Android |
// DownloadManager. Chrome is responsible for the rest. See |
// InterceptDownloadResourceThrottle::ProcessDownloadRequest(). |
@@ -78,15 +88,35 @@ void DefaultUIControllerDelegate::NotifyDownloadStarting( |
#endif // !OS_ANDROID |
+// Predicate that returns true if the given download was not restored from |
+// history. Used to construct a DownloadFilter based on a DownloadHistory. |
+bool IsNewDownload(DownloadHistory* download_history, |
+ const content::DownloadItem* download_item) { |
+ // Incognito profiles won't have a DownloadHistory. All downloads on such |
+ // profiles are considered new. |
+ return !download_history || |
+ !download_history->WasRestoredFromHistory(download_item); |
+} |
+ |
} // namespace |
DownloadUIController::Delegate::~Delegate() { |
} |
-DownloadUIController::DownloadUIController(content::DownloadManager* manager, |
- scoped_ptr<Delegate> delegate) |
+DownloadUIController::DownloadFilter |
+DownloadUIController::NewDownloadFilterFromDownloadHistory( |
+ DownloadHistory* download_history) { |
+ return base::Bind(&IsNewDownload, download_history); |
+} |
+ |
+DownloadUIController::DownloadUIController( |
+ content::DownloadManager* manager, |
+ const DownloadFilter& new_download_filter, |
+ scoped_ptr<Delegate> delegate) |
: download_notifier_(manager, this), |
+ new_download_filter_(new_download_filter), |
delegate_(delegate.Pass()) { |
+ DCHECK(!new_download_filter_.is_null()); |
if (!delegate_) { |
#if defined(OS_ANDROID) |
delegate_.reset(new DefaultUIControllerDelegateAndroid()); |
@@ -106,7 +136,7 @@ DownloadUIController::~DownloadUIController() { |
void DownloadUIController::OnDownloadCreated(content::DownloadManager* manager, |
content::DownloadItem* item) { |
// If this isn't a new download, there's nothing to do. |
- if (item->GetState() != content::DownloadItem::IN_PROGRESS) |
+ if (!new_download_filter_.Run(item)) |
Randy Smith (Not in Mondays)
2014/04/10 18:03:23
There's something basic I'm not understanding here
asanka
2014/04/17 21:16:10
This code was refactored somewhat, but the questio
|
return; |
DownloadItemModel(item).SetShouldNotifyUI(true); |
@@ -126,10 +156,6 @@ void DownloadUIController::OnDownloadUpdated(content::DownloadManager* manager, |
if (item->GetTargetFilePath().empty()) |
return; |
- // Can't be complete. That would imply that we didn't receive an |
- // OnDownloadUpdated() after the target was determined. |
- DCHECK_NE(content::DownloadItem::COMPLETE, item->GetState()); |
- |
DownloadItemModel(item).SetShouldNotifyUI(false); |
delegate_->NotifyDownloadStarting(item); |
} |