Add EFL filechooser implementation.
authorKarol Furmaniak <k.furmaniak@samsung.com>
Fri, 6 Jun 2014 19:53:54 +0000 (12:53 -0700)
committerYoungsoo Choi <kenshin.choi@samsung.com>
Tue, 10 Jul 2018 06:57:09 +0000 (06:57 +0000)
Patch fixes 3 manual tests from tct-fileapi-w3c-tests
and 1 manual test from tct-mediacapture-w3c-tests that
used to fail.

Issue: CBWEBCORE-27
Change-Id: I52f67bd4079252e3eee90721e721b6f30bc5a10b

Conflicts:

impl/eweb_view.h

tizen_src/impl/chromium-efl.gyp
tizen_src/impl/eweb_view.cc
tizen_src/impl/eweb_view.h
tizen_src/impl/eweb_view_callbacks.h
tizen_src/impl/file_chooser_controller_efl.cc [new file with mode: 0644]
tizen_src/impl/file_chooser_controller_efl.h [new file with mode: 0644]
tizen_src/impl/web_contents_delegate_efl.cc
tizen_src/impl/web_contents_delegate_efl.h

index b82d20a..f84a870 100755 (executable)
       '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',
index 6b348b1..5079f1c 100644 (file)
@@ -1542,3 +1542,12 @@ bool EWebView::GetTiltZoomEnabled() {
   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, &params));
+  file_chooser_->open();
+}
index 4926704..9b05c6a 100644 (file)
@@ -26,6 +26,7 @@
 #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"
@@ -44,6 +45,7 @@
 #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"
 
@@ -238,6 +240,8 @@ class EWebView
   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();
@@ -324,6 +328,7 @@ class 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_;
index c330ecc..72cf207 100644 (file)
@@ -197,7 +197,6 @@ DECLARE_EWK_VIEW_CALLBACK(DownloadJobCancelled, "download,cancelled", Ewk_Downlo
 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*);
@@ -214,6 +213,7 @@ DECLARE_EWK_VIEW_CALLBACK(WindowResizable, "window,resizable", bool*);
 
 // 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*);
diff --git a/tizen_src/impl/file_chooser_controller_efl.cc b/tizen_src/impl/file_chooser_controller_efl.cc
new file mode 100644 (file)
index 0000000..6f8e359
--- /dev/null
@@ -0,0 +1,126 @@
+#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
+
diff --git a/tizen_src/impl/file_chooser_controller_efl.h b/tizen_src/impl/file_chooser_controller_efl.h
new file mode 100644 (file)
index 0000000..51a64dd
--- /dev/null
@@ -0,0 +1,43 @@
+#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
+
index 51fe71f..4f52ab5 100644 (file)
@@ -422,4 +422,8 @@ bool WebContentsDelegateEfl::AddMessageToConsole(WebContents* source,
   return true;
 }
 
+void WebContentsDelegateEfl::RunFileChooser(WebContents* web_contents, const FileChooserParams& params) {
+  web_view_->ShowFileChooser(params);
+}
+
 } //namespace content
index f35a3fa..feedba2 100644 (file)
@@ -143,6 +143,7 @@ class WebContentsDelegateEfl
                                    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);