'eweb_view.cc',
'eweb_view.h',
'eweb_view_callbacks.h',
+ 'file_chooser_controller_efl.cc',
+ 'file_chooser_controller_efl.h',
'memory_purger.cc',
'memory_purger.h',
'message_pump_for_ui_efl.cc',
return false;
}
#endif // OS_TIZEN
+
+void EWebView::ShowFileChooser(const content::FileChooserParams& params) {
+ RenderViewHost* render_view_host = web_contents_delegate()->web_contents()->GetRenderViewHost();
+ if (!render_view_host)
+ return;
+
+ file_chooser_.reset(new content::FileChooserControllerEfl(render_view_host, ¶ms));
+ file_chooser_->open();
+}
#include "base/memory/scoped_ptr.h"
#include "base/synchronization/waitable_event.h"
#include "content/public/common/context_menu_params.h"
+#include "content/public/common/file_chooser_params.h"
#include "content/browser/renderer_host/event_with_latency_info.h"
#include "content/common/input/input_event_ack_state.h"
#include "base/id_map.h"
#include "web_contents_delegate_efl.h"
#include "ui/events/gestures/gesture_types.h"
#include "context_menu_controller_efl.h"
+#include "file_chooser_controller_efl.h"
#include "ui/gfx/point.h"
#include "ui/gfx/size.h"
void SetDrawsTransparentBackground(bool enabled);
void ProcessAckedTouchEvent(const content::TouchEventWithLatencyInfo& touch,
content::InputEventAckState ack_result);
+ void ShowFileChooser(const content::FileChooserParams&);
+
private:
EWebView(EWebContext*, Evas_Object* smart_object);
~EWebView();
scoped_ptr<_Ewk_Auth_Challenge> auth_challenge_;
scoped_ptr<Ewk_Policy_Decision> policy_decision_;
scoped_ptr<content::ContextMenuControllerEfl> context_menu_;
+ scoped_ptr<content::FileChooserControllerEfl> file_chooser_;
scoped_ptr<content::SelectionControllerEfl> selection_controller_;
base::string16 previous_text_;
int current_find_request_id_;
DECLARE_EWK_VIEW_CALLBACK(DownloadJobFailed, "download,failed", Ewk_Download_Job_Error*);
DECLARE_EWK_VIEW_CALLBACK(DownloadJobFinished, "download,finished", Ewk_Download_Job*);
DECLARE_EWK_VIEW_CALLBACK(DownloadJobRequested, "download,request", Ewk_Download_Job*);
-DECLARE_EWK_VIEW_CALLBACK(FileChooserRequest, "file,chooser,request", Ewk_File_Chooser_Request*);
DECLARE_EWK_VIEW_CALLBACK(NewFormSubmissionRequest, "form,submission,request", Ewk_Form_Submission_Request*);
DECLARE_EWK_VIEW_CALLBACK(FaviconChanged, "favicon,changed", void);
DECLARE_EWK_VIEW_CALLBACK(LoadError, "load,error", Ewk_Error*);
// Note: type 'void' means that no arguments are expected.
+DECLARE_EWK_VIEW_CALLBACK(FileChooserRequest, "file,chooser,request", Ewk_File_Chooser_Request*);
DECLARE_EWK_VIEW_CALLBACK(LoadFinished, "load,finished", void);
DECLARE_EWK_VIEW_CALLBACK(LoadStarted, "load,started", void);
DECLARE_EWK_VIEW_CALLBACK(LoadError, "load,error", _Ewk_Error*);
--- /dev/null
+#include "content/common/view_messages.h"
+#include "content/public/browser/render_view_host.h"
+#include "file_chooser_controller_efl.h"
+#include <Eina.h>
+#include <Elementary.h>
+
+#include "base/files/file_path.h"
+#include "ui/shell_dialogs/selected_file_info.h"
+#include "base/strings/utf_string_conversions.h"
+
+namespace content {
+
+static void _fs_done(void *data, Evas_Object *obj,void *event_info) {
+ const char *sel_path = (char *)event_info;
+
+ FileChooserControllerEfl *inst = (FileChooserControllerEfl*) data;
+
+ std::vector<ui::SelectedFileInfo> files;
+
+ RenderViewHost* render_view_host = inst->getRenderViewHost();
+ if (!render_view_host)
+ return;
+
+ if (sel_path) {
+ GURL url(sel_path);
+ if (!url.is_valid()) {
+ base::FilePath path(url.SchemeIsFile() ? url.path() : sel_path);
+ files.push_back(ui::SelectedFileInfo(path, base::FilePath()));
+ }
+ }
+
+ render_view_host->FilesSelectedInChooser(files, inst->getParams()->mode);
+ evas_object_del(elm_object_top_widget_get(obj));
+}
+
+RenderViewHost* FileChooserControllerEfl::getRenderViewHost() {
+ return render_view_host_;
+}
+
+void FileChooserControllerEfl::setRenderViewHost(RenderViewHost* render_view_host) {
+ render_view_host_ = render_view_host;
+}
+
+const content::FileChooserParams* FileChooserControllerEfl::getParams() {
+ return params_;
+}
+
+void FileChooserControllerEfl::setParams(const content::FileChooserParams* params) {
+ params_ = params;
+}
+
+void FileChooserControllerEfl::parseParams() {
+ title = DEF_TITLE_OPEN;
+ def_file_name = DEF_FILE_NAME;
+ is_save_file = EINA_FALSE;
+ folder_only = EINA_FALSE;
+
+ if (!params_)
+ return;
+
+ switch (params_->mode) {
+ case FileChooserParams::Open:
+ break;
+ case FileChooserParams::OpenMultiple:
+ // only since elementary 1.8
+ break;
+ case FileChooserParams::UploadFolder:
+ folder_only = EINA_TRUE;
+ break;
+ case FileChooserParams::Save:
+ title = DEF_TITLE_SAVE;
+ is_save_file = EINA_TRUE;
+ break;
+ default:
+ NOTREACHED();
+ }
+
+ if (!params_->title.empty())
+ title = base::UTF16ToUTF8(params_->title);
+
+ if (!params_->default_file_name.empty()) {
+ if (params_->default_file_name.EndsWithSeparator())
+ def_file_name = params_->default_file_name.value();
+ else
+ def_file_name = params_->default_file_name.DirName().value();
+ }
+}
+
+void FileChooserControllerEfl::open() {
+ Evas_Object *win, *fs, *bx;
+
+ win = elm_win_util_standard_add("fileselector", title.c_str());
+
+ elm_win_modal_set(win, EINA_TRUE);
+
+ bx = elm_box_add(win);
+ elm_win_resize_object_add(win, bx);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(bx);
+
+ fs = elm_fileselector_add(win);
+
+ elm_fileselector_is_save_set(fs, is_save_file);
+
+ elm_fileselector_folder_only_set(fs, folder_only);
+
+ elm_fileselector_expandable_set(fs, EINA_FALSE);
+
+ /* start the fileselector in proper dir */
+ elm_fileselector_path_set(fs, def_file_name.c_str());
+
+ evas_object_size_hint_weight_set(fs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fs, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(bx, fs);
+ evas_object_show(fs);
+
+ /* the 'done' cb is called when the user presses ok/cancel */
+ evas_object_smart_callback_add(fs, "done", _fs_done, this);
+
+ evas_object_resize(win, 400, 400);
+ evas_object_show(win);
+}
+
+} //namespace
+
--- /dev/null
+#ifndef file_chooser_controller_efl_h
+#define file_chooser_controller_efl_h
+
+#include <Evas.h>
+
+namespace content {
+
+class RenderViewHost;
+
+#define DEF_TITLE_OPEN "Open";
+#define DEF_TITLE_SAVE "Save";
+#define DEF_FILE_NAME "/tmp";
+
+class FileChooserControllerEfl {
+ public:
+ FileChooserControllerEfl() { parseParams(); }
+ FileChooserControllerEfl(RenderViewHost* render_view_host,
+ const content::FileChooserParams* params)
+ : render_view_host_(render_view_host), params_(params) {
+ parseParams();
+ }
+ ~FileChooserControllerEfl() { }
+
+ void open();
+ RenderViewHost* getRenderViewHost();
+ void setRenderViewHost(RenderViewHost* render_view_host);
+ const content::FileChooserParams* getParams();
+ void setParams(const content::FileChooserParams* params);
+
+ private:
+ void parseParams();
+ RenderViewHost* render_view_host_;
+ const content::FileChooserParams* params_;
+ std::string title;
+ std::string def_file_name;
+ Eina_Bool is_save_file;
+ Eina_Bool folder_only;
+};
+
+} // namespace
+
+#endif // file_chooser_controller_efl_h
+
return true;
}
+void WebContentsDelegateEfl::RunFileChooser(WebContents* web_contents, const FileChooserParams& params) {
+ web_view_->ShowFileChooser(params);
+}
+
} //namespace content
const base::string16& message,
int32 line_no,
const base::string16& source_id) OVERRIDE;
+ void RunFileChooser(WebContents* web_contents, const FileChooserParams& params);
private:
void OnGetContentSecurityPolicy(IPC::Message* reply_msg);