Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(317)

Unified Diff: webkit/plugins/ppapi/ppb_file_chooser_impl.cc

Issue 10544089: Implement the file chooser as a new resource "host" (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698