Index: chrome/browser/download/save_package_file_picker.cc |
diff --git a/chrome/browser/download/save_package_file_picker.cc b/chrome/browser/download/save_package_file_picker.cc |
index fe76d68f70d942175817fc8033de403a12939027..693d900c54b7e6a0daa0a81262b7ae1dcdae7bee 100644 |
--- a/chrome/browser/download/save_package_file_picker.cc |
+++ b/chrome/browser/download/save_package_file_picker.cc |
@@ -4,7 +4,9 @@ |
#include "chrome/browser/download/save_package_file_picker.h" |
+#include "base/bind.h" |
#include "base/command_line.h" |
+#include "base/i18n/file_util_icu.h" |
#include "base/metrics/histogram.h" |
#include "base/prefs/pref_member.h" |
#include "base/prefs/pref_service.h" |
@@ -24,6 +26,11 @@ |
#include "grit/generated_resources.h" |
#include "ui/base/l10n/l10n_util.h" |
+#if defined(OS_CHROMEOS) |
+#include "chrome/browser/chromeos/drive/download_handler.h" |
+#include "chrome/browser/chromeos/drive/file_system_util.h" |
+#endif |
+ |
using content::RenderProcessHost; |
using content::SavePageType; |
using content::WebContents; |
@@ -60,51 +67,86 @@ const int kIndexToIDS[] = { |
0, IDS_SAVE_PAGE_DESC_HTML_ONLY, IDS_SAVE_PAGE_DESC_COMPLETE, |
}; |
-void OnSavePackageDownloadCreated( |
- content::DownloadItem* download) { |
+void OnSavePackageDownloadCreated(content::DownloadItem* download) { |
ChromeDownloadManagerDelegate::DisableSafeBrowsing(download); |
} |
+#if defined(OS_CHROMEOS) |
+void OnSavePackageDownloadCreatedChromeOS( |
+ Profile* profile, |
+ const base::FilePath& drive_path, |
+ content::DownloadItem* download) { |
+ drive::DownloadHandler::GetForProfile(profile)->SetDownloadParams( |
+ drive_path, download); |
+ OnSavePackageDownloadCreated(download); |
+} |
+ |
+// Trampoline callback between SubstituteDriveDownloadPath() and |callback|. |
+void ContinueSettingUpDriveDownload( |
+ const content::SavePackagePathPickedCallback& callback, |
+ content::SavePageType save_type, |
+ Profile* profile, |
+ const base::FilePath& drive_path, |
+ const base::FilePath& drive_tmp_download_path) { |
+ if (drive_tmp_download_path.empty()) // Substitution failed. |
+ return; |
+ callback.Run(drive_tmp_download_path, save_type, base::Bind( |
+ &OnSavePackageDownloadCreatedChromeOS, profile, drive_path)); |
+} |
+#endif |
+ |
} // anonymous namespace |
bool SavePackageFilePicker::ShouldSaveAsMHTML() const { |
- return can_save_as_complete_ && |
- CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kSavePageAsMHTML); |
+#if !defined(OS_CHROMEOS) |
+ if (!CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kSavePageAsMHTML)) |
+ return false; |
+#endif |
+ return can_save_as_complete_; |
} |
SavePackageFilePicker::SavePackageFilePicker( |
content::WebContents* web_contents, |
- const base::FilePath& suggested_path_const, |
- const base::FilePath::StringType& default_extension_const, |
+ const base::FilePath& suggested_path, |
+ const base::FilePath::StringType& default_extension, |
bool can_save_as_complete, |
DownloadPrefs* download_prefs, |
const content::SavePackagePathPickedCallback& callback) |
: render_process_id_(web_contents->GetRenderProcessHost()->GetID()), |
can_save_as_complete_(can_save_as_complete), |
+ download_prefs_(download_prefs), |
callback_(callback) { |
- base::FilePath suggested_path = suggested_path_const; |
- base::FilePath::StringType default_extension = default_extension_const; |
- int file_type_index = SavePackageTypeToIndex( |
- static_cast<SavePageType>(download_prefs->save_file_type())); |
- DCHECK_NE(-1, file_type_index); |
- |
+ base::FilePath suggested_path_copy = suggested_path; |
+ base::FilePath::StringType default_extension_copy = default_extension; |
+ int file_type_index = 0; |
ui::SelectFileDialog::FileTypeInfo file_type_info; |
+#if defined(OS_CHROMEOS) |
+ file_type_info.support_drive = true; |
+#else |
+ file_type_index = SavePackageTypeToIndex( |
+ static_cast<SavePageType>(download_prefs_->save_file_type())); |
+ DCHECK_NE(-1, file_type_index); |
+#endif |
+ |
// TODO(benjhayden): Merge the first branch with the second when all of the |
// platform-specific file selection dialog implementations fully support |
// switching save-as file formats, and remove the flag/switch. |
if (ShouldSaveAsMHTML()) { |
- default_extension = FILE_PATH_LITERAL("mhtml"); |
- suggested_path = suggested_path.ReplaceExtension(default_extension); |
- } else if (can_save_as_complete) { |
+ default_extension_copy = FILE_PATH_LITERAL("mhtml"); |
+ suggested_path_copy = suggested_path_copy.ReplaceExtension( |
+ default_extension_copy); |
+ } else if (can_save_as_complete_) { |
+ // NOTE: this branch will never run on chromeos because ShouldSaveAsHTML() |
+ // == can_save_as_complete_ on chromeos. |
bool add_extra_extension = false; |
base::FilePath::StringType extra_extension; |
- if (!suggested_path.Extension().empty() && |
- suggested_path.Extension().compare(FILE_PATH_LITERAL("htm")) && |
- suggested_path.Extension().compare(FILE_PATH_LITERAL("html"))) { |
+ if (!suggested_path_copy.Extension().empty() && |
+ !suggested_path_copy.MatchesExtension(FILE_PATH_LITERAL(".htm")) && |
+ !suggested_path_copy.MatchesExtension(FILE_PATH_LITERAL(".html"))) { |
add_extra_extension = true; |
- extra_extension = suggested_path.Extension().substr(1); |
+ extra_extension = suggested_path_copy.Extension().substr(1); |
} |
static const size_t kNumberExtensions = arraysize(kIndexToIDS) - 1; |
@@ -145,8 +187,7 @@ SavePackageFilePicker::SavePackageFilePicker( |
// The contents can not be saved as complete-HTML, so do not show the file |
// filters. |
file_type_info.extensions.resize(1); |
- file_type_info.extensions[0].push_back( |
- suggested_path.Extension()); |
+ file_type_info.extensions[0].push_back(suggested_path_copy.Extension()); |
if (!file_type_info.extensions[0][0].empty()) { |
// Drop the . |
@@ -163,16 +204,16 @@ SavePackageFilePicker::SavePackageFilePicker( |
select_file_dialog_->SelectFile( |
ui::SelectFileDialog::SELECT_SAVEAS_FILE, |
string16(), |
- suggested_path, |
+ suggested_path_copy, |
&file_type_info, |
file_type_index, |
- default_extension, |
+ default_extension_copy, |
platform_util::GetTopLevel(web_contents->GetView()->GetNativeView()), |
NULL); |
} else { |
- // Just use 'suggested_path' instead of opening the dialog prompt. |
+ // Just use 'suggested_path_copy' instead of opening the dialog prompt. |
// Go through FileSelected() for consistency. |
- FileSelected(suggested_path, file_type_index, NULL); |
+ FileSelected(suggested_path_copy, file_type_index, NULL); |
} |
} |
@@ -183,47 +224,62 @@ void SavePackageFilePicker::SetShouldPromptUser(bool should_prompt) { |
g_should_prompt_for_filename = should_prompt; |
} |
-void SavePackageFilePicker::FileSelected(const base::FilePath& path, |
- int index, |
- void* unused_params) { |
+void SavePackageFilePicker::FileSelected( |
+ const base::FilePath& path, int index, void* unused_params) { |
+ scoped_ptr<SavePackageFilePicker> delete_this(this); |
RenderProcessHost* process = RenderProcessHost::FromID(render_process_id_); |
- if (process) { |
- SavePageType save_type = content::SAVE_PAGE_TYPE_UNKNOWN; |
- PrefService* prefs = Profile::FromBrowserContext( |
- process->GetBrowserContext())->GetPrefs(); |
- if (ShouldSaveAsMHTML()) { |
- save_type = content::SAVE_PAGE_TYPE_AS_MHTML; |
- } else { |
- // The option index is not zero-based. |
- DCHECK(index >= kSelectFileHtmlOnlyIndex && |
- index <= kSelectFileCompleteIndex); |
- save_type = kIndexToSaveType[index]; |
- if (select_file_dialog_ && |
- select_file_dialog_->HasMultipleFileTypeChoices()) |
- prefs->SetInteger(prefs::kSaveFileType, save_type); |
- } |
+ if (!process) |
+ return; |
+ SavePageType save_type = content::SAVE_PAGE_TYPE_UNKNOWN; |
- UMA_HISTOGRAM_ENUMERATION("Download.SavePageType", |
- save_type, |
- content::SAVE_PAGE_TYPE_MAX); |
- |
- StringPrefMember save_file_path; |
- save_file_path.Init(prefs::kSaveFileDefaultDirectory, prefs); |
-#if defined(OS_POSIX) |
- std::string path_string = path.DirName().value(); |
-#elif defined(OS_WIN) |
- std::string path_string = WideToUTF8(path.DirName().value()); |
+ if (ShouldSaveAsMHTML()) { |
+ save_type = content::SAVE_PAGE_TYPE_AS_MHTML; |
+ } else { |
+#if defined(OS_CHROMEOS) |
+ save_type = content::SAVE_PAGE_TYPE_AS_ONLY_HTML; |
+#else |
+ // The option index is not zero-based. |
+ DCHECK(index >= kSelectFileHtmlOnlyIndex && |
+ index <= kSelectFileCompleteIndex); |
+ save_type = kIndexToSaveType[index]; |
+ if (select_file_dialog_ && |
+ select_file_dialog_->HasMultipleFileTypeChoices()) |
+ download_prefs_->SetSaveFileType(save_type); |
#endif |
- // If user change the default saving directory, we will remember it just |
- // like IE and FireFox. |
- if (!process->GetBrowserContext()->IsOffTheRecord() && |
- save_file_path.GetValue() != path_string) |
- save_file_path.SetValue(path_string); |
+ } |
+ |
+ UMA_HISTOGRAM_ENUMERATION("Download.SavePageType", |
+ save_type, |
+ content::SAVE_PAGE_TYPE_MAX); |
+ |
+ base::FilePath path_copy(path); |
+ file_util::NormalizeFileNameEncoding(&path_copy); |
- callback_.Run(path, save_type, base::Bind(&OnSavePackageDownloadCreated)); |
+ download_prefs_->SetSaveFilePath(path_copy.DirName()); |
+ |
+#if defined(OS_CHROMEOS) |
+ if (drive::util::IsUnderDriveMountPoint(path_copy)) { |
+ // Here's a map to the callback chain: |
+ // SubstituteDriveDownloadPath -> |
+ // ContinueSettingUpDriveDownload -> |
+ // callback_ = SavePackage::OnPathPicked -> |
+ // download_created_callback = OnSavePackageDownloadCreatedChromeOS |
+ Profile* profile = Profile::FromBrowserContext( |
+ process->GetBrowserContext()); |
+ drive::DownloadHandler* drive_download_handler = |
+ drive::DownloadHandler::GetForProfile(profile); |
+ drive_download_handler->SubstituteDriveDownloadPath( |
+ path_copy, NULL, base::Bind(&ContinueSettingUpDriveDownload, |
+ callback_, |
+ save_type, |
+ profile, |
+ path_copy)); |
+ return; |
} |
+#endif |
- delete this; |
+ callback_.Run(path_copy, save_type, |
+ base::Bind(&OnSavePackageDownloadCreated)); |
} |
void SavePackageFilePicker::FileSelectionCanceled(void* unused_params) { |