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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..aad6ba84812ddf403cd066134a40c51b6602ca8b |
--- /dev/null |
+++ b/chrome/browser/download/download_ui_controller.cc |
@@ -0,0 +1,110 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/download/download_ui_controller.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" |
+#include "content/public/browser/web_contents_delegate.h" |
+ |
+#if defined(OS_ANDROID) |
+#include "content/public/browser/android/download_controller_android.h" |
+#else |
+#include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h" |
+#include "chrome/browser/ui/blocked_content/blocked_content_tab_helper_delegate.h" |
+#endif |
+ |
+DownloadUIController::DownloadUIController(Profile* profile, |
+ content::DownloadManager* manager) |
+ : ALLOW_THIS_IN_INITIALIZER_LIST(notifier_(manager, this)), |
+ profile_(profile) { |
+} |
+ |
+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->IsInProgress()) |
+ return; |
+ |
+ DownloadItemModel(item).SetShouldNotifyUI(true); |
+ // SavePackage downloads are created in a state where they can be shown |
+ // immediately in the browser. |
+ OnDownloadUpdated(manager, item); |
+} |
+ |
+void DownloadUIController::OnDownloadUpdated(content::DownloadManager* manager, |
+ content::DownloadItem* item) { |
+ |
+ // Ignore if we've already notified the UI about |item| or if it isn't a new |
+ // download. |
+ if (!DownloadItemModel(item).ShouldNotifyUI()) |
+ return; |
+ |
+ // Wait until the target path is determined. |
+ if (item->GetTargetFilePath().empty()) |
+ return; |
+ |
+ // For a download that is in-progress, wait until the intermediate rename is |
+ // complete. |
Randy Smith (Not in Mondays)
2012/12/20 23:09:25
What's the goal here? And isn't it true that the
asanka
2012/12/20 23:56:19
I suppose the TODO wasn't a giveaway.
asanka
2013/01/10 22:12:14
https://codereview.chromium.org/11801022/. I'm cha
|
+ // TODO(asanka): Get rid of remaining users of GetFullPath() in ui/. |
+ if (item->IsInProgress() && item->GetFullPath().empty()) |
+ return; |
+ |
+ // At this point, we expect that the download is either interrupted, or |
+ // in-progress and the path is known. |
Randy Smith (Not in Mondays)
2012/12/20 23:09:25
What happens if the download is interrupted before
asanka
2012/12/20 23:56:19
Target name determination happens in chrome/. If t
|
+ |
+ // Can't be complete. That would imply that we didn't receive an |
+ // OnDownloadUpdated() after the intermediate rename was completed. |
+ DCHECK(!item->IsComplete()); |
+ |
+ DownloadItemModel(item).SetShouldNotifyUI(false); |
+ NotifyDownloadStarting(item); |
+} |
+ |
+void DownloadUIController::NotifyDownloadStarting(content::DownloadItem* item) { |
+#if defined(OS_ANDROID) |
+ // GET downloads are delegated to the Android DownloadManager. Chrome is only |
+ // responsible for POST downloads. See |
+ // ChromeWebContentsDelegateAndroid::CanDownload(). |
+ content::DownloadControllerAndroid::Get()->OnPostDownloadStarted(item); |
+#else |
+ content::WebContents* web_contents = item->GetWebContents(); |
+ |
+ // If the tab requesting the download is a constrained popup that is not |
+ // shown, treat the request as if it came from the parent. |
+ if (web_contents != NULL) { |
+ BlockedContentTabHelper* blocked_content_tab_helper = |
+ BlockedContentTabHelper::FromWebContents(web_contents); |
+ if (blocked_content_tab_helper && |
+ blocked_content_tab_helper->delegate()) { |
+ content::WebContents* constraining_web_contents = |
+ blocked_content_tab_helper->delegate()-> |
+ GetConstrainingWebContents(web_contents); |
+ if (constraining_web_contents) |
+ web_contents = constraining_web_contents; |
+ } |
+ } |
+ |
+ 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 |
+} |
+ |