| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/api/file_system/file_system_api.h" | 5 #include "chrome/browser/extensions/api/file_system/file_system_api.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/file_path.h" | 8 #include "base/file_path.h" |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "chrome/browser/extensions/shell_window_registry.h" | 10 #include "chrome/browser/extensions/shell_window_registry.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 const char kUserCancelled[] = "User cancelled"; | 25 const char kUserCancelled[] = "User cancelled"; |
| 26 const char kWritableFileError[] = "Invalid file for writing"; | 26 const char kWritableFileError[] = "Invalid file for writing"; |
| 27 | 27 |
| 28 const char kSaveFileOption[] = "saveFile"; | 28 const char kSaveFileOption[] = "saveFile"; |
| 29 | 29 |
| 30 namespace file_system = extensions::api::file_system; | 30 namespace file_system = extensions::api::file_system; |
| 31 namespace ChooseFile = file_system::ChooseFile; | 31 namespace ChooseFile = file_system::ChooseFile; |
| 32 | 32 |
| 33 namespace { | 33 namespace { |
| 34 | 34 |
| 35 bool g_skip_picker = false; |
| 36 FilePath* g_path_to_be_picked; |
| 37 |
| 35 bool GetFilePathOfFileEntry(const std::string& filesystem_name, | 38 bool GetFilePathOfFileEntry(const std::string& filesystem_name, |
| 36 const std::string& filesystem_path, | 39 const std::string& filesystem_path, |
| 37 const content::RenderViewHost* render_view_host, | 40 const content::RenderViewHost* render_view_host, |
| 38 FilePath* file_path, | 41 FilePath* file_path, |
| 39 std::string* error) { | 42 std::string* error) { |
| 40 std::string filesystem_id; | 43 std::string filesystem_id; |
| 41 if (!fileapi::CrackIsolatedFileSystemName(filesystem_name, &filesystem_id)) { | 44 if (!fileapi::CrackIsolatedFileSystemName(filesystem_name, &filesystem_id)) { |
| 42 *error = kInvalidParameters; | 45 *error = kInvalidParameters; |
| 43 return false; | 46 return false; |
| 44 } | 47 } |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 FilePath::StringType extension = suggested_path.Extension(); | 122 FilePath::StringType extension = suggested_path.Extension(); |
| 120 if (!extension.empty()) { | 123 if (!extension.empty()) { |
| 121 extension.erase(extension.begin()); // drop the . | 124 extension.erase(extension.begin()); // drop the . |
| 122 file_type_info.extensions.resize(1); | 125 file_type_info.extensions.resize(1); |
| 123 file_type_info.extensions[0].push_back(extension); | 126 file_type_info.extensions[0].push_back(extension); |
| 124 } | 127 } |
| 125 file_type_info.include_all_files = true; | 128 file_type_info.include_all_files = true; |
| 126 gfx::NativeWindow owning_window = web_contents ? | 129 gfx::NativeWindow owning_window = web_contents ? |
| 127 platform_util::GetTopLevel(web_contents->GetNativeView()) : NULL; | 130 platform_util::GetTopLevel(web_contents->GetNativeView()) : NULL; |
| 128 | 131 |
| 132 if (g_skip_picker) { |
| 133 if (g_path_to_be_picked) { |
| 134 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, |
| 135 base::Bind(&FileSystemPickerFunction::FilePicker::FileSelected, |
| 136 base::Unretained(this), *g_path_to_be_picked, 1, |
| 137 static_cast<void*>(NULL))); |
| 138 } else { |
| 139 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, |
| 140 base::Bind( |
| 141 &FileSystemPickerFunction::FilePicker::FileSelectionCanceled, |
| 142 base::Unretained(this), static_cast<void*>(NULL))); |
| 143 } |
| 144 return; |
| 145 } |
| 146 |
| 129 select_file_dialog_->SelectFile(for_save ? | 147 select_file_dialog_->SelectFile(for_save ? |
| 130 SelectFileDialog::SELECT_SAVEAS_FILE : | 148 SelectFileDialog::SELECT_SAVEAS_FILE : |
| 131 SelectFileDialog::SELECT_OPEN_FILE, | 149 SelectFileDialog::SELECT_OPEN_FILE, |
| 132 string16(), | 150 string16(), |
| 133 suggested_path, | 151 suggested_path, |
| 134 &file_type_info, 0, FILE_PATH_LITERAL(""), | 152 &file_type_info, 0, FILE_PATH_LITERAL(""), |
| 135 web_contents, owning_window, NULL); | 153 web_contents, owning_window, NULL); |
| 136 } | 154 } |
| 137 | 155 |
| 138 virtual ~FilePicker() {} | 156 virtual ~FilePicker() {} |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 } | 194 } |
| 177 | 195 |
| 178 // The file picker will hold a reference to this function instance, preventing | 196 // The file picker will hold a reference to this function instance, preventing |
| 179 // its destruction (and subsequent sending of the function response) until the | 197 // its destruction (and subsequent sending of the function response) until the |
| 180 // user has selected a file or cancelled the picker. At that point, the picker | 198 // user has selected a file or cancelled the picker. At that point, the picker |
| 181 // will delete itself, which will also free the function instance. | 199 // will delete itself, which will also free the function instance. |
| 182 new FilePicker(this, shell_window->web_contents(), suggested_path, for_save); | 200 new FilePicker(this, shell_window->web_contents(), suggested_path, for_save); |
| 183 return true; | 201 return true; |
| 184 } | 202 } |
| 185 | 203 |
| 204 // static |
| 205 void FileSystemPickerFunction::SkipPickerAndAlwaysSelectPath(FilePath* path) { |
| 206 g_skip_picker = true; |
| 207 g_path_to_be_picked = path; |
| 208 } |
| 209 |
| 210 // static |
| 211 void FileSystemPickerFunction::SkipPickerAndAlwaysCancel() { |
| 212 g_skip_picker = true; |
| 213 g_path_to_be_picked = NULL; |
| 214 } |
| 215 |
| 216 // static |
| 217 void FileSystemPickerFunction::StopSkippingPicker() { |
| 218 g_skip_picker = false; |
| 219 } |
| 220 |
| 186 void FileSystemPickerFunction::FileSelected(const FilePath& path, | 221 void FileSystemPickerFunction::FileSelected(const FilePath& path, |
| 187 bool for_save) { | 222 bool for_save) { |
| 188 if (for_save) { | 223 if (for_save) { |
| 189 content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE, | 224 content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE, |
| 190 base::Bind(&FileSystemPickerFunction::CheckWritableFile, this, path)); | 225 base::Bind(&FileSystemPickerFunction::CheckWritableFile, this, path)); |
| 191 return; | 226 return; |
| 192 } | 227 } |
| 193 | 228 |
| 194 // Don't need to check the file, it's for reading. | 229 // Don't need to check the file, it's for reading. |
| 195 RegisterFileSystemAndSendResponse(path, false); | 230 RegisterFileSystemAndSendResponse(path, false); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 file_system::ChooseFileOptions* options = params->options.get(); | 310 file_system::ChooseFileOptions* options = params->options.get(); |
| 276 if (options) { | 311 if (options) { |
| 277 if (options->type.get() && *options->type == kSaveFileOption) | 312 if (options->type.get() && *options->type == kSaveFileOption) |
| 278 for_save = true; | 313 for_save = true; |
| 279 } | 314 } |
| 280 | 315 |
| 281 return ShowPicker(FilePath(), for_save); | 316 return ShowPicker(FilePath(), for_save); |
| 282 } | 317 } |
| 283 | 318 |
| 284 } // namespace extensions | 319 } // namespace extensions |
| OLD | NEW |