[M120 Migration][VD] Support custom context menu 12/309312/3
authorjiangyuwei <yuwei.jiang@samsung.com>
Mon, 8 Apr 2024 10:42:45 +0000 (18:42 +0800)
committerBot Blink <blinkbot@samsung.com>
Wed, 10 Apr 2024 06:54:05 +0000 (06:54 +0000)
When a user long click on the link in webpage, context menu should popup.

Reference :
  - https://review.tizen.org/gerrit/#/c/291848/

Change-Id: Id307f33fdcc3bbda45c2c0feec1bdff3adcde14c
Signed-off-by: jiangyuwei <yuwei.jiang@samsung.com>
13 files changed:
tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_common_helper_efl.cc
tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_common_helper_efl.h
tizen_src/chromium_impl/ui/ozone/platform/efl/efl_event_handler.cc
tizen_src/chromium_impl/ui/ozone/platform/efl/efl_event_handler.h
tizen_src/ewk/efl_integration/context_menu_controller_efl.cc
tizen_src/ewk/efl_integration/context_menu_controller_efl.h
tizen_src/ewk/efl_integration/eweb_view.cc
tizen_src/ewk/efl_integration/eweb_view.h
tizen_src/ewk/efl_integration/eweb_view_callbacks.h
tizen_src/ewk/efl_integration/popup_controller_efl.cc
tizen_src/ewk/efl_integration/private/ewk_context_menu_item_private.h
tizen_src/ewk/efl_integration/private/ewk_context_menu_private.h
tizen_src/ewk/efl_integration/public/ewk_context_menu.cc

index e9192bc..b314e4f 100644 (file)
@@ -532,6 +532,32 @@ void RWHVAuraCommonHelperEfl::SetMouseEventsEnabled(bool enable) {
   if (auto* event_handler = GetEventHandler())
     event_handler->SetMouseEventsEnabled(enable);
 }
+
+void RWHVAuraCommonHelperEfl::SetMouseEventCallbacks(
+    const base::RepeatingCallback<void(int, int)>& on_mouse_down,
+    const base::RepeatingCallback<bool(void)>& on_mouse_up,
+    const base::RepeatingCallback<void(void)>& on_mouse_move) {
+  if (auto* event_handler = GetEventHandler())
+    event_handler->SetMouseEventCallbacks(on_mouse_down, on_mouse_up,
+                                          on_mouse_move);
+}
+
+void RWHVAuraCommonHelperEfl::MouseDownCallback(int x, int y) {
+  if (!on_mouse_down_callback_.is_null())
+    on_mouse_down_callback_.Run(x, y);
+}
+
+bool RWHVAuraCommonHelperEfl::MouseUpCallback() {
+  if (!on_mouse_up_callback_.is_null())
+    return on_mouse_up_callback_.Run();
+
+  return false;
+}
+
+void RWHVAuraCommonHelperEfl::MouseMoveCallback() {
+  if (!on_mouse_move_callback_.is_null())
+    on_mouse_move_callback_.Run();
+}
 #endif
 
 void RWHVAuraCommonHelperEfl::OnGetMainFrameScrollbarVisible(
index 1c1ad6b..c0cf7ae 100644 (file)
@@ -154,6 +154,13 @@ class CONTENT_EXPORT RWHVAuraCommonHelperEfl {
   // notify web browser video playing status
   void RequestVideoPlaying(int callback_id);
   void VideoPlayingStatusReceived(bool is_playing, int callback_id);
+  void SetMouseEventCallbacks(
+      const base::RepeatingCallback<void(int, int)>& on_mouse_down,
+      const base::RepeatingCallback<bool(void)>& on_mouse_up,
+      const base::RepeatingCallback<void(void)>& on_mouse_move);
+  void MouseDownCallback(int x, int y);
+  bool MouseUpCallback();
+  void MouseMoveCallback();
 #endif
 
   void CompositingCompleteSwapWithNewSize(const gfx::Size& size) {
@@ -215,6 +222,9 @@ class CONTENT_EXPORT RWHVAuraCommonHelperEfl {
   // When WebBrowser sets their own cursor, set the flag
   // not to set the WebPage cursor
   bool cursor_set_by_client_ = false;
+  base::RepeatingCallback<void(int, int)> on_mouse_down_callback_;
+  base::RepeatingCallback<bool(void)> on_mouse_up_callback_;
+  base::RepeatingCallback<void(void)> on_mouse_move_callback_;
 #endif
 
   std::unique_ptr<RenderWidgetHostHelper> rwh_helper_;
index 862e74a..bb873d8 100644 (file)
@@ -77,6 +77,15 @@ bool IsRCDevice(Evas_Device_Class device_id, const std::string device_name) {
 
 enum { kLeftButton = 1, kMiddleButton = 2, kRightButton = 3 };
 
+#if BUILDFLAG(IS_TIZEN_TV)
+static void TranslateEvasCoordToWebKitCoord(Evas_Object* web_view,
+                                            gfx::PointF* point) {
+  Evas_Coord tmpX, tmpY;
+  evas_object_geometry_get(web_view, &tmpX, &tmpY, 0, 0);
+  point->Offset(-tmpX, -tmpY);
+}
+#endif
+
 EventFlags EvasToUIMouseButton(int button) {
   if (button == kLeftButton)
     return EF_LEFT_MOUSE_BUTTON;
@@ -513,6 +522,14 @@ void EflEventHandler::OnMouseDown(void* data,
     MouseEvent event =
         MakeWebMouseEvent(ET_MOUSE_PRESSED, ev, thiz->GetTopControlsHeight());
     EflPlatformEventSource::GetInstance()->DispatchEflEvent(&event);
+#if BUILDFLAG(IS_TIZEN_TV)
+    if (!thiz->on_mouse_down_callback_.is_null()) {
+      const float sf = GetDeviceScaleFactor();
+      gfx::PointF location(ev->canvas.x / sf, ev->canvas.y / sf);
+      TranslateEvasCoordToWebKitCoord(obj, &location);
+      thiz->on_mouse_down_callback_.Run(location.x(), location.y());
+    }
+#endif
   }
 }
 
@@ -531,6 +548,11 @@ void EflEventHandler::OnMouseUp(void* data,
     MouseEvent event =
         MakeWebMouseEvent(ET_MOUSE_RELEASED, ev, thiz->GetTopControlsHeight());
     EflPlatformEventSource::GetInstance()->DispatchEflEvent(&event);
+#if BUILDFLAG(IS_TIZEN_TV)
+    if (!thiz->on_mouse_up_callback_.is_null() &&
+        thiz->on_mouse_up_callback_.Run())
+      return;
+#endif
   }
 }
 
@@ -557,6 +579,10 @@ void EflEventHandler::OnMouseMove(void* data,
         gfx::Vector2dF((ev->cur.canvas.x / sf - ev->prev.canvas.x / sf),
                        (ev->cur.canvas.y / sf - ev->prev.canvas.y / sf)));
     EflPlatformEventSource::GetInstance()->DispatchEflEvent(&event);
+#if BUILDFLAG(IS_TIZEN_TV)
+    if (!thiz->on_mouse_move_callback_.is_null())
+      thiz->on_mouse_move_callback_.Run();
+#endif
   }
 }
 
@@ -860,6 +886,15 @@ void EflEventHandler::SetKeyEventChecker(
     const base::RepeatingCallback<bool(void*, bool)>& checker) {
   key_event_checker_ = checker;
 }
+
+void EflEventHandler::SetMouseEventCallbacks(
+    const base::RepeatingCallback<void(int, int)>& on_mouse_down,
+    const base::RepeatingCallback<bool(void)>& on_mouse_up,
+    const base::RepeatingCallback<void(void)>& on_mouse_move) {
+  on_mouse_down_callback_ = on_mouse_down;
+  on_mouse_up_callback_ = on_mouse_up;
+  on_mouse_move_callback_ = on_mouse_move;
+}
 #endif
 
 void EflEventHandler::OnMultiTouchDownEvent(void* data,
index 7bda5e8..af5a56e 100644 (file)
@@ -42,6 +42,13 @@ class EflEventHandler {
   EflEventHandler(const EflEventHandler&) = delete;
   EflEventHandler& operator=(const EflEventHandler&) = delete;
 
+#if BUILDFLAG(IS_TIZEN_TV)
+  void SetMouseEventCallbacks(
+      const base::RepeatingCallback<void(int, int)>& on_mouse_down,
+      const base::RepeatingCallback<bool(void)>& on_mouse_up,
+      const base::RepeatingCallback<void(void)>& on_mouse_move);
+#endif
+
   void SetMouseEventsEnabled(bool enabled);
   bool MouseEventsEnabled() const { return mouse_events_enabled_; }
   void SetTouchEventsEnabled(bool enabled);
@@ -120,6 +127,9 @@ class EflEventHandler {
 
 #if BUILDFLAG(IS_TIZEN_TV)
   base::RepeatingCallback<bool(void*, bool)> key_event_checker_;
+  base::RepeatingCallback<void(int, int)> on_mouse_down_callback_;
+  base::RepeatingCallback<bool(void)> on_mouse_up_callback_;
+  base::RepeatingCallback<void(void)> on_mouse_move_callback_;
 #endif
 };
 
index 8519b73..a58e573 100644 (file)
@@ -44,6 +44,7 @@ ContextMenuControllerEfl::ContextMenuControllerEfl(EWebView* wv,
                                                    WebContents& web_contents)
     : ContextMenuControllerBase(web_contents),
       webview_(wv),
+      menu_items_parent_(nullptr),
       weak_ptr_factory_(this) {}
 
 ContextMenuControllerEfl::~ContextMenuControllerEfl() {
@@ -76,16 +77,32 @@ bool ContextMenuControllerEfl::PopulateAndShowContextMenu(const ContextMenuParam
     return false;
 
   params_ = params;
+
+#if BUILDFLAG(IS_TIZEN_TV)
+  if (params_.link_url.is_empty()) {
+    LOG(INFO) << "link url is empty";
+    return false;
+  }
+#endif
   is_text_selection_ =
       params_.is_editable ||
       (params_.link_url.is_empty() && params_.src_url.is_empty() &&
        params_.media_type == ContextMenuDataMediaType::kNone);
+  menu_items_parent_.reset(new _Ewk_Context_Menu(this));
+#if BUILDFLAG(IS_TIZEN_TV)
+  menu_items_parent_.get()->SetPosition(params_.x, params_.y);
+#endif
 
   GetProposedContextMenu();
-  menu_items_parent_.reset(new _Ewk_Context_Menu(menu_items_));
+#if BUILDFLAG(IS_TIZEN_TV)
+  LOG(INFO) << "Context Menu Show";
+  webview_->SmartCallback<EWebViewCallbacks::ContextMenuShow>().call(
+      menu_items_parent_.get());
+  return true;
+#endif
+  LOG(INFO) << "Context Menu Customize";
   webview_->SmartCallback<EWebViewCallbacks::ContextMenuCustomize>().call(
       menu_items_parent_.get());
-  menu_items_ = menu_items_parent_->TakeMenuList();
 
   if (!CreateContextMenu(params))
     return false;
@@ -113,17 +130,21 @@ void ContextMenuControllerEfl::AddItemToProposedList(Ewk_Context_Menu_Item_Type
 void ContextMenuControllerEfl::GetProposedContextMenu() {
   if (!params_.link_url.is_empty()) {
     AddItemToProposedList(EWK_CONTEXT_MENU_ITEM_TYPE_ACTION,
-        EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK,
-        dgettext("WebKit",
-            "IDS_WEBVIEW_OPT_OPEN_LINK_IN_CURRENT_TAB_ABB"),
-        params_.link_url.spec(),
-        params_.link_url.spec());
-    AddItemToProposedList(EWK_CONTEXT_MENU_ITEM_TYPE_ACTION,
+                          EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK,
+                          dgettext("WebKit",
+#if BUILDFLAG(IS_TIZEN_TV)
+                                   "IDS_WEBVIEW_OPEN"),
+#else
+                                   "IDS_WEBVIEW_OPT_OPEN_LINK_IN_CURRENT_TAB_"
+                                   "ABB"),
+#endif
+                          params_.link_url.spec(), params_.link_url.spec());
+    AddItemToProposedList(
+        EWK_CONTEXT_MENU_ITEM_TYPE_ACTION,
         EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK_IN_NEW_WINDOW,
-        std::string(dgettext("WebKit",
-            "IDS_WEBVIEW_OPT_OPEN_LINK_IN_NEW_TAB_ABB")),
-        params_.link_url.spec(),
-        params_.link_url.spec());
+        std::string(
+            dgettext("WebKit", "IDS_TPLATFORM_OPT_OPEN_LINK_IN_NEW_TAB_ABB")),
+        params_.link_url.spec(), params_.link_url.spec());
     AddItemToProposedList(EWK_CONTEXT_MENU_ITEM_TYPE_ACTION,
         EWK_CONTEXT_MENU_ITEM_TAG_COPY_LINK_DATA,
         std::string(dgettext("WebKit",
@@ -169,13 +190,12 @@ void ContextMenuControllerEfl::GetProposedContextMenu() {
   }
 
   if (params_.has_image_contents && !params_.src_url.is_empty()) {
-    AddItemToProposedList(EWK_CONTEXT_MENU_ITEM_TYPE_ACTION,
+    AddItemToProposedList(
+        EWK_CONTEXT_MENU_ITEM_TYPE_ACTION,
         EWK_CONTEXT_MENU_ITEM_TAG_OPEN_IMAGE_IN_CURRENT_WINDOW,
-        std::string(dgettext(
-            "WebKit",
-            "IDS_WEBVIEW_OPT_OPEN_IMAGE_IN_CURRENT_TAB_ABB")),
-        params_.src_url.spec(),
-        params_.src_url.spec());
+        std::string(
+            dgettext("WebKit", "IDS_WEBVIEW_OPT_OPEN_IMAGE_IN_CURRENT_TAB")),
+        params_.src_url.spec(), params_.src_url.spec());
     AddItemToProposedList(EWK_CONTEXT_MENU_ITEM_TYPE_ACTION,
         EWK_CONTEXT_MENU_ITEM_TAG_OPEN_IMAGE_IN_NEW_WINDOW,
         std::string(dgettext("WebKit",
@@ -294,8 +314,7 @@ void ContextMenuControllerEfl::OnDiskDownload(
   if (!item) {
     save_fail_dialog_.reset(JavaScriptModalDialogEfl::CreateDialogAndShow(
         &web_contents_, JavaScriptModalDialogEfl::ALERT,
-        base::UTF8ToUTF16(
-            std::string(dgettext("WebKit", "IDS_WEBVIEW_POP_FAIL"))),
+        base::UTF8ToUTF16(std::string(dgettext("WebKit", "IDS_BR_POP_FAIL"))),
         std::u16string(), base::BindOnce(&EmptyDialogClosedCallback)));
     return;
   }
@@ -318,7 +337,7 @@ void ContextMenuControllerEfl::OnDownloadUpdated(
       file_saved_dialog_.reset(JavaScriptModalDialogEfl::CreateDialogAndShow(
           &web_contents_, JavaScriptModalDialogEfl::ALERT,
           base::UTF8ToUTF16(
-              std::string(dgettext("WebKit", "IDS_WEBVIEW_POP_SAVED"))),
+              std::string(dgettext("WebKit", "IDS_BR_POP_SAVED"))),
           std::u16string(), base::BindOnce(&EmptyDialogClosedCallback)));
       download->RemoveObserver(this);
       disk_download_items_.erase(download);
@@ -653,4 +672,13 @@ void ContextMenuControllerEfl::Resize(const gfx::Rect& webview_rect) {
 
   ContextMenuControllerBase::Resize(webview_rect);
 }
+
+void ContextMenuControllerEfl::AppendItem(const _Ewk_Context_Menu_Item* item) {
+  menu_items_ = eina_list_append(menu_items_, item);
+}
+
+void ContextMenuControllerEfl::RemoveItem(const _Ewk_Context_Menu_Item* item) {
+  menu_items_ = eina_list_remove(menu_items_, item);
+  delete item;
+}
 }
index a9115cb..cd9af34 100644 (file)
@@ -32,6 +32,9 @@ class ContextMenuControllerEfl : public ContextMenuControllerBase,
   void MenuItemSelected(ContextMenuItemEfl* menu_item) override;
   gfx::Point GetContextMenuShowPos() const { return context_menu_show_pos_; };
   void Resize(const gfx::Rect& webview_rect) override;
+  Eina_List* GetMenuItems() const { return menu_items_; }
+  void AppendItem(const _Ewk_Context_Menu_Item* item);
+  void RemoveItem(const _Ewk_Context_Menu_Item* item);
 
  private:
   // ContextMenuControllerBase
index ce6088c..20fa95d 100644 (file)
@@ -136,6 +136,9 @@ const base::FilePath::CharType kDefaultFileName[] =
     FILE_PATH_LITERAL("saved_page");
 const char kReplaceChars[] = " ";
 const char kReplaceWith[] = "_";
+#if BUILDFLAG(IS_TIZEN_TV)
+static const int kMousePressAndHoldTimeout = 500;  // long press: 500ms
+#endif
 
 static const char* kRendererCrashedHTMLMessage =
     "<html><body><h1>Renderer process has crashed!</h1></body></html>";
@@ -368,6 +371,7 @@ EWebView::EWebView(Ewk_Context* context, Evas_Object* ewk_view)
       is_processing_edge_scroll_(false),
       use_early_rwi_(false),
       rwi_info_showed_(false),
+      context_menu_show_(false),
 #endif
 #if defined(TIZEN_PEPPER_EXTENSIONS)
       render_frame_id_{0, 0},
@@ -1934,6 +1938,14 @@ void EWebView::RenderViewReady() {
         host->AddFilter(new WebViewBrowserMessageFilter(content));
     }
   }
+#if BUILDFLAG(IS_TIZEN_TV)
+  if (rwhva() && IsWebBrowser()) {
+    rwhva()->aura_efl_helper()->SetMouseEventCallbacks(
+        base::BindRepeating(&EWebView::OnMouseDown, base::Unretained(this)),
+        base::BindRepeating(&EWebView::OnMouseUp, base::Unretained(this)),
+        base::BindRepeating(&EWebView::OnMouseMove, base::Unretained(this)));
+  }
+#endif
 }
 
 void EWebView::SetQuotaPermissionRequestCallback(
@@ -2902,6 +2914,43 @@ void EWebView::InitInspectorServer() {
     }
   }
 }
+
+void EWebView::OnMouseLongPressed(int x, int y) {
+  RenderViewHost* render_view_host = web_contents_->GetRenderViewHost();
+  if (!render_view_host)
+    return;
+
+  LOG(INFO) << __FUNCTION__;
+  RenderWidgetHostImpl* render_wiget_host_impl =
+      static_cast<RenderViewHostImpl*>(render_view_host)->GetWidget();
+  if (!render_wiget_host_impl)
+    return;
+
+  render_wiget_host_impl->ShowContextMenuAtPoint(
+      gfx::Point(x, y), ui::MenuSourceType::MENU_SOURCE_MOUSE);
+  context_menu_show_ = true;
+}
+
+void EWebView::OnMouseDown(int x, int y) {
+  mouse_long_press_timer_.Start(
+      FROM_HERE, base::Milliseconds(kMousePressAndHoldTimeout),
+      base::BindRepeating(&EWebView::OnMouseLongPressed, base::Unretained(this),
+                          x, y));
+}
+
+bool EWebView::OnMouseUp() {
+  LOG(INFO) << __FUNCTION__;
+  mouse_long_press_timer_.Stop();
+  if (context_menu_show_) {
+    context_menu_show_ = false;
+    return true;
+  }
+  return false;
+}
+
+void EWebView::OnMouseMove() {
+  mouse_long_press_timer_.Stop();
+}
 #endif
 
 #if defined(TIZEN_TBM_SUPPORT)
index fbd8004..0d50a4d 100644 (file)
@@ -837,6 +837,10 @@ class EWebView {
   void SetTranslatedURL(const char* url);
   void NotifyParentalRatingInfo(const char* info, const char* url);
   void SetParentalRatingResult(const char* info, bool is_pass);
+  void OnMouseLongPressed(int x, int y);
+  void OnMouseDown(int x, int y);
+  bool OnMouseUp();
+  void OnMouseMove();
 #endif  // IS_TIZEN_TV
 
   void SetDidChangeThemeColorCallback(
@@ -1037,7 +1041,8 @@ class EWebView {
   bool rwi_info_showed_;
   GURL rwi_gurl_;
   bool is_high_bitrate_ = false;
-
+  bool context_menu_show_;
+  base::OneShotTimer mouse_long_press_timer_;
   base::OnceClosure pending_setfocus_closure_;
 
   enum PlaybackState {
index 06ed6a5..6830c60 100644 (file)
@@ -121,6 +121,8 @@ enum CallbackType {
   EdgeScrollLeft,
   EdgeScrollRight,
   EdgeScrollTop,
+  ContextMenuShow,
+  ContextMenuHide,
   DeviceConnectionChanged,
   PlaybackLoad,
   PlaybackVideoReady,
@@ -310,6 +312,12 @@ DECLARE_EWK_VIEW_CALLBACK(EdgeScrollTop, "edge,scroll,top", bool*);
 DECLARE_EWK_VIEW_CALLBACK(DeviceConnectionChanged,
                           "device,connection,changed",
                           int*);
+DECLARE_EWK_VIEW_CALLBACK(ContextMenuShow,
+                          "contextmenu,show",
+                          _Ewk_Context_Menu*);
+DECLARE_EWK_VIEW_CALLBACK(ContextMenuHide,
+                          "contextmenu,hide",
+                          _Ewk_Context_Menu*);
 DECLARE_EWK_VIEW_CALLBACK(PlaybackLoad, "notification,playback,load", void*);
 DECLARE_EWK_VIEW_CALLBACK(PlaybackVideoReady,
                           "notification,playback,videoready",
index 6f12082..1b8dd83 100644 (file)
@@ -152,13 +152,13 @@ char* PopupControllerEfl::contextMenuGenlistTextSet(
 
   char* label = NULL;
   if (options_[index] == CALL)
-    label = strdup(dgettext("WebKit","IDS_WEBVIEW_OPT_CALL"));
+    label = strdup(dgettext("WebKit", "IDS_BR_OPT_CALL"));
   else if (options_[index] == SEND_EMAIL)
-    label = strdup(dgettext("WebKit","IDS_WEBVIEW_OPT_SEND_EMAIL"));
+    label = strdup(dgettext("WebKit", "IDS_BR_OPT_SEND_EMAIL"));
   else if (options_[index] == SEND_MESSAGE)
-    label = strdup(dgettext("WebKit","IDS_WEBVIEW_OPT_SEND_MESSAGE"));
+    label = strdup(dgettext("WebKit", "IDS_COM_BODY_OPT_SEND_MESSAGE"));
   else if (options_[index] == ADD_CONTACT)
-    label = strdup(dgettext("WebKit","IDS_WEBVIEW_BODY_ADD_TO_CONTACT"));
+    label = strdup(dgettext("WebKit", "IDS_BR_BODY_ADD_TO_CONTACT"));
   else if (options_[index] == COPY)
     label = strdup(dgettext("WebKit","IDS_WEBVIEW_OPT_COPY"));
 
index b12fc72..8c3df5a 100644 (file)
@@ -20,9 +20,6 @@ class _Ewk_Context_Menu_Item {
     menu_item_ = nullptr;
   }
 
-  _Ewk_Context_Menu_Item(const _Ewk_Context_Menu_Item&) = delete;
-  _Ewk_Context_Menu_Item& operator=(const _Ewk_Context_Menu_Item&) = delete;
-
   content::ContextMenuItemEfl* GetMenuItem() const { return menu_item_; }
 
   _Ewk_Context_Menu* ParentMenu() const { return parent_menu_; }
index 216b29d..55aebcc 100644 (file)
 #include "context_menu_controller_efl.h"
 #include "ewk_context_menu_item_private.h"
 
+#if BUILDFLAG(IS_TIZEN_TV)
+#include "ui/display/screen.h"
+#endif
+
 // Wrapper for context_menu_controller items
 class _Ewk_Context_Menu {
  public:
-  _Ewk_Context_Menu(Eina_List* menu_list)
-      : menu_list_(menu_list) {
+  _Ewk_Context_Menu(content::ContextMenuControllerEfl* controller)
+#if BUILDFLAG(IS_TIZEN_TV)
+      : controller_(controller), position_(0, 0) {
+#else
+      : controller_(controller) {
+#endif
   }
 
-  ~_Ewk_Context_Menu() {
-    if (menu_list_) {
-      void* data;
-      EINA_LIST_FREE(menu_list_, data) {
-        _Ewk_Context_Menu_Item *item = static_cast<_Ewk_Context_Menu_Item*> (data);
-        delete item;
-      }
-    }
+  const Eina_List* GetMenuList() const {
+    if (controller_)
+      return controller_->GetMenuItems();  // LCOV_EXCL_LINE
+    else
+      return nullptr;  // LCOV_EXCL_LINE
   }
 
-  const Eina_List* GetMenuList() const {
-    return menu_list_;
+  content::ContextMenuControllerEfl* GetController() const {
+    return controller_;  // LCOV_EXCL_LINE
+  }
+
+  void AppendItem(const _Ewk_Context_Menu_Item* item) {
+    if (controller_)
+      controller_->AppendItem(item);
+  }
+
+  void RemoveItem(const _Ewk_Context_Menu_Item* item) {
+    if (controller_)
+      controller_->RemoveItem(item);
   }
 
-  Eina_List* TakeMenuList() {
-    Eina_List* ptr = menu_list_;
-    menu_list_ = NULL;
-    return ptr;
+  void MenuItemSelected(const _Ewk_Context_Menu_Item* item) {
+    content::ContextMenuItemEfl* info_item = item->GetMenuItem();
+    if (controller_)
+      controller_->MenuItemSelected(info_item);
   }
 
-  void AppendItem(const void* item) {
-    menu_list_ = eina_list_append(menu_list_, item);
+  void HideContextMenu() {
+    if (controller_)
+      controller_->HideContextMenu();
   }
 
-  void RemoveItem(_Ewk_Context_Menu_Item* item) {
-    menu_list_ = eina_list_remove(menu_list_, item);
-    delete item;
+#if BUILDFLAG(IS_TIZEN_TV)
+  void SetPosition(int x, int y) {
+    position_.set_x(x);
+    position_.set_y(y);
   }
 
+  gfx::Point GetPosition() { return position_; }  // LCOV_EXCL_LINE
+#endif
+
  private:
-  Eina_List* menu_list_;
+  content::ContextMenuControllerEfl* controller_;
+#if BUILDFLAG(IS_TIZEN_TV)
+  gfx::Point position_;
+#endif
 };
 
 #endif // ewk_context_menu_private_h
index d52ec97..a747125 100644 (file)
@@ -105,7 +105,9 @@ const char* ewk_context_menu_item_image_url_get(Ewk_Context_Menu_Item* item)
 
 const char* ewk_context_menu_item_title_get(const Ewk_Context_Menu_Item* item)
 {
-  LOG_EWK_API_MOCKUP();
+  EINA_SAFETY_ON_NULL_RETURN_VAL(item, NULL);
+  if (item->GetMenuItem())
+    return item->GetMenuItem()->Title().c_str();
   return NULL;
 }
 
@@ -123,8 +125,8 @@ Ewk_Context_Menu* ewk_context_menu_item_submenu_get(const Ewk_Context_Menu_Item*
 
 const Eina_List* ewk_context_menu_items_get(const Ewk_Context_Menu* menu)
 {
-  LOG_EWK_API_MOCKUP();
-  return NULL;
+  EINA_SAFETY_ON_NULL_RETURN_VAL(menu, NULL);
+  return menu->GetMenuList();
 }
 
 Ewk_Context_Menu* ewk_context_menu_item_parent_menu_get(const Ewk_Context_Menu_Item* item)
@@ -135,21 +137,24 @@ Ewk_Context_Menu* ewk_context_menu_item_parent_menu_get(const Ewk_Context_Menu_I
 
 Eina_Bool ewk_context_menu_item_select(Ewk_Context_Menu* menu, Ewk_Context_Menu_Item* item)
 {
-  LOG_EWK_API_MOCKUP();
-  return false;
+  EINA_SAFETY_ON_NULL_RETURN_VAL(menu, EINA_FALSE);
+  EINA_SAFETY_ON_NULL_RETURN_VAL(item, EINA_FALSE);
+  menu->MenuItemSelected(item);
+  return EINA_TRUE;
 }
 
 Eina_Bool ewk_context_menu_hide(Ewk_Context_Menu* menu)
 {
-  LOG_EWK_API_MOCKUP();
-  return false;
+  EINA_SAFETY_ON_NULL_RETURN_VAL(menu, EINA_FALSE);
+  menu->HideContextMenu();
+  return EINA_TRUE;
 }
 
 int ewk_context_menu_pos_x_get(Ewk_Context_Menu* menu)
 {
 #if BUILDFLAG(IS_TIZEN_TV)
-  LOG_EWK_API_MOCKUP();
-  return 0;
+  EINA_SAFETY_ON_NULL_RETURN_VAL(menu, 0);
+  return menu->GetPosition().x();
 #else
   LOG_EWK_API_MOCKUP("Only for Tizen TV.");
   return 0;
@@ -159,8 +164,8 @@ int ewk_context_menu_pos_x_get(Ewk_Context_Menu* menu)
 int ewk_context_menu_pos_y_get(Ewk_Context_Menu* menu)
 {
 #if BUILDFLAG(IS_TIZEN_TV)
-  LOG_EWK_API_MOCKUP();
-  return 0;
+  EINA_SAFETY_ON_NULL_RETURN_VAL(menu, 0);
+  return menu->GetPosition().y();
 #else
   LOG_EWK_API_MOCKUP("Only for Tizen TV.");
   return 0;