Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(727)

Unified Diff: chrome/browser/download/download_ui_controller.cc

Issue 11640007: Make the UI an observer of downloads. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Use DownloadItemModel. Address Nits. Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
+}
+

Powered by Google App Engine
This is Rietveld 408576698