| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/download/save_package_file_picker_chromeos.h" | |
| 6 | |
| 7 #include "base/bind.h" | |
| 8 #include "base/bind_helpers.h" | |
| 9 #include "base/i18n/file_util_icu.h" | |
| 10 #include "base/threading/sequenced_worker_pool.h" | |
| 11 #include "chrome/browser/chromeos/drive/download_handler.h" | |
| 12 #include "chrome/browser/chromeos/drive/file_system_util.h" | |
| 13 #include "chrome/browser/platform_util.h" | |
| 14 #include "chrome/browser/profiles/profile_manager.h" | |
| 15 #include "chrome/browser/ui/chrome_select_file_policy.h" | |
| 16 #include "content/public/browser/download_item.h" | |
| 17 #include "content/public/browser/web_contents.h" | |
| 18 #include "content/public/browser/web_contents_view.h" | |
| 19 #include "ui/shell_dialogs/selected_file_info.h" | |
| 20 | |
| 21 namespace { | |
| 22 | |
| 23 // If false, we don't prompt the user as to where to save the file. This | |
| 24 // exists only for testing. | |
| 25 bool g_should_prompt_for_filename = true; | |
| 26 | |
| 27 // Trampoline callback between SubstituteDriveDownloadPath() and |callback|. | |
| 28 void ContinueSettingUpDriveDownload( | |
| 29 const content::SavePackagePathPickedCallback& callback, | |
| 30 bool is_html, | |
| 31 Profile* profile, | |
| 32 const base::FilePath& drive_path, | |
| 33 const base::FilePath& drive_tmp_download_path) { | |
| 34 if (drive_tmp_download_path.empty()) // Substitution failed. | |
| 35 return; | |
| 36 | |
| 37 callback.Run( | |
| 38 drive_tmp_download_path, | |
| 39 (is_html ? | |
| 40 content::SAVE_PAGE_TYPE_AS_MHTML : | |
| 41 content::SAVE_PAGE_TYPE_AS_ONLY_HTML), | |
| 42 base::Bind(&drive::DownloadHandler::SetDownloadParams, | |
| 43 base::Unretained( | |
| 44 drive::DownloadHandler::GetForProfile(profile)), | |
| 45 drive_path)); | |
| 46 } | |
| 47 | |
| 48 } // namespace | |
| 49 | |
| 50 SavePackageFilePickerChromeOS::SavePackageFilePickerChromeOS( | |
| 51 content::WebContents* web_contents, | |
| 52 const base::FilePath& suggested_path, | |
| 53 bool is_html, | |
| 54 const content::SavePackagePathPickedCallback& callback) | |
| 55 : content::WebContentsObserver(web_contents), | |
| 56 callback_(callback), | |
| 57 is_html_(is_html) { | |
| 58 base::FilePath suggested_path_copy(is_html_ ? | |
| 59 suggested_path.ReplaceExtension("mhtml") : | |
| 60 suggested_path); | |
| 61 if (g_should_prompt_for_filename) { | |
| 62 select_file_dialog_ = ui::SelectFileDialog::Create( | |
| 63 this, new ChromeSelectFilePolicy(web_contents)); | |
| 64 ui::SelectFileDialog::FileTypeInfo file_types; | |
| 65 file_types.support_drive = true; | |
| 66 select_file_dialog_->SelectFile( | |
| 67 ui::SelectFileDialog::SELECT_SAVEAS_FILE, | |
| 68 string16(), | |
| 69 suggested_path_copy, | |
| 70 &file_types, | |
| 71 0, | |
| 72 suggested_path_copy.Extension(), | |
| 73 platform_util::GetTopLevel(web_contents->GetView()->GetNativeView()), | |
| 74 NULL); | |
| 75 } else { | |
| 76 FileSelected(suggested_path_copy, 0, NULL); | |
| 77 } | |
| 78 } | |
| 79 | |
| 80 void SavePackageFilePickerChromeOS::SetShouldPromptUser(bool should_prompt) { | |
| 81 g_should_prompt_for_filename = should_prompt; | |
| 82 } | |
| 83 | |
| 84 SavePackageFilePickerChromeOS::~SavePackageFilePickerChromeOS() { | |
| 85 } | |
| 86 | |
| 87 void SavePackageFilePickerChromeOS::FileSelected( | |
| 88 const base::FilePath& selected_path, | |
| 89 int unused_index, | |
| 90 void* unused_params) { | |
| 91 FileSelectedWithExtraInfo( | |
| 92 ui::SelectedFileInfo(selected_path, selected_path), | |
| 93 unused_index, | |
| 94 unused_params); | |
| 95 } | |
| 96 | |
| 97 void SavePackageFilePickerChromeOS::FileSelectedWithExtraInfo( | |
| 98 const ui::SelectedFileInfo& selected_file_info, | |
| 99 int unused_index, | |
| 100 void* unused_params) { | |
| 101 if (!web_contents()) { | |
| 102 delete this; | |
| 103 return; | |
| 104 } | |
| 105 base::FilePath selected_path = selected_file_info.file_path; | |
| 106 file_util::NormalizeFileNameEncoding(&selected_path); | |
| 107 Profile* profile = Profile::FromBrowserContext( | |
| 108 web_contents()->GetBrowserContext()); | |
| 109 DCHECK(profile); | |
| 110 | |
| 111 if (drive::util::IsUnderDriveMountPoint(selected_path)) { | |
| 112 // Here's a map to the callback chain: | |
| 113 // SubstituteDriveDownloadPath -> | |
| 114 // ContinueSettingUpDriveDownload -> | |
| 115 // callback_ = SavePackage::OnPathPicked -> | |
| 116 // download_created_callback = OnSavePackageDownloadCreated | |
| 117 drive::DownloadHandler* drive_download_handler = | |
| 118 drive::DownloadHandler::GetForProfile(profile); | |
| 119 DCHECK(drive_download_handler); | |
| 120 drive_download_handler-> | |
| 121 SubstituteDriveDownloadPath(selected_path, NULL, | |
| 122 base::Bind(&ContinueSettingUpDriveDownload, | |
| 123 callback_, | |
| 124 is_html_, | |
| 125 profile, | |
| 126 selected_path)); | |
| 127 } else { | |
| 128 callback_.Run(selected_path, | |
| 129 (is_html_ ? | |
| 130 content::SAVE_PAGE_TYPE_AS_MHTML : | |
| 131 content::SAVE_PAGE_TYPE_AS_ONLY_HTML), | |
| 132 content::SavePackageDownloadCreatedCallback()); | |
| 133 } | |
| 134 delete this; | |
| 135 } | |
| 136 | |
| 137 void SavePackageFilePickerChromeOS::FileSelectionCanceled(void* params) { | |
| 138 delete this; | |
| 139 } | |
| OLD | NEW |