Chromium Code Reviews| 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 |
| +} |
| + |