diff options
author | hirono <hirono@chromium.org> | 2014-10-20 18:46:17 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-21 01:46:41 +0000 |
commit | 275bfbeecf2d34a54ff086c40660b7bd271a4147 (patch) | |
tree | e89731dcd1228b5c9007fe1487e6e2cd65e5b40e | |
parent | d2d1b62f21b070f9fa14ea66a24feca79f4361c4 (diff) | |
download | chromium_src-275bfbeecf2d34a54ff086c40660b7bd271a4147.zip chromium_src-275bfbeecf2d34a54ff086c40660b7bd271a4147.tar.gz chromium_src-275bfbeecf2d34a54ff086c40660b7bd271a4147.tar.bz2 |
Add non-native file handling in FileSelectorHelper class.
In chrome OS, the file chooser dialog box may return paths that does not point to a native file. The CL lets FileSelectorHelper handle for the non-native paths and generate FileChooserFileInfo that refers non-native files.
BUG=126902
TEST=manually test to upload drive/local files
Review URL: https://codereview.chromium.org/663473002
Cr-Commit-Position: refs/heads/master@{#300399}
-rw-r--r-- | chrome/browser/file_select_helper.cc | 74 | ||||
-rw-r--r-- | chrome/browser/file_select_helper.h | 6 |
2 files changed, 59 insertions, 21 deletions
diff --git a/chrome/browser/file_select_helper.cc b/chrome/browser/file_select_helper.cc index 4675d64..ddb0811 100644 --- a/chrome/browser/file_select_helper.cc +++ b/chrome/browser/file_select_helper.cc @@ -32,6 +32,11 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/shell_dialogs/selected_file_info.h" +#if defined(OS_CHROMEOS) +#include "chrome/browser/chromeos/file_manager/fileapi_util.h" +#include "content/public/browser/site_instance.h" +#endif + using content::BrowserThread; using content::FileChooserParams; using content::RenderViewHost; @@ -45,20 +50,6 @@ namespace { // the renderer must start at 0 and increase. const int kFileSelectEnumerationId = -1; -void NotifyRenderViewHost( - RenderViewHost* render_view_host, - const std::vector<ui::SelectedFileInfo>& files, - FileChooserParams::Mode dialog_mode) { - std::vector<content::FileChooserFileInfo> chooser_files; - for (size_t i = 0; i < files.size(); ++i) { - content::FileChooserFileInfo chooser_file; - chooser_file.file_path = files[i].local_path; - chooser_file.display_name = files[i].display_name; - chooser_files.push_back(chooser_file); - } - render_view_host->FilesSelectedInChooser(chooser_files, dialog_mode); -} - // Converts a list of FilePaths to a list of ui::SelectedFileInfo. std::vector<ui::SelectedFileInfo> FilePathListToSelectedFileInfoList( const std::vector<base::FilePath>& paths) { @@ -233,22 +224,63 @@ void FileSelectHelper::OnListDone(int id, int error) { std::vector<ui::SelectedFileInfo> selected_files = FilePathListToSelectedFileInfoList(entry->results_); - if (id == kFileSelectEnumerationId) - NotifyRenderViewHost(entry->rvh_, selected_files, dialog_mode_); - else + if (id == kFileSelectEnumerationId) { + NotifyRenderViewHostAndEnd(selected_files); + } else { entry->rvh_->DirectoryEnumerationFinished(id, entry->results_); - - EnumerateDirectoryEnd(); + EnumerateDirectoryEnd(); + } } void FileSelectHelper::NotifyRenderViewHostAndEnd( const std::vector<ui::SelectedFileInfo>& files) { - if (render_view_host_) - NotifyRenderViewHost(render_view_host_, files, dialog_mode_); + if (!render_view_host_) { + RunFileChooserEnd(); + return; + } + +#if defined(OS_CHROMEOS) + if (!files.empty()) { + // Converts |files| into FileChooserFileInfo with handling of non-native + // files. + file_manager::util::ConvertSelectedFileInfoListToFileChooserFileInfoList( + file_manager::util::GetFileSystemContextForRenderViewHost( + profile_, render_view_host_), + web_contents_->GetSiteInstance()->GetSiteURL(), + files, + base::Bind( + &FileSelectHelper::ProcessSelectedFilesChromeOSAfterConversion, + this)); + return; + } +#endif // defined(OS_CHROMEOS) + + std::vector<content::FileChooserFileInfo> chooser_files; + for (const auto& file : files) { + content::FileChooserFileInfo chooser_file; + chooser_file.file_path = file.local_path; + chooser_file.display_name = file.display_name; + chooser_files.push_back(chooser_file); + } + render_view_host_->FilesSelectedInChooser(chooser_files, dialog_mode_); + + // No members should be accessed from here on. + RunFileChooserEnd(); +} + +#if defined(OS_CHROMEOS) +void FileSelectHelper::ProcessSelectedFilesChromeOSAfterConversion( + scoped_ptr<std::vector<content::FileChooserFileInfo>> list) { + if (render_view_host_) { + render_view_host_->FilesSelectedInChooser( + list ? *list : std::vector<content::FileChooserFileInfo>(), + dialog_mode_); + } // No members should be accessed from here on. RunFileChooserEnd(); } +#endif // defined(OS_CHROMEOS) void FileSelectHelper::DeleteTemporaryFiles() { BrowserThread::PostTask(BrowserThread::FILE, diff --git a/chrome/browser/file_select_helper.h b/chrome/browser/file_select_helper.h index f71a92f..961878a 100644 --- a/chrome/browser/file_select_helper.h +++ b/chrome/browser/file_select_helper.h @@ -19,6 +19,7 @@ class Profile; namespace content { +struct FileChooserFileInfo; class RenderViewHost; class WebContents; } @@ -144,6 +145,11 @@ class FileSelectHelper // file chooser. void NotifyRenderViewHostAndEnd( const std::vector<ui::SelectedFileInfo>& files); +#if defined(OS_CHROMEOS) + // Sends the result to the render process, and call |RunFileChooserEnd|. + void ProcessSelectedFilesChromeOSAfterConversion( + scoped_ptr<std::vector<content::FileChooserFileInfo>> list); +#endif // defined(OS_CHROMEOS) // Schedules the deletion of the files in |temporary_files_| and clears the // vector. |