Index: content/renderer/pepper/pepper_file_chooser_host.cc |
diff --git a/content/renderer/pepper/pepper_file_chooser_host.cc b/content/renderer/pepper/pepper_file_chooser_host.cc |
index 1229d17f610af7a1f69a3ff1e061e54c15e1cf7a..1a58dfe680bb83693ecbe816987ad54df16aa979 100644 |
--- a/content/renderer/pepper/pepper_file_chooser_host.cc |
+++ b/content/renderer/pepper/pepper_file_chooser_host.cc |
@@ -7,13 +7,11 @@ |
#include "base/files/file_path.h" |
#include "base/strings/utf_string_conversions.h" |
#include "content/public/renderer/renderer_ppapi_host.h" |
-#include "content/renderer/pepper/ppb_file_ref_impl.h" |
#include "content/renderer/render_view_impl.h" |
#include "ppapi/c/pp_errors.h" |
#include "ppapi/host/dispatch_host_message.h" |
#include "ppapi/host/ppapi_host.h" |
#include "ppapi/proxy/ppapi_messages.h" |
-#include "ppapi/proxy/ppb_file_ref_proxy.h" |
#include "third_party/WebKit/public/platform/WebCString.h" |
#include "third_party/WebKit/public/platform/WebString.h" |
#include "third_party/WebKit/public/platform/WebVector.h" |
@@ -81,7 +79,8 @@ PepperFileChooserHost::PepperFileChooserHost( |
PP_Resource resource) |
: ResourceHost(host->GetPpapiHost(), instance, resource), |
renderer_ppapi_host_(host), |
- handler_(NULL) { |
+ handler_(NULL), |
+ weak_factory_(this) { |
} |
PepperFileChooserHost::~PepperFileChooserHost() { |
@@ -98,29 +97,30 @@ int32_t PepperFileChooserHost::OnResourceMessageReceived( |
void PepperFileChooserHost::StoreChosenFiles( |
const std::vector<ChosenFileInfo>& files) { |
- std::vector<ppapi::PPB_FileRef_CreateInfo> chosen_files; |
+ num_pending_file_resources_ = files.size(); |
for (size_t i = 0; i < files.size(); i++) { |
#if defined(OS_WIN) |
base::FilePath file_path(UTF8ToWide(files[i].path)); |
#else |
base::FilePath file_path(files[i].path); |
#endif |
- |
- PPB_FileRef_Impl* ref = PPB_FileRef_Impl::CreateExternal( |
- pp_instance(), file_path, files[i].display_name); |
- ppapi::PPB_FileRef_CreateInfo create_info; |
- ppapi::proxy::PPB_FileRef_Proxy::SerializeFileRef(ref->GetReference(), |
- &create_info); |
- chosen_files.push_back(create_info); |
+ renderer_ppapi_host_->CreateBrowserResourceHost( |
+ pp_instance(), |
+ PpapiHostMsg_FileRef_CreateExternal(file_path), |
+ base::Bind(&PepperFileChooserHost::DidCreateResourceHost, |
+ weak_factory_.GetWeakPtr(), |
+ file_path, |
+ files[i].display_name)); |
} |
- reply_context_.params.set_result( |
- (chosen_files.size() > 0) ? PP_OK : PP_ERROR_USERCANCEL); |
- host()->SendReply(reply_context_, |
- PpapiPluginMsg_FileChooser_ShowReply(chosen_files)); |
- |
- reply_context_ = ppapi::host::ReplyMessageContext(); |
- handler_ = NULL; // Handler deletes itself. |
+ if (files.size() == 0) { |
+ std::vector<ppapi::FileRefCreateInfo> chosen_files; |
+ reply_context_.params.set_result(PP_ERROR_USERCANCEL); |
+ host()->SendReply(reply_context_, |
+ PpapiPluginMsg_FileChooser_ShowReply(chosen_files)); |
+ reply_context_ = ppapi::host::ReplyMessageContext(); |
+ handler_ = NULL; // Handler deletes itself. |
+ } |
} |
int32_t PepperFileChooserHost::OnShow( |
@@ -167,5 +167,22 @@ int32_t PepperFileChooserHost::OnShow( |
return PP_OK_COMPLETIONPENDING; |
} |
+void PepperFileChooserHost::DidCreateResourceHost( |
+ const base::FilePath& file_path, |
+ const std::string& display_name, |
+ int32_t id) { |
+ num_pending_file_resources_--; |
+ ppapi::FileRefCreateInfo info = ppapi::MakeExternalFileRefCreateInfo( |
+ file_path, display_name, id); |
+ chosen_files_.push_back(info); |
+ if (num_pending_file_resources_ == 0) { |
+ reply_context_.params.set_result(PP_OK); |
+ host()->SendReply(reply_context_, |
+ PpapiPluginMsg_FileChooser_ShowReply(chosen_files_)); |
+ reply_context_ = ppapi::host::ReplyMessageContext(); |
+ handler_ = NULL; // Handler deletes itself. |
+ } |
+} |
+ |
} // namespace content |