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

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

Issue 6973052: When the download folder does not exist, change the download folder to a user's "Downloads" (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Overrides the user's "Downloads" folder in DownloadPrefs Created 9 years, 6 months 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_manager.cc
diff --git a/chrome/browser/download/download_manager.cc b/chrome/browser/download/download_manager.cc
index 872464127f82afe8eae42a99d2600fd0e30ccbc8..3e0bdd9d0148bb2a353abce3a27a80554ccc6ad0 100644
--- a/chrome/browser/download/download_manager.cc
+++ b/chrome/browser/download/download_manager.cc
@@ -8,7 +8,6 @@
#include "base/file_util.h"
#include "base/i18n/case_conversion.h"
#include "base/logging.h"
-#include "base/path_service.h"
#include "base/rand_util.h"
#include "base/stl_util-inl.h"
#include "base/stringprintf.h"
@@ -365,33 +364,26 @@ void DownloadManager::CheckVisitedReferrerBeforeDone(
&DownloadManager::CheckIfSuggestedPathExists,
download->id(),
state,
- download_prefs()->download_path()));
+ download_prefs()->download_path(),
+ download_prefs()->GetDefaultDownloadDirectory()));
}
-void DownloadManager::CheckIfSuggestedPathExists(int32 download_id,
- DownloadStateInfo state,
- const FilePath& default_path) {
+void DownloadManager::CheckIfSuggestedPathExists(
+ int32 download_id,
+ DownloadStateInfo state,
+ const FilePath& download_save_dir,
+ const FilePath& default_download_dir) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- // Make sure the default download directory exists.
- // TODO(phajdan.jr): only create the directory when we're sure the user
- // is going to save there and not to another directory of his choice.
- file_util::CreateDirectory(default_path);
-
- // Check writability of the suggested path. If we can't write to it, default
- // to the user's "My Documents" directory. We'll prompt them in this case.
- FilePath dir = state.suggested_path.DirName();
- FilePath filename = state.suggested_path.BaseName();
- if (!file_util::PathIsWritable(dir)) {
- VLOG(1) << "Unable to write to directory \"" << dir.value() << "\"";
+ FilePath save_dir;
+ if (ChooseSavableDirectory(
+ FilePath(), download_save_dir, default_download_dir, &save_dir))
state.prompt_user_for_save_location = true;
- PathService::Get(chrome::DIR_USER_DOCUMENTS, &state.suggested_path);
- state.suggested_path = state.suggested_path.Append(filename);
- }
+ state.suggested_path = save_dir.Append(state.suggested_path.BaseName());
// If the download is deemed dangerous, we'll use a temporary name for it.
if (state.IsDangerous()) {
- state.target_name = FilePath(state.suggested_path).BaseName();
+ state.target_name = state.suggested_path.BaseName();
// Create a temporary file to hold the file until the user approves its
// download.
FilePath::StringType file_name;
@@ -410,7 +402,7 @@ void DownloadManager::CheckIfSuggestedPathExists(int32 download_id,
unconfirmed_prefix.append(
FILE_PATH_LITERAL(" %d.crdownload")).c_str(),
base::RandInt(0, 100000));
- path = dir.Append(file_name);
+ path = state.suggested_path.DirName().Append(file_name);
if (file_util::PathExists(path))
path = FilePath();
}
@@ -500,7 +492,7 @@ void DownloadManager::OnPathExistenceAvailable(int32 download_id,
contents, owning_window,
reinterpret_cast<void*>(id_ptr));
FOR_EACH_OBSERVER(Observer, observers_,
- SelectFileDialogDisplayed(download_id));
+ SelectFileDialogDisplayed(download_id, suggested_path));
} else {
// No prompting for download, just continue with the suggested name.
ContinueDownloadWithPath(download, suggested_path);
@@ -652,6 +644,40 @@ void DownloadManager::AssertNotInQueues(DownloadItem* download) {
CHECK(!ContainsKey(history_downloads_, download->db_handle()));
}
+// static
+bool DownloadManager::ChooseSavableDirectory(
+ const FilePath& website_save_dir,
+ const FilePath& download_save_dir,
+ const FilePath& default_download_dir,
+ FilePath* save_dir) {
+ bool prompt_dialog = false;
+ if (file_util::PathIsWritable(website_save_dir)) {
+ // If the default html/websites save folder exists,
+ // then use the default h5Btml/websites save folder.
+ *save_dir = website_save_dir;
+ } else if (file_util::PathIsWritable(download_save_dir)) {
+ // If the default html/websites save folder does not exist
+ // but the default download folder exists,
+ // then use the default download folder.
+ *save_dir = download_save_dir;
+ } else {
+ // If both the above folders do not exist,
+ // use the user's "Downloads" folder.
+ *save_dir = default_download_dir;
+ prompt_dialog = true;
+ if (!file_util::PathIsWritable(*save_dir)) {
+ VLOG(1) << "Cannot find the user's writable \"Downloads\" folder.";
+ // Create the |download_save_dir| folder if we cannot get
+ // the user's writable "Downloads" folder (This will be a rare case).
+ *save_dir = download_save_dir;
+ }
+ // Make sure that the folder does exist.
+ if (!file_util::CreateDirectory(*save_dir))
+ LOG(ERROR) << "Failed to create " << (*save_dir).value();
+ }
+ return prompt_dialog;
+}
+
bool DownloadManager::IsDownloadReadyForCompletion(DownloadItem* download) {
// If we don't have all the data, the download is not ready for
// completion.

Powered by Google App Engine
This is Rietveld 408576698