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 5c249cd3f5f9ef2858758f9265bac233a59e8ed7..74e0ac5e7e26995a06f137c25dd1970a4a36e4e8 100644 |
--- a/chrome/browser/download/download_ui_controller.cc |
+++ b/chrome/browser/download/download_ui_controller.cc |
@@ -7,7 +7,6 @@ |
#include "base/callback.h" |
#include "base/stl_util.h" |
#include "chrome/browser/download/download_item_model.h" |
-#include "chrome/browser/ui/browser_finder.h" |
#include "chrome/browser/ui/browser_tabstrip.h" |
#include "content/public/browser/download_item.h" |
#include "content/public/browser/web_contents.h" |
@@ -16,95 +15,12 @@ |
#if defined(OS_ANDROID) |
#include "content/public/browser/android/download_controller_android.h" |
#else |
+#include "chrome/browser/ui/browser_finder.h" |
#include "chrome/browser/profiles/profile.h" |
#endif |
-namespace { |
- |
-// DefaultUIControllerDelegate{Android,} is used when a DownloadUIController is |
-// constructed without specifying an explicit Delegate. |
-#if defined(OS_ANDROID) |
- |
-class DefaultUIControllerDelegateAndroid |
- : public DownloadUIController::Delegate { |
- public: |
- DefaultUIControllerDelegateAndroid() {} |
- ~DefaultUIControllerDelegateAndroid() override {} |
- |
- private: |
- // DownloadUIController::Delegate |
- void OnNewDownloadReady(content::DownloadItem* item) override; |
-}; |
- |
-void DefaultUIControllerDelegateAndroid::OnNewDownloadReady( |
- 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(). |
- content::DownloadControllerAndroid::Get()->OnDownloadStarted(item); |
-} |
- |
-#else // OS_ANDROID |
- |
-class DefaultUIControllerDelegate : public DownloadUIController::Delegate { |
- public: |
- // |profile| is required to outlive DefaultUIControllerDelegate. |
- explicit DefaultUIControllerDelegate(Profile* profile) |
- : profile_(profile) {} |
- ~DefaultUIControllerDelegate() override {} |
- |
- private: |
- // DownloadUIController::Delegate |
- void OnNewDownloadReady(content::DownloadItem* item) override; |
- |
- Profile* profile_; |
-}; |
- |
-void DefaultUIControllerDelegate::OnNewDownloadReady( |
- content::DownloadItem* item) { |
- content::WebContents* web_contents = item->GetWebContents(); |
- Browser* browser = |
- web_contents ? chrome::FindBrowserWithWebContents(web_contents) : NULL; |
- |
- // As a last resort, use the last active browser for this profile. Not ideal, |
- // but better than not showing the download at all. |
- if (browser == NULL) { |
- browser = chrome::FindLastActiveWithProfile(profile_, |
- chrome::GetActiveDesktop()); |
- } |
- |
- if (browser) |
- browser->ShowDownload(item); |
-} |
- |
-#endif // !OS_ANDROID |
- |
-} // namespace |
- |
-DownloadUIController::Delegate::~Delegate() { |
-} |
- |
-DownloadUIController::DownloadUIController(content::DownloadManager* manager, |
- scoped_ptr<Delegate> delegate) |
- : download_notifier_(manager, this), |
- delegate_(delegate.Pass()) { |
- if (!delegate_) { |
-#if defined(OS_ANDROID) |
- delegate_.reset(new DefaultUIControllerDelegateAndroid()); |
-#else |
- // The delegate should not be invoked after the profile has gone away. This |
- // should be the case since DownloadUIController is owned by |
- // DownloadService, which in turn is a profile keyed service. |
- delegate_.reset(new DefaultUIControllerDelegate( |
- Profile::FromBrowserContext(manager->GetBrowserContext()))); |
-#endif |
- } |
+DownloadUIController::DownloadUIController(content::DownloadManager* manager) |
+ : download_notifier_(manager, this) { |
} |
DownloadUIController::~DownloadUIController() { |
@@ -130,6 +46,34 @@ void DownloadUIController::OnDownloadUpdated(content::DownloadManager* manager, |
if (item->GetTargetFilePath().empty()) |
return; |
- DownloadItemModel(item).SetWasUINotified(true); |
- delegate_->OnNewDownloadReady(item); |
+ item_model.SetWasUINotified(true); |
+ |
+#if defined(OS_ANDROID) |
+ // 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(). |
+ content::DownloadControllerAndroid::Get()->OnDownloadStarted(item); |
+#else |
+ content::WebContents* web_contents = item->GetWebContents(); |
+ Browser* browser = |
+ web_contents ? chrome::FindBrowserWithWebContents(web_contents) : NULL; |
+ |
+ // As a last resort, use the last active browser for this profile. Not |
+ // ideal, but better than not showing the download at all. |
+ if (!browser) { |
+ Profile* profile = Profile::FromBrowserContext( |
+ download_notifier_.GetManager()->GetBrowserContext()); |
+ browser = chrome::FindLastActiveWithProfile(profile, |
+ chrome::GetActiveDesktop()); |
+ } |
+ |
+ if (browser) |
+ browser->ShowDownload(item); |
+#endif |
} |