| Index: chrome/browser/download/chrome_download_manager_delegate.cc
|
| diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc
|
| index 7feb00636d62350be3b251315a085d6366f681f7..c103387bb9ef4334f5045a409e7ec4441b41abc4 100644
|
| --- a/chrome/browser/download/chrome_download_manager_delegate.cc
|
| +++ b/chrome/browser/download/chrome_download_manager_delegate.cc
|
| @@ -86,35 +86,41 @@ class SafeBrowsingState : public DownloadCompletionBlocker {
|
|
|
| SafeBrowsingState::~SafeBrowsingState() {}
|
|
|
| -// Returns a file path in the form that is expected by
|
| -// platform_util::OpenItem/ShowItemInFolder, including any transformation
|
| -// required for download abstractions layered on top of the core system,
|
| -// e.g. download to Drive.
|
| +// Used with GetPlatformDownloadPath() to indicate which platform path to
|
| +// return.
|
| +enum PlatformDownloadPathType {
|
| + // Return the platform specific target path.
|
| + PLATFORM_TARGET_PATH,
|
| +
|
| + // Return the platform specific current path. If the download is in-progress
|
| + // and the download location is a local filesystem path, then
|
| + // GetPlatformDownloadPath will return the path to the intermediate file.
|
| + PLATFORM_CURRENT_PATH
|
| +};
|
| +
|
| +// Returns a path in the form that that is expected by platform_util::OpenItem /
|
| +// platform_util::ShowItemInFolder / DownloadTargetDeterminer.
|
| +//
|
| +// DownloadItems corresponding to Drive downloads use a temporary file as the
|
| +// target path. The paths returned by DownloadItem::GetFullPath() /
|
| +// GetTargetFilePath() refer to this temporary file. This function looks up the
|
| +// corresponding path in Drive for these downloads.
|
| +//
|
| +// How the platform path is determined is based on PlatformDownloadPathType.
|
| base::FilePath GetPlatformDownloadPath(Profile* profile,
|
| - const DownloadItem* download) {
|
| + const DownloadItem* download,
|
| + PlatformDownloadPathType path_type) {
|
| #if defined(OS_CHROMEOS)
|
| + // Drive downloads always return the target path for all types.
|
| drive::DownloadHandler* drive_download_handler =
|
| drive::DownloadHandler::GetForProfile(profile);
|
| if (drive_download_handler &&
|
| drive_download_handler->IsDriveDownload(download))
|
| return drive_download_handler->GetTargetPath(download);
|
| #endif
|
| - // The caller wants to open the download or show it in a file browser. The
|
| - // download could be in one of three states:
|
| - // - Complete: The path we want is GetTargetFilePath().
|
| - // - Not complete, but there's an intermediate file: GetFullPath() will be
|
| - // non-empty and is the location of the intermediate file. Since no target
|
| - // file exits yet, use GetFullPath(). This should only happen during
|
| - // ShowDownloadInShell().
|
| - // - Not Complete, and there's no intermediate file: GetFullPath() will be
|
| - // empty. This shouldn't happen since CanShowInFolder() returns false and
|
| - // this function shouldn't have been called.
|
| - if (download->GetState() == DownloadItem::COMPLETE) {
|
| - DCHECK(!download->GetTargetFilePath().empty());
|
| - return download->GetTargetFilePath();
|
| - }
|
|
|
| - DCHECK(!download->GetFullPath().empty());
|
| + if (path_type == PLATFORM_TARGET_PATH)
|
| + return download->GetTargetFilePath();
|
| return download->GetFullPath();
|
| }
|
|
|
| @@ -179,10 +185,13 @@ DownloadId ChromeDownloadManagerDelegate::GetNextId() {
|
| bool ChromeDownloadManagerDelegate::DetermineDownloadTarget(
|
| DownloadItem* download,
|
| const content::DownloadTargetCallback& callback) {
|
| - DownloadTargetDeterminer::Start(download,
|
| - download_prefs_.get(),
|
| - this,
|
| - callback);
|
| + DownloadTargetDeterminer::Start(
|
| + download,
|
| + GetPlatformDownloadPath(
|
| + profile_, download, PLATFORM_TARGET_PATH),
|
| + download_prefs_.get(),
|
| + this,
|
| + callback);
|
| return true;
|
| }
|
|
|
| @@ -331,14 +340,20 @@ void ChromeDownloadManagerDelegate::OpenDownload(DownloadItem* download) {
|
| DCHECK_EQ(DownloadItem::COMPLETE, download->GetState());
|
| if (!download->CanOpenDownload())
|
| return;
|
| - platform_util::OpenItem(GetPlatformDownloadPath(profile_, download));
|
| + base::FilePath platform_path(
|
| + GetPlatformDownloadPath(profile_, download, PLATFORM_TARGET_PATH));
|
| + DCHECK(!platform_path.empty());
|
| + platform_util::OpenItem(platform_path);
|
| }
|
|
|
| void ChromeDownloadManagerDelegate::ShowDownloadInShell(
|
| DownloadItem* download) {
|
| if (!download->CanShowInFolder())
|
| return;
|
| - platform_util::ShowItemInFolder(GetPlatformDownloadPath(profile_, download));
|
| + base::FilePath platform_path(
|
| + GetPlatformDownloadPath(profile_, download, PLATFORM_CURRENT_PATH));
|
| + DCHECK(!platform_path.empty());
|
| + platform_util::ShowItemInFolder(platform_path);
|
| }
|
|
|
| void ChromeDownloadManagerDelegate::CheckForFileExistence(
|
|
|