summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhirono <hirono@chromium.org>2014-10-20 18:46:17 -0700
committerCommit bot <commit-bot@chromium.org>2014-10-21 01:46:41 +0000
commit275bfbeecf2d34a54ff086c40660b7bd271a4147 (patch)
treee89731dcd1228b5c9007fe1487e6e2cd65e5b40e
parentd2d1b62f21b070f9fa14ea66a24feca79f4361c4 (diff)
downloadchromium_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.cc74
-rw-r--r--chrome/browser/file_select_helper.h6
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.