Add APIs for context menu into web engine plugin. 14/254414/7
authorhuayong.xu <huayong.xu@samsung.com>
Tue, 2 Mar 2021 12:05:50 +0000 (20:05 +0800)
committerhuayong.xu <huayong.xu@samsung.com>
Thu, 8 Apr 2021 06:06:16 +0000 (14:06 +0800)
This patch is to add some APIs for context menu in web engine
plugin.

Change-Id: If436d5213136565482204e5ab9bb2fd370b0b53c

dali-extension/web-engine-chromium/file.list
dali-extension/web-engine-chromium/tizen-web-engine-chromium.cpp
dali-extension/web-engine-chromium/tizen-web-engine-chromium.h
dali-extension/web-engine-chromium/tizen-web-engine-context-menu-item.cpp [new file with mode: 0755]
dali-extension/web-engine-chromium/tizen-web-engine-context-menu-item.h [new file with mode: 0755]
dali-extension/web-engine-chromium/tizen-web-engine-context-menu.cpp [new file with mode: 0755]
dali-extension/web-engine-chromium/tizen-web-engine-context-menu.h [new file with mode: 0755]
dali-extension/web-engine-lwe/tizen-web-engine-lwe.h

index b58f33d..4c280b5 100755 (executable)
@@ -5,6 +5,8 @@ web_engine_chromium_plugin_src_files = \
    $(extension_src_dir)/web-engine-chromium/tizen-web-engine-chromium.cpp \
    $(extension_src_dir)/web-engine-chromium/tizen-web-engine-console-message.cpp \
    $(extension_src_dir)/web-engine-chromium/tizen-web-engine-context.cpp \
+   $(extension_src_dir)/web-engine-chromium/tizen-web-engine-context-menu.cpp \
+   $(extension_src_dir)/web-engine-chromium/tizen-web-engine-context-menu-item.cpp \
    $(extension_src_dir)/web-engine-chromium/tizen-web-engine-cookie-manager.cpp \
    $(extension_src_dir)/web-engine-chromium/tizen-web-engine-form-repost-decision.cpp \
    $(extension_src_dir)/web-engine-chromium/tizen-web-engine-frame.cpp \
index d8a4fc7..cad4a7a 100755 (executable)
@@ -21,6 +21,8 @@
 #include "tizen-web-engine-certificate.h"
 #include "tizen-web-engine-console-message.h"
 #include "tizen-web-engine-context.h"
+#include "tizen-web-engine-context-menu.h"
+#include "tizen-web-engine-context-menu-item.h"
 #include "tizen-web-engine-cookie-manager.h"
 #include "tizen-web-engine-form-repost-decision.h"
 #include "tizen-web-engine-http-auth-handler.h"
@@ -151,14 +153,14 @@ class WebViewContainerForDali
 {
 public:
   WebViewContainerForDali(WebViewContainerClient& client, int width, int height)
-      : mClient(client)
-      , mWidth(width)
-      , mHeight(height)
-      , mCookieAcceptancePolicy(EWK_COOKIE_ACCEPT_POLICY_NO_THIRD_PARTY)
-      , mWebEngineSettings(0)
-      , mWebEngineContext(0)
-      , mWebEngineCookieManager(0)
-      , mWebEngineBackForwardList(0)
+    : mClient(client)
+    , mWidth(width)
+    , mHeight(height)
+    , mCookieAcceptancePolicy(EWK_COOKIE_ACCEPT_POLICY_NO_THIRD_PARTY)
+    , mWebEngineSettings(0)
+    , mWebEngineContext(0)
+    , mWebEngineCookieManager(0)
+    , mWebEngineBackForwardList(0)
   {
     InitWebView(0, 0);
 
@@ -166,14 +168,14 @@ public:
   }
 
   WebViewContainerForDali(WebViewContainerClient& client, int width, int height, int argc, char** argv)
-      : mClient(client)
-      , mWidth(width)
-      , mHeight(height)
-      , mCookieAcceptancePolicy(EWK_COOKIE_ACCEPT_POLICY_NO_THIRD_PARTY)
-      , mWebEngineSettings(0)
-      , mWebEngineContext(0)
-      , mWebEngineCookieManager(0)
-      , mWebEngineBackForwardList(0)
+    : mClient(client)
+    , mWidth(width)
+    , mHeight(height)
+    , mCookieAcceptancePolicy(EWK_COOKIE_ACCEPT_POLICY_NO_THIRD_PARTY)
+    , mWebEngineSettings(0)
+    , mWebEngineContext(0)
+    , mWebEngineCookieManager(0)
+    , mWebEngineBackForwardList(0)
   {
     InitWebView(argc, argv);
 
@@ -263,6 +265,12 @@ public:
     evas_object_smart_callback_add(mWebView, "ssl,certificate,changed",
                                    &WebViewContainerForDali::OnSslCertificateChanged,
                                    &mClient);
+    evas_object_smart_callback_add(mWebView, "contextmenu,customize",
+                                   &WebViewContainerForDali::OnContextMenuCustomized,
+                                   &mClient);
+    evas_object_smart_callback_add(mWebView, "contextmenu,selected",
+                                   &WebViewContainerForDali::OnContextMenuItemSelected,
+                                   &mClient);
 
     ewk_view_authentication_callback_set(mWebView, &WebViewContainerForDali::OnAuthenticationChallenge, &mClient);
 
@@ -886,7 +894,7 @@ private:
     auto client = static_cast<WebViewContainerClient*>(data);
     Ewk_Form_Repost_Decision_Request* decisionRequest = static_cast<Ewk_Form_Repost_Decision_Request*>(eventInfo);
     std::shared_ptr<Dali::WebEngineFormRepostDecision> webDecisionRequest(new TizenWebEngineFormRepostDecision(decisionRequest));
-    client->RequestFormRepostDecision(webDecisionRequest);
+    client->RequestFormRepostDecision(std::move(webDecisionRequest));
   }
 
   static void OnScreenshotCaptured(Evas_Object* image, void* data)
@@ -916,7 +924,7 @@ private:
     auto client = static_cast<WebViewContainerClient*>(data);
     Ewk_Policy_Decision* policyDecision = static_cast<Ewk_Policy_Decision*>(policy);
     std::shared_ptr<Dali::WebEnginePolicyDecision> webPolicyDecision(new TizenWebEnginePolicyDecision(policyDecision));
-    client->NewWindowPolicyDecided(webPolicyDecision);
+    client->NewWindowPolicyDecided(std::move(webPolicyDecision));
   }
 
   static void OnCertificateConfirmRequest(void* data, Evas_Object*, void* eventInfo)
@@ -942,6 +950,22 @@ private:
     client->AuthenticationChallenge(std::move(authHandler));
   }
 
+  static void OnContextMenuCustomized(void* data, Evas_Object*, void* eventInfo)
+  {
+    auto client = static_cast<WebViewContainerClient *>(data);
+    Ewk_Context_Menu* menu = (Ewk_Context_Menu *)eventInfo;
+    std::shared_ptr<Dali::WebEngineContextMenu> contextMenu(new TizenWebEngineContextMenu(menu));
+    client->ContextMenuCustomized(std::move(contextMenu));
+  }
+
+  static void OnContextMenuItemSelected(void* data, Evas_Object*, void* eventInfo)
+  {
+    auto client = static_cast<WebViewContainerClient*>(data);
+    Ewk_Context_Menu_Item* item = (Ewk_Context_Menu_Item*)eventInfo;
+    std::shared_ptr<Dali::WebEngineContextMenuItem> contextMenuItem(new TizenWebEngineContextMenuItem(item));
+    client->ContextMenuItemSelected(std::move(contextMenuItem));
+  }
+
   static void OnEvaluateJavaScript(Evas_Object* o, const char* result, void* data)
   {
     auto client = WebEngineManager::Get().FindContainerClient(o);
@@ -1043,9 +1067,9 @@ private:
 };
 
 TizenWebEngineChromium::TizenWebEngineChromium()
-    : mWebViewContainer(0)
-    , mJavaScriptEvaluationCount(0)
-{\r
+  : mWebViewContainer(0)
+  , mJavaScriptEvaluationCount(0)
+{
 }
 
 TizenWebEngineChromium::~TizenWebEngineChromium()
@@ -1805,6 +1829,16 @@ Dali::WebEnginePlugin::WebEngineHttpAuthHandlerSignalType& TizenWebEngineChromiu
   return mHttpAuthHandlerSignal;
 }
 
+Dali::WebEnginePlugin::WebEngineContextMenuCustomizedSignalType& TizenWebEngineChromium::ContextMenuCustomizedSignal()
+{
+  return mContextMenuCustomizedSignal;
+}
+
+Dali::WebEnginePlugin::WebEngineContextMenuItemSelectedSignalType& TizenWebEngineChromium::ContextMenuItemSelectedSignal()
+{
+  return mContextMenuItemSelectedSignal;
+}
+
 // WebViewContainerClient Interface
 void TizenWebEngineChromium::UpdateImage(tbm_surface_h buffer)
 {
@@ -1922,6 +1956,24 @@ void TizenWebEngineChromium::AuthenticationChallenge(std::shared_ptr<Dali::WebEn
   }
 }
 
+void TizenWebEngineChromium::ContextMenuCustomized(std::shared_ptr<Dali::WebEngineContextMenu> menu)
+{
+  DALI_LOG_RELEASE_INFO("#ContextMenuCustomized.\n");
+  if (!mContextMenuCustomizedSignal.Empty())
+  {
+    mContextMenuCustomizedSignal.Emit(std::move(menu));
+  }
+}
+
+void TizenWebEngineChromium::ContextMenuItemSelected(std::shared_ptr<Dali::WebEngineContextMenuItem> item)
+{
+  DALI_LOG_RELEASE_INFO("#ContextMenuItemSelected.\n");
+  if (!mContextMenuItemSelectedSignal.Empty())
+  {
+    mContextMenuItemSelectedSignal.Emit(std::move(item));
+  }
+}
+
 void TizenWebEngineChromium::RunJavaScriptEvaluationResultHandler(size_t key, const char* result)
 {
   auto handler = mJavaScriptEvaluationResultHandlers.find(key);
index 5414dd4..78c5096 100755 (executable)
@@ -139,6 +139,20 @@ public:
   virtual void AuthenticationChallenge(std::shared_ptr<Dali::WebEngineHttpAuthHandler> handler) = 0;
 
   /**
+   * @brief Callback function to be called by WebViewContainer when context menu
+   * would be customized.
+   * @param [in] url New url after url is changed.
+   */
+  virtual void ContextMenuCustomized(std::shared_ptr<Dali::WebEngineContextMenu> menu) = 0;
+
+  /**
+   * @brief Callback function to be called by WebViewContainer when context menu
+   * item is selected.
+   * @param [in] url New url after url is changed.
+   */
+  virtual void ContextMenuItemSelected(std::shared_ptr<Dali::WebEngineContextMenuItem> item) = 0;
+
+  /**
    * @brief Callback function to be called by WebViewContainer when it gets
    * JavaScript evalution result.
    * @param [in] key An unsigned integer representing the result handler
@@ -688,6 +702,16 @@ public:
    */
   Dali::WebEnginePlugin::WebEngineHttpAuthHandlerSignalType& HttpAuthHandlerSignal() override;
 
+  /**
+   * @copydoc Dali::WebEnginePlugin::ContextMenuCustomizedSignal()
+   */
+  Dali::WebEnginePlugin::WebEngineContextMenuCustomizedSignalType& ContextMenuCustomizedSignal() override;
+
+  /**
+   * @copydoc Dali::WebEnginePlugin::ContextMenuItemSelectedSignal()
+   */
+  Dali::WebEnginePlugin::WebEngineContextMenuItemSelectedSignalType& ContextMenuItemSelectedSignal() override;
+
   // WebViewContainerClient Interface
 
   /**
@@ -761,6 +785,16 @@ public:
   void AuthenticationChallenge(std::shared_ptr<Dali::WebEngineHttpAuthHandler> handler) override;
 
   /**
+   * @copydoc Dali::Plugin::WebViewContainerClient::ContextMenuCustomized()
+   */
+  void ContextMenuCustomized(std::shared_ptr<Dali::WebEngineContextMenu> menu) override;
+
+  /**
+   * @copydoc Dali::Plugin::WebViewContainerClient::ContextMenuItemSelected()
+   */
+  void ContextMenuItemSelected(std::shared_ptr<Dali::WebEngineContextMenuItem> item) override;
+
+  /**
    * @copydoc
    * Dali::Plugin::WebViewContainerClient::RunJavaScriptEvaluationResultHandler()
    */
@@ -808,23 +842,25 @@ private:
   std::string                mUrl;
   size_t                     mJavaScriptEvaluationCount;
 
-  Dali::WebEnginePlugin::WebEnginePageLoadSignalType           mLoadStartedSignal;
-  Dali::WebEnginePlugin::WebEnginePageLoadSignalType           mLoadInProgressSignal;
-  Dali::WebEnginePlugin::WebEnginePageLoadSignalType           mLoadFinishedSignal;
-  Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType      mLoadErrorSignal;
-  Dali::WebEnginePlugin::WebEngineUrlChangedSignalType         mUrlChangedSignal;
-  Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType  mScrollEdgeReachedSignal;
-  Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType mFormRepostDecisionSignal;
-  Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType      mFrameRenderedSignal;
-  Dali::WebEnginePlugin::WebEngineRequestInterceptorSignalType mRequestInterceptorSignal;
-  Dali::WebEnginePlugin::WebEngineConsoleMessageSignalType     mConsoleMessageSignal;
-  Dali::WebEnginePlugin::WebEnginePolicyDecisionSignalType     mPolicyDecisionSignal;
-  Dali::WebEnginePlugin::WebEngineCertificateSignalType        mCertificateConfirmSignal;
-  Dali::WebEnginePlugin::WebEngineCertificateSignalType        mSslCertificateChangedSignal;
-  Dali::WebEnginePlugin::WebEngineHttpAuthHandlerSignalType    mHttpAuthHandlerSignal;
-
-  std::unordered_map<size_t, JavaScriptCallback>               mJavaScriptEvaluationResultHandlers;
-  std::unordered_map<std::string, JavaScriptCallback>          mJavaScriptMessageHandlers;
+  Dali::WebEnginePlugin::WebEnginePageLoadSignalType                mLoadStartedSignal;
+  Dali::WebEnginePlugin::WebEnginePageLoadSignalType                mLoadInProgressSignal;
+  Dali::WebEnginePlugin::WebEnginePageLoadSignalType                mLoadFinishedSignal;
+  Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType           mLoadErrorSignal;
+  Dali::WebEnginePlugin::WebEngineUrlChangedSignalType              mUrlChangedSignal;
+  Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType       mScrollEdgeReachedSignal;
+  Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType      mFormRepostDecisionSignal;
+  Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType           mFrameRenderedSignal;
+  Dali::WebEnginePlugin::WebEngineRequestInterceptorSignalType      mRequestInterceptorSignal;
+  Dali::WebEnginePlugin::WebEngineConsoleMessageSignalType          mConsoleMessageSignal;
+  Dali::WebEnginePlugin::WebEnginePolicyDecisionSignalType          mPolicyDecisionSignal;
+  Dali::WebEnginePlugin::WebEngineCertificateSignalType             mCertificateConfirmSignal;
+  Dali::WebEnginePlugin::WebEngineCertificateSignalType             mSslCertificateChangedSignal;
+  Dali::WebEnginePlugin::WebEngineHttpAuthHandlerSignalType         mHttpAuthHandlerSignal;
+  Dali::WebEnginePlugin::WebEngineContextMenuCustomizedSignalType   mContextMenuCustomizedSignal;
+  Dali::WebEnginePlugin::WebEngineContextMenuItemSelectedSignalType mContextMenuItemSelectedSignal;
+
+  std::unordered_map<size_t, JavaScriptCallback>      mJavaScriptEvaluationResultHandlers;
+  std::unordered_map<std::string, JavaScriptCallback> mJavaScriptMessageHandlers;
 
   Dali::WebEnginePlugin::JavaScriptAlertCallback       mJavaScriptAlertCallback;
   Dali::WebEnginePlugin::JavaScriptConfirmCallback     mJavaScriptConfirmCallback;
diff --git a/dali-extension/web-engine-chromium/tizen-web-engine-context-menu-item.cpp b/dali-extension/web-engine-chromium/tizen-web-engine-context-menu-item.cpp
new file mode 100755 (executable)
index 0000000..a090146
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "tizen-web-engine-context-menu-item.h"
+#include "tizen-web-engine-context-menu.h"
+
+#include <ewk_context_menu_internal.h>
+#include <ewk_context_menu_product.h>
+
+namespace Dali
+{
+namespace Plugin
+{
+
+TizenWebEngineContextMenuItem::TizenWebEngineContextMenuItem(Ewk_Context_Menu_Item* item)
+  : ewkContextMenuItem(item)
+{
+}
+
+TizenWebEngineContextMenuItem::~TizenWebEngineContextMenuItem()
+{
+}
+
+Dali::WebEngineContextMenuItem::ItemTag TizenWebEngineContextMenuItem::GetTag() const
+{
+  return static_cast<Dali::WebEngineContextMenuItem::ItemTag>(ewk_context_menu_item_tag_get(ewkContextMenuItem));
+}
+
+Dali::WebEngineContextMenuItem::ItemType TizenWebEngineContextMenuItem::GetType() const
+{
+  return static_cast<Dali::WebEngineContextMenuItem::ItemType>(ewk_context_menu_item_type_get(ewkContextMenuItem));
+}
+
+bool TizenWebEngineContextMenuItem::IsEnabled() const
+{
+  return ewk_context_menu_item_enabled_get(ewkContextMenuItem);
+}
+
+std::string TizenWebEngineContextMenuItem::GetLinkUrl() const
+{
+  return ewk_context_menu_item_link_url_get(ewkContextMenuItem);
+}
+
+std::string TizenWebEngineContextMenuItem::GetImageUrl() const
+{
+  return ewk_context_menu_item_image_url_get(ewkContextMenuItem);
+}
+
+std::string TizenWebEngineContextMenuItem::GetTitle() const
+{
+  return ewk_context_menu_item_title_get(ewkContextMenuItem);
+}
+
+std::unique_ptr<Dali::WebEngineContextMenu> TizenWebEngineContextMenuItem::GetParentMenu() const
+{
+  Ewk_Context_Menu* menu = ewk_context_menu_item_parent_menu_get(ewkContextMenuItem);
+  std::unique_ptr<Dali::WebEngineContextMenu> webEngineContextMenu(new TizenWebEngineContextMenu(menu));
+  return webEngineContextMenu;
+}
+
+Ewk_Context_Menu_Item* TizenWebEngineContextMenuItem::GetMenuItem() const
+{
+  return ewkContextMenuItem;
+}
+
+} // namespace Plugin
+} // namespace Dali
diff --git a/dali-extension/web-engine-chromium/tizen-web-engine-context-menu-item.h b/dali-extension/web-engine-chromium/tizen-web-engine-context-menu-item.h
new file mode 100755 (executable)
index 0000000..5cc9aca
--- /dev/null
@@ -0,0 +1,98 @@
+#ifndef DALI_PLUGIN_TIZEN_WEB_ENGINE_CONTEXT_MENU_ITEM_H
+#define DALI_PLUGIN_TIZEN_WEB_ENGINE_CONTEXT_MENU_ITEM_H
+
+/*
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/web-engine-context-menu.h>
+#include <dali/devel-api/adaptor-framework/web-engine-context-menu-item.h>
+#include <ewk_context_menu.h>
+
+namespace Dali
+{
+// forward declaration.
+class WebEngineContextMenu;
+
+namespace Plugin
+{
+/**
+ * @brief A class TizenWebEngineContextMenuItem for item of context menu.
+ */
+class TizenWebEngineContextMenuItem : public Dali::WebEngineContextMenuItem
+{
+public:
+  /**
+   * @brief Constructor.
+   */
+  TizenWebEngineContextMenuItem(Ewk_Context_Menu_Item*);
+
+  /**
+   * @brief Destructor.
+   */
+  ~TizenWebEngineContextMenuItem();
+
+  /**
+   * @copydoc Dali::WebEngineContextMenuItem::GetTag()
+   */
+  ItemTag GetTag() const override;
+
+  /**
+   * @copydoc Dali::WebEngineContextMenuItem::GetType()
+   */
+  ItemType GetType() const override;
+
+  /**
+   * @copydoc Dali::WebEngineContextMenuItem::IsEnabled()
+   */
+  bool IsEnabled() const override;
+
+  /**
+   * @copydoc Dali::WebEngineContextMenuItem::GetLinkUrl()
+   */
+  std::string GetLinkUrl() const override;
+
+  /**
+   * @copydoc Dali::WebEngineContextMenuItem::GetImageUrl()
+   */
+  std::string GetImageUrl() const override;
+
+  /**
+   * @copydoc Dali::WebEngineContextMenuItem::GetTitle()
+   */
+  std::string GetTitle() const override;
+
+  /**
+   * @copydoc Dali::WebEngineContextMenuItem::GetParentMenu()
+   */
+  std::unique_ptr<Dali::WebEngineContextMenu> GetParentMenu() const override;
+
+  /**
+   * @brief Gets menu item of web engine.
+   *
+   * @return menu item of web engine
+   */
+  Ewk_Context_Menu_Item* GetMenuItem() const;
+
+private:
+  Ewk_Context_Menu_Item* ewkContextMenuItem;
+};
+
+} // namespace Plugin
+} // namespace Dali
+
+#endif // DALI_PLUGIN_TIZEN_WEB_ENGINE_CONTEXT_MENU_ITEM_H
diff --git a/dali-extension/web-engine-chromium/tizen-web-engine-context-menu.cpp b/dali-extension/web-engine-chromium/tizen-web-engine-context-menu.cpp
new file mode 100755 (executable)
index 0000000..9f0817c
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "tizen-web-engine-context-menu.h"
+#include "tizen-web-engine-context-menu-item.h"
+
+#include <ewk_context_menu_product.h>
+
+namespace Dali
+{
+namespace Plugin
+{
+
+TizenWebEngineContextMenu::TizenWebEngineContextMenu(Ewk_Context_Menu* menu)
+  : ewkContextMenu(menu)
+{
+}
+
+TizenWebEngineContextMenu::~TizenWebEngineContextMenu()
+{
+}
+
+uint32_t TizenWebEngineContextMenu::GetItemCount() const
+{
+  return ewk_context_menu_item_count(ewkContextMenu);
+}
+
+std::unique_ptr<Dali::WebEngineContextMenuItem> TizenWebEngineContextMenu::GetItemAt(uint32_t index) const
+{
+  Ewk_Context_Menu_Item* item = ewk_context_menu_nth_item_get(ewkContextMenu, index);
+  std::unique_ptr<Dali::WebEngineContextMenuItem> contextMenuItem(new TizenWebEngineContextMenuItem(item));
+  return contextMenuItem;
+}
+
+std::vector<std::unique_ptr<Dali::WebEngineContextMenuItem>> TizenWebEngineContextMenu::GetItemList() const
+{
+  std::vector<std::unique_ptr<Dali::WebEngineContextMenuItem>> contextMenuItemList;
+  Eina_List* itemList = const_cast<Eina_List*>(ewk_context_menu_items_get(ewkContextMenu));
+  Eina_List* list = nullptr;
+  void* item = nullptr;
+  EINA_LIST_FOREACH(itemList, list, item)
+  {
+    if (item)
+    {
+      Ewk_Context_Menu_Item* menuItem = static_cast<Ewk_Context_Menu_Item*>(item);
+      std::unique_ptr<Dali::WebEngineContextMenuItem> webitem(new TizenWebEngineContextMenuItem(menuItem));
+      contextMenuItemList.push_back(std::move(webitem));
+    }
+  }
+  return contextMenuItemList;
+}
+
+bool TizenWebEngineContextMenu::RemoveItem(Dali::WebEngineContextMenuItem& item)
+{
+  TizenWebEngineContextMenuItem* menuItem = static_cast<TizenWebEngineContextMenuItem*>(&item);
+  return ewk_context_menu_item_remove(ewkContextMenu, menuItem->GetMenuItem());
+}
+
+bool TizenWebEngineContextMenu::AppendItemAsAction(Dali::WebEngineContextMenuItem::ItemTag tag, const std::string& title, bool enabled)
+{
+  return ewk_context_menu_item_append_as_action(ewkContextMenu, (Ewk_Context_Menu_Item_Tag)tag, title.c_str(), enabled);
+}
+
+bool TizenWebEngineContextMenu::AppendItem(Dali::WebEngineContextMenuItem::ItemTag tag, const std::string& title, const std::string& iconFile, bool enabled)
+{
+  return ewk_context_menu_item_append(ewkContextMenu, (Ewk_Context_Menu_Item_Tag)tag, title.c_str(), iconFile.c_str(), enabled);
+}
+
+bool TizenWebEngineContextMenu::SelectItem(Dali::WebEngineContextMenuItem& item)
+{
+  TizenWebEngineContextMenuItem* menuItem = static_cast<TizenWebEngineContextMenuItem*>(&item);
+  return ewk_context_menu_item_select(ewkContextMenu, menuItem->GetMenuItem());
+}
+
+Dali::Vector2 TizenWebEngineContextMenu::GetPosition() const
+{
+  int x = 0, y = 0;
+#if defined(OS_TIZEN_TV)
+  x = ewk_context_menu_pos_x_get(ewkContextMenu);
+  y = ewk_context_menu_pos_y_get(ewkContextMenu);
+#endif
+  return Dali::Vector2(x, y);
+}
+
+bool TizenWebEngineContextMenu::Hide()
+{
+  return ewk_context_menu_hide(ewkContextMenu);
+}
+
+} // namespace Plugin
+} // namespace Dali
diff --git a/dali-extension/web-engine-chromium/tizen-web-engine-context-menu.h b/dali-extension/web-engine-chromium/tizen-web-engine-context-menu.h
new file mode 100755 (executable)
index 0000000..c9fe514
--- /dev/null
@@ -0,0 +1,103 @@
+#ifndef DALI_PLUGIN_TIZEN_WEB_ENGINE_CONTEXT_MENU_H
+#define DALI_PLUGIN_TIZEN_WEB_ENGINE_CONTEXT_MENU_H
+
+/*
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/web-engine-context-menu.h>
+#include <dali/devel-api/adaptor-framework/web-engine-context-menu-item.h>
+#include <dali/public-api/math/vector2.h>
+#include <ewk_context_menu.h>
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace Dali
+{
+namespace Plugin
+{
+
+/**
+ * @brief A class TizenWebEngineContextMenu for context menu.
+ */
+class TizenWebEngineContextMenu : public Dali::WebEngineContextMenu
+{
+public:
+  /**
+   * @brief Constructor.
+   */
+  TizenWebEngineContextMenu(Ewk_Context_Menu*);
+
+  /**
+   * @brief Destructor.
+   */
+  ~TizenWebEngineContextMenu();
+
+  /**
+   * @copydoc Dali::WebEngineContextMenu::GetItemCount()
+   */
+  uint32_t GetItemCount() const override;
+
+  /**
+   * @copydoc Dali::WebEngineContextMenu::GetItemAt()
+   */
+  std::unique_ptr<Dali::WebEngineContextMenuItem> GetItemAt(uint32_t index) const override;
+
+  /**
+   * @copydoc Dali::WebEngineContextMenu::GetItemList()
+   */
+  std::vector<std::unique_ptr<Dali::WebEngineContextMenuItem>> GetItemList() const override;
+
+  /**
+   * @copydoc Dali::WebEngineContextMenu::GetPosition()
+   */
+  Dali::Vector2 GetPosition() const override;
+
+  /**
+   * @copydoc Dali::WebEngineContextMenu::RemoveItem()
+   */
+  bool RemoveItem(Dali::WebEngineContextMenuItem& item) override;
+
+  /**
+   * @copydoc Dali::WebEngineContextMenu::AppendItemAsAction()
+   */
+  bool AppendItemAsAction(Dali::WebEngineContextMenuItem::ItemTag tag, const std::string& title, bool enabled) override;
+
+  /**
+   * @copydoc Dali::WebEngineContextMenu::AppendItem()
+   */
+  bool AppendItem(Dali::WebEngineContextMenuItem::ItemTag tag, const std::string& title, const std::string& iconFile, bool enabled) override;
+
+  /**
+   * @copydoc Dali::WebEngineContextMenu::SelectItem()
+   */
+  bool SelectItem(Dali::WebEngineContextMenuItem& item) override;
+
+  /**
+   * @copydoc Dali::WebEngineContextMenu::Hide()
+   */
+  bool Hide() override;
+
+private:
+  Ewk_Context_Menu* ewkContextMenu;
+};
+
+} // namespace Plugin
+} // namespace Dali
+
+#endif // DALI_PLUGIN_TIZEN_WEB_ENGINE_CONTEXT_MENU_H
index f1bb243..a99a2a0 100755 (executable)
@@ -568,6 +568,22 @@ public:
     return mHttpAuthHandlerSignal;
   }
 
+  /**
+   * @copydoc Dali::WebEnginePlugin::ContextMenuCustomizedSignal()
+   */
+  Dali::WebEnginePlugin::WebEngineContextMenuCustomizedSignalType& ContextMenuCustomizedSignal() override
+  {
+    return mContextMenuCustomizedSignal;
+  }
+
+  /**
+   * @copydoc Dali::WebEnginePlugin::ContextMenuItemSelectedSignal()
+   */
+  Dali::WebEnginePlugin::WebEngineContextMenuItemSelectedSignalType& ContextMenuItemSelectedSignal() override
+  {
+    return mContextMenuItemSelectedSignal;
+  }
+
 private:
   void UpdateBuffer();
 
@@ -612,20 +628,22 @@ private:
 
   EventThreadCallback mUpdateBufferTrigger;
 
-  Dali::WebEnginePlugin::WebEnginePageLoadSignalType           mPageLoadStartedSignal;
-  Dali::WebEnginePlugin::WebEnginePageLoadSignalType           mPageLoadInProgressSignal;
-  Dali::WebEnginePlugin::WebEnginePageLoadSignalType           mPageLoadFinishedSignal;
-  Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType      mPageLoadErrorSignal;
-  Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType  mScrollEdgeReachedSignal;
-  Dali::WebEnginePlugin::WebEngineUrlChangedSignalType         mUrlChangedSignal;
-  Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType mFormRepostDecisionSignal;
-  Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType      mFrameRenderedSignal;
-  Dali::WebEnginePlugin::WebEngineRequestInterceptorSignalType mRequestInterceptorSignal;
-  Dali::WebEnginePlugin::WebEngineConsoleMessageSignalType     mConsoleMessageSignal;
-  Dali::WebEnginePlugin::WebEnginePolicyDecisionSignalType     mPolicyDecisionSignal;
-  Dali::WebEnginePlugin::WebEngineCertificateSignalType        mCertificateConfirmSignal;
-  Dali::WebEnginePlugin::WebEngineCertificateSignalType        mSslCertificateChangedSignal;
-  Dali::WebEnginePlugin::WebEngineHttpAuthHandlerSignalType    mHttpAuthHandlerSignal;
+  Dali::WebEnginePlugin::WebEnginePageLoadSignalType                mPageLoadStartedSignal;
+  Dali::WebEnginePlugin::WebEnginePageLoadSignalType                mPageLoadInProgressSignal;
+  Dali::WebEnginePlugin::WebEnginePageLoadSignalType                mPageLoadFinishedSignal;
+  Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType           mPageLoadErrorSignal;
+  Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType       mScrollEdgeReachedSignal;
+  Dali::WebEnginePlugin::WebEngineUrlChangedSignalType              mUrlChangedSignal;
+  Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType      mFormRepostDecisionSignal;
+  Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType           mFrameRenderedSignal;
+  Dali::WebEnginePlugin::WebEngineRequestInterceptorSignalType      mRequestInterceptorSignal;
+  Dali::WebEnginePlugin::WebEngineConsoleMessageSignalType          mConsoleMessageSignal;
+  Dali::WebEnginePlugin::WebEnginePolicyDecisionSignalType          mPolicyDecisionSignal;
+  Dali::WebEnginePlugin::WebEngineCertificateSignalType             mCertificateConfirmSignal;
+  Dali::WebEnginePlugin::WebEngineCertificateSignalType             mSslCertificateChangedSignal;
+  Dali::WebEnginePlugin::WebEngineHttpAuthHandlerSignalType         mHttpAuthHandlerSignal;
+  Dali::WebEnginePlugin::WebEngineContextMenuCustomizedSignalType   mContextMenuCustomizedSignal;
+  Dali::WebEnginePlugin::WebEngineContextMenuItemSelectedSignalType mContextMenuItemSelectedSignal;
 };
 
 } // namespace Plugin