Index: webkit/plugins/ppapi/ppb_file_chooser_impl.cc |
diff --git a/webkit/plugins/ppapi/ppb_file_chooser_impl.cc b/webkit/plugins/ppapi/ppb_file_chooser_impl.cc |
index a7238bbe32b698a984db314b07664f6ad860268e..66ba70d5bba68e39e66b0c885e192be74a481b4b 100644 |
--- a/webkit/plugins/ppapi/ppb_file_chooser_impl.cc |
+++ b/webkit/plugins/ppapi/ppb_file_chooser_impl.cc |
@@ -58,6 +58,13 @@ class FileChooserCompletionImpl : public WebFileChooserCompletion { |
file_chooser_->StoreChosenFiles(files); |
} |
+ virtual void didChooseFile(const WebVector<SelectedFileInfo>& file_names) { |
+ std::vector<std::string> files; |
+ for (size_t i = 0; i < file_names.size(); i++) |
+ files.push_back(file_names[i].path.utf8()); |
+ |
+ file_chooser_->StoreChosenFiles(files); |
+ } |
private: |
scoped_refptr<PPB_FileChooser_Impl> file_chooser_; |
@@ -101,8 +108,9 @@ PPB_FileChooser_API* PPB_FileChooser_Impl::AsPPB_FileChooser_API() { |
void PPB_FileChooser_Impl::StoreChosenFiles( |
const std::vector<std::string>& files) { |
- chosen_files_.clear(); |
next_chosen_file_index_ = 0; |
+ |
+ std::vector< scoped_refptr<Resource> > chosen_files; |
for (std::vector<std::string>::const_iterator it = files.begin(); |
it != files.end(); ++it) { |
#if defined(OS_WIN) |
@@ -111,11 +119,16 @@ void PPB_FileChooser_Impl::StoreChosenFiles( |
FilePath file_path(*it); |
#endif |
- chosen_files_.push_back(make_scoped_refptr( |
+ chosen_files.push_back(scoped_refptr<Resource>( |
PPB_FileRef_Impl::CreateExternal(pp_instance(), file_path))); |
} |
- RunCallback((chosen_files_.size() > 0) ? PP_OK : PP_ERROR_USERCANCEL); |
+ int32_t result_code = (chosen_files.size() > 0) ? PP_OK : PP_ERROR_USERCANCEL; |
+ if (output_.is_valid()) |
+ output_.StoreResourceVector(chosen_files); |
+ else // v0.5 API. |
+ chosen_files_.swap(chosen_files); |
+ RunCallback(result_code); |
} |
int32_t PPB_FileChooser_Impl::ValidateCallback( |
@@ -146,18 +159,38 @@ void PPB_FileChooser_Impl::RunCallback(int32_t result) { |
TrackedCallback::ClearAndRun(&callback_, result); |
} |
-int32_t PPB_FileChooser_Impl::Show(const PP_CompletionCallback& callback) { |
+int32_t PPB_FileChooser_Impl::Show(const PP_ArrayOutput& output, |
+ const PP_CompletionCallback& callback) { |
+ int32_t result = Show0_5(callback); |
+ if (result == PP_OK_COMPLETIONPENDING) |
+ output_.set_pp_array_output(output); |
+ return result; |
+} |
+ |
+int32_t PPB_FileChooser_Impl::ShowWithoutUserGesture( |
+ PP_Bool save_as, |
+ PP_Var suggested_file_name, |
+ const PP_ArrayOutput& output, |
+ const PP_CompletionCallback& callback) { |
+ int32_t result = ShowWithoutUserGesture0_5(save_as, suggested_file_name, |
+ callback); |
+ if (result == PP_OK_COMPLETIONPENDING) |
+ output_.set_pp_array_output(output); |
+ return result; |
+} |
+ |
+int32_t PPB_FileChooser_Impl::Show0_5(const PP_CompletionCallback& callback) { |
PluginInstance* plugin_instance = ResourceHelper::GetPluginInstance(this); |
if (!plugin_instance) |
return PP_ERROR_FAILED; |
if (!plugin_instance->IsProcessingUserGesture()) |
return PP_ERROR_NO_USER_GESTURE; |
- return ShowWithoutUserGesture(false, NULL, callback); |
+ return ShowWithoutUserGesture0_5(PP_FALSE, PP_MakeUndefined(), callback); |
} |
-int32_t PPB_FileChooser_Impl::ShowWithoutUserGesture( |
- bool save_as, |
- const char* suggested_file_name, |
+int32_t PPB_FileChooser_Impl::ShowWithoutUserGesture0_5( |
+ PP_Bool save_as, |
+ PP_Var suggested_file_name, |
const PP_CompletionCallback& callback) { |
int32_t rv = ValidateCallback(callback); |
if (rv != PP_OK) |
@@ -169,8 +202,9 @@ int32_t PPB_FileChooser_Impl::ShowWithoutUserGesture( |
WebFileChooserParams params; |
if (save_as) { |
params.saveAs = true; |
- if (suggested_file_name) |
- params.initialValue = WebString::fromUTF8(suggested_file_name); |
+ StringVar* str = StringVar::FromPPVar(suggested_file_name); |
+ if (str) |
+ params.initialValue = WebString::fromUTF8(str->value().c_str()); |
} else { |
params.multiSelect = (mode_ == PP_FILECHOOSERMODE_OPENMULTIPLE); |
} |