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 |
deleted file mode 100644 |
index 40ef147f94d5bc5ca7a4dac95c0ecef239db17f2..0000000000000000000000000000000000000000 |
--- a/webkit/plugins/ppapi/ppb_file_chooser_impl.cc |
+++ /dev/null |
@@ -1,288 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "webkit/plugins/ppapi/ppb_file_chooser_impl.h" |
- |
-#include <string> |
-#include <vector> |
- |
-#include "base/logging.h" |
-#include "base/string_split.h" |
-#include "base/string_util.h" |
-#include "base/sys_string_conversions.h" |
-#include "ppapi/c/pp_completion_callback.h" |
-#include "ppapi/c/pp_errors.h" |
-#include "ppapi/shared_impl/tracked_callback.h" |
-#include "ppapi/shared_impl/var.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebCString.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebFileChooserCompletion.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebFileChooserParams.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebVector.h" |
-#include "webkit/glue/webkit_glue.h" |
-#include "webkit/plugins/ppapi/common.h" |
-#include "webkit/plugins/ppapi/ppb_file_ref_impl.h" |
-#include "webkit/plugins/ppapi/plugin_delegate.h" |
-#include "webkit/plugins/ppapi/plugin_module.h" |
-#include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
-#include "webkit/plugins/ppapi/resource_helper.h" |
- |
-using ppapi::StringVar; |
-using ppapi::thunk::PPB_FileChooser_API; |
-using ppapi::TrackedCallback; |
-using WebKit::WebCString; |
-using WebKit::WebFileChooserCompletion; |
-using WebKit::WebFileChooserParams; |
-using WebKit::WebString; |
-using WebKit::WebVector; |
- |
-namespace webkit { |
-namespace ppapi { |
- |
-namespace { |
- |
-class FileChooserCompletionImpl : public WebFileChooserCompletion { |
- public: |
- FileChooserCompletionImpl(PPB_FileChooser_Impl* file_chooser) |
- : file_chooser_(file_chooser) { |
- DCHECK(file_chooser_); |
- } |
- |
- virtual ~FileChooserCompletionImpl() {} |
- |
- virtual void didChooseFile(const WebVector<WebString>& file_names) { |
- std::vector<PPB_FileChooser_Impl::ChosenFileInfo> files; |
- for (size_t i = 0; i < file_names.size(); i++) { |
- files.push_back( |
- PPB_FileChooser_Impl::ChosenFileInfo(file_names[i].utf8(), |
- std::string())); |
- } |
- |
- file_chooser_->StoreChosenFiles(files); |
- |
- // It is the responsibility of this method to delete the instance. |
- delete this; |
- } |
- virtual void didChooseFile(const WebVector<SelectedFileInfo>& file_names) { |
- std::vector<PPB_FileChooser_Impl::ChosenFileInfo> files; |
- for (size_t i = 0; i < file_names.size(); i++) { |
- files.push_back( |
- PPB_FileChooser_Impl::ChosenFileInfo( |
- file_names[i].path.utf8(), |
- file_names[i].displayName.utf8())); |
- } |
- |
- file_chooser_->StoreChosenFiles(files); |
- |
- // It is the responsibility of this method to delete the instance. |
- delete this; |
- } |
- |
- private: |
- scoped_refptr<PPB_FileChooser_Impl> file_chooser_; |
-}; |
- |
-} // namespace |
- |
-PPB_FileChooser_Impl::ChosenFileInfo::ChosenFileInfo( |
- const std::string& path, |
- const std::string& display_name) |
- : path(path), |
- display_name(display_name) { |
-} |
- |
-PPB_FileChooser_Impl::PPB_FileChooser_Impl( |
- PP_Instance instance, |
- PP_FileChooserMode_Dev mode, |
- const char* accept_types) |
- : Resource(::ppapi::OBJECT_IS_IMPL, instance), |
- mode_(mode), |
- next_chosen_file_index_(0) { |
- if (accept_types) |
- accept_types_ = std::string(accept_types); |
-} |
- |
-PPB_FileChooser_Impl::~PPB_FileChooser_Impl() { |
-} |
- |
-// static |
-PP_Resource PPB_FileChooser_Impl::Create( |
- PP_Instance instance, |
- PP_FileChooserMode_Dev mode, |
- const char* accept_types) { |
- if (mode != PP_FILECHOOSERMODE_OPEN && |
- mode != PP_FILECHOOSERMODE_OPENMULTIPLE) |
- return 0; |
- return (new PPB_FileChooser_Impl(instance, mode, |
- accept_types))->GetReference(); |
-} |
- |
-PPB_FileChooser_Impl* PPB_FileChooser_Impl::AsPPB_FileChooser_Impl() { |
- return this; |
-} |
- |
-PPB_FileChooser_API* PPB_FileChooser_Impl::AsPPB_FileChooser_API() { |
- return this; |
-} |
- |
-void PPB_FileChooser_Impl::StoreChosenFiles( |
- const std::vector<ChosenFileInfo>& files) { |
- next_chosen_file_index_ = 0; |
- |
- // It is possible that |callback_| has been run: before the user takes action |
- // on the file chooser, the page navigates away and causes the plugin module |
- // (whose instance requested to show the file chooser) to be destroyed. In |
- // that case, |callback_| has been aborted when we get here. |
- if (!TrackedCallback::IsPending(callback_)) { |
- // To be cautious, reset our internal state. |
- output_.Reset(); |
- chosen_files_.clear(); |
- return; |
- } |
- |
- std::vector< scoped_refptr<Resource> > chosen_files; |
- for (std::vector<ChosenFileInfo>::const_iterator it = files.begin(); |
- it != files.end(); ++it) { |
-#if defined(OS_WIN) |
- FilePath file_path(base::SysUTF8ToWide(it->path)); |
-#else |
- FilePath file_path(it->path); |
-#endif |
- |
- chosen_files.push_back(scoped_refptr<Resource>( |
- PPB_FileRef_Impl::CreateExternal(pp_instance(), |
- file_path, |
- it->display_name))); |
- } |
- |
- 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( |
- scoped_refptr<TrackedCallback> callback) { |
- if (TrackedCallback::IsPending(callback_)) |
- return PP_ERROR_INPROGRESS; |
- |
- return PP_OK; |
-} |
- |
-void PPB_FileChooser_Impl::RegisterCallback( |
- scoped_refptr<TrackedCallback> callback) { |
- DCHECK(!TrackedCallback::IsPending(callback_)); |
- |
- PluginModule* plugin_module = ResourceHelper::GetPluginModule(this); |
- if (!plugin_module) |
- return; |
- |
- callback_ = callback; |
-} |
- |
-void PPB_FileChooser_Impl::RunCallback(int32_t result) { |
- TrackedCallback::ClearAndRun(&callback_, result); |
-} |
- |
-int32_t PPB_FileChooser_Impl::Show(const PP_ArrayOutput& output, |
- scoped_refptr<TrackedCallback> 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, |
- scoped_refptr<TrackedCallback> 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(scoped_refptr<TrackedCallback> 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 ShowWithoutUserGesture0_5(PP_FALSE, PP_MakeUndefined(), callback); |
-} |
- |
-int32_t PPB_FileChooser_Impl::ShowWithoutUserGesture0_5( |
- PP_Bool save_as, |
- PP_Var suggested_file_name, |
- scoped_refptr<TrackedCallback> callback) { |
- int32_t rv = ValidateCallback(callback); |
- if (rv != PP_OK) |
- return rv; |
- |
- DCHECK((mode_ == PP_FILECHOOSERMODE_OPEN) || |
- (mode_ == PP_FILECHOOSERMODE_OPENMULTIPLE)); |
- |
- WebFileChooserParams params; |
- if (save_as) { |
- params.saveAs = true; |
- StringVar* str = StringVar::FromPPVar(suggested_file_name); |
- if (str) |
- params.initialValue = WebString::fromUTF8(str->value().c_str()); |
- } else { |
- params.multiSelect = (mode_ == PP_FILECHOOSERMODE_OPENMULTIPLE); |
- } |
- params.acceptTypes = ParseAcceptValue(accept_types_); |
- params.directory = false; |
- |
- PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(this); |
- if (!plugin_delegate) |
- return PP_ERROR_FAILED; |
- |
- if (!plugin_delegate->RunFileChooser(params, |
- new FileChooserCompletionImpl(this))) |
- return PP_ERROR_FAILED; |
- |
- RegisterCallback(callback); |
- return PP_OK_COMPLETIONPENDING; |
-} |
- |
-PP_Resource PPB_FileChooser_Impl::GetNextChosenFile() { |
- if (next_chosen_file_index_ >= chosen_files_.size()) |
- return 0; |
- |
- return chosen_files_[next_chosen_file_index_++]->GetReference(); |
-} |
- |
-std::vector<WebString> PPB_FileChooser_Impl::ParseAcceptValue( |
- const std::string& accept_types) { |
- if (accept_types.empty()) |
- return std::vector<WebString>(); |
- std::vector<std::string> type_list; |
- base::SplitString(accept_types, ',', &type_list); |
- std::vector<WebString> normalized_type_list; |
- normalized_type_list.reserve(type_list.size()); |
- for (size_t i = 0; i < type_list.size(); ++i) { |
- std::string type = type_list[i]; |
- TrimWhitespaceASCII(type, TRIM_ALL, &type); |
- |
- // If the type is a single character, it definitely cannot be valid. In the |
- // case of a file extension it would be a single ".". In the case of a MIME |
- // type it would just be a "/". |
- if (type.length() < 2) |
- continue; |
- if (type.find_first_of('/') == std::string::npos && type[0] != '.') |
- continue; |
- StringToLowerASCII(&type); |
- normalized_type_list.push_back(WebString::fromUTF8(type.data(), |
- type.size())); |
- } |
- return normalized_type_list; |
-} |
- |
-} // namespace ppapi |
-} // namespace webkit |