[XWalkExtension] Introduce runtime messgae handler 77/306977/24
authorDongHyun Song <dh81.song@samsung.com>
Fri, 1 Mar 2024 09:52:52 +0000 (18:52 +0900)
committerBot Blink <blinkbot@samsung.com>
Wed, 12 Jun 2024 03:54:20 +0000 (03:54 +0000)
For EWK runtimes, this provides to register callbacks for XWalkExtensions'
runtime message.

On XWalkExtension based webapis, its JS side can invoke native functions
by 2 ways. One(A) is calling to the webapi native code side, the other(B)
is calling to runtime side.

(A)
 - extension.sendSyncMessage
 - extension.sendSyncMessageWithStringReply
(B)
 - extension.sendRuntimeMessage
 - extension.sendRuntimeSyncMessage

Until now, EWK runtime side has no way to get message of B type except
'XWalkExtensionBrowserEfl::HandleRuntimeMessageInternal',

This feature will provide independent message handlers via EWK API.

i.e.)
  char* AppExit(const char* argument) {
    // TODO
    return strdup("success");
  }

ewk_context_add_xwalk_extension_message_handler(context, "tizen://exit",
                                                AppExit);

Change-Id: Ia8be62bdd9cdfa21243a172743e8cedb571df6b1
Signed-off-by: DongHyun Song <dh81.song@samsung.com>
tizen_src/chromium_impl/components/xwalk_extensions/browser/xwalk_extension_manager.cc
tizen_src/chromium_impl/components/xwalk_extensions/browser/xwalk_extension_manager.h
tizen_src/ewk/efl_integration/content_main_delegate_efl.cc
tizen_src/ewk/efl_integration/content_main_delegate_efl.h
tizen_src/ewk/efl_integration/eweb_context.cc
tizen_src/ewk/efl_integration/eweb_context.h
tizen_src/ewk/efl_integration/private/ewk_context_private.cc
tizen_src/ewk/efl_integration/private/ewk_context_private.h
tizen_src/ewk/efl_integration/public/ewk_context.cc
tizen_src/ewk/efl_integration/public/ewk_context_product.h

index 6f21ec86cb20f6dcc02c4dede99f5e9751c9d304..8017ec5c23912d6e2dcad6478aee051e9f7960f2 100644 (file)
@@ -488,8 +488,37 @@ void XWalkExtensionManager::HandleRuntimeAsyncMessage(
   }
 }
 
+void XWalkExtensionManager::SetRuntimeMessageHandler(
+    const std::string& type,
+    XWalkRuntimeMessageHandler handler) {
+  if (!handler || (type == ""))
+    return;
+
+  LOG(INFO) << "[" << type << "] is added in callback";
+  base::AutoLock lock(xmanager_instance_lock);
+  message_callbacks_[type] = handler;
+}
+
+std::string XWalkExtensionManager::HandleRuntimeMessageCallback(
+    const std::string& type,
+    const std::string& value) {
+  base::AutoLock lock(xmanager_instance_lock);
+  if (message_callbacks_.find(type) != message_callbacks_.end()) {
+    auto callback = message_callbacks_[type];
+    char* allocated_result = callback(value.c_str());
+    std::unique_ptr<char, base::FreeDeleter> result(allocated_result);
+    return std::string(result.get());
+  } else {
+    return std::string();
+  }
+}
+
 std::string XWalkExtensionManager::HandleRuntimeMessageInternal(
     const std::string& type, const std::string& value) {
+  auto result = HandleRuntimeMessageCallback(type, value);
+  if (!result.empty())
+    return result;
+
   if (delegate_)
     return delegate_->HandleRuntimeMessageInternal(type, value);
 
index 9868e4078983eeee2c7943ebbe30b205558ebaaf..edb1aaccfb16300d82a124d856f277c2f01b149c 100644 (file)
@@ -24,6 +24,8 @@ class WebContents;
 
 namespace wrt {
 
+typedef char* (*XWalkRuntimeMessageHandler)(const char*);
+
 class XWalkExtensionManager : public mojom::XWalkExtensionBrowser {
  public:
   typedef std::map<std::string, std::unique_ptr<XWalkExtension>> ExtensionMap;
@@ -52,6 +54,8 @@ class XWalkExtensionManager : public mojom::XWalkExtensionBrowser {
   void SetDelegate(std::unique_ptr<XWalkExtensionBrowserDelegate> delegate) {
     delegate_ = std::move(delegate);
   }
+  void SetRuntimeMessageHandler(const std::string& type,
+                                XWalkRuntimeMessageHandler handler);
   void SetPreloadHandle(const std::string& lib_path, void* handle);
   void UnloadExtensions();
   void UnregisterInstance(XWalkExtension::Instance* instance);
@@ -116,6 +120,8 @@ class XWalkExtensionManager : public mojom::XWalkExtensionBrowser {
 
   virtual std::string HandleRuntimeMessageInternal(
       const std::string& type, const std::string& value);
+  std::string HandleRuntimeMessageCallback(const std::string& type,
+                                           const std::string& value);
 
   bool is_loaded_by_path_ = false;
   bool is_loaded_for_service_app_ = false;
@@ -125,6 +131,7 @@ class XWalkExtensionManager : public mojom::XWalkExtensionBrowser {
   std::set<std::string> extension_symbols_;
   ExtensionMap extensions_;
   std::map<std::string, void*> preload_handle_;
+  std::map<std::string, XWalkRuntimeMessageHandler> message_callbacks_;
 
   mojo::ReceiverSet<mojom::XWalkExtensionBrowser> receivers_;
   std::map<mojo::ReceiverId, mojo::Remote<mojom::XWalkExtensionRenderer>>
index 8c6e326ad8804b7118b01a3fbd130e68b17207e8..77b33bae716f41558e31c9f20eeca6b8815f4369 100644 (file)
 #include "renderer/content_renderer_client_efl.h"
 #include "ui/base/resource/resource_bundle.h"
 
-#if BUILDFLAG(IS_TIZEN)
-#include "components/xwalk_extensions/browser/xwalk_extension_manager.h"
-#endif
-
 #if BUILDFLAG(IS_TIZEN_TV)
 #include "content/public/browser/render_process_host.h"
 #include "devtools_port_manager.h"
@@ -168,6 +164,13 @@ void ContentMainDelegateEfl::InitializeXWalkExtensions(
   extension_manager->PreloadExtensions();
   extension_manager->SetDelegate(std::make_unique<XWalkExtensionBrowserEfl>());
 }
+
+void ContentMainDelegateEfl::SetXWalkExtensionMessageHandler(
+    const std::string& type,
+    wrt::XWalkRuntimeMessageHandler handler) {
+  auto* extension_manager = wrt::XWalkExtensionManager::GetInstance();
+  extension_manager->SetRuntimeMessageHandler(type, handler);
+}
 #endif
 /* LCOV_EXCL_STOP */
 
index 9ca655d3b437a7b1b09de3c21e3d3feee579e731..855e849ac1048a979846020f5e57cdbfeb7b861f 100644 (file)
 #include "content/public/renderer/content_renderer_client.h"
 #include "common/content_client_efl.h"
 
+#if BUILDFLAG(IS_TIZEN)
+#include "components/xwalk_extensions/browser/xwalk_extension_manager.h"
+#endif
+
 namespace content {
 
 class ContentMainDelegateEfl
@@ -35,6 +39,8 @@ class ContentMainDelegateEfl
 
 #if BUILDFLAG(IS_TIZEN)
   void InitializeXWalkExtensions(const std::string& extension_path);
+  void SetXWalkExtensionMessageHandler(const std::string& type,
+                                       wrt::XWalkRuntimeMessageHandler handler);
 #endif
 #if BUILDFLAG(IS_TIZEN_TV)
   void ProcessExiting(const std::string& process_type) override;
index e75c5e45eb241f9435f26f269e791fd1c7d1f5b6..886cc78175ad43132961fe05eb2074c2175e838b 100644 (file)
@@ -1066,4 +1066,14 @@ void EWebContext::SetXWalkExtensionProfile(const std::string& extension_path) {
       ->GetContentMainDelegateEfl()
       .InitializeXWalkExtensions(extension_path);
 #endif
+}
+
+void EWebContext::SetXWalkExtensionMessageHandler(
+    const std::string& type,
+    Ewk_RuntimeMessageHandler handler) {
+#if BUILDFLAG(IS_TIZEN)
+  EwkGlobalData::GetInstance()
+      ->GetContentMainDelegateEfl()
+      .SetXWalkExtensionMessageHandler(type, handler);
+#endif
 } /* LCOV_EXCL_STOP */
index 9851b87ed796349b0a0297123939d633e34baf2a..8e312ae1f2039157052a60f3214db5c73e45684d 100644 (file)
@@ -234,6 +234,8 @@ class EWebContext {
   void EnableAppControl(bool enabled);
   void SetMaxRefreshRate(int max_refresh_rate);
   void SetXWalkExtensionProfile(const std::string& extension_path);
+  void SetXWalkExtensionMessageHandler(const std::string& type,
+                                       Ewk_RuntimeMessageHandler handler);
 
  private:
   EWebContext(bool incognito, const std::string& injectedBundlePath);
index a790326833ad02420ad44b53c8041b5d080ff178..ce2aa5f28ef7dd23bb9b4d71330252154151441e 100644 (file)
@@ -404,3 +404,9 @@ void Ewk_Context::SetMaxRefreshRate(int max_refresh_rate) {
 void Ewk_Context::SetXWalkExtensionProfile(const std::string& extension_path) {
   impl->SetXWalkExtensionProfile(extension_path);
 }
+
+void Ewk_Context::SetXWalkExtensionMessageHandler(
+    const std::string& type,
+    Ewk_RuntimeMessageHandler handler) {
+  impl->SetXWalkExtensionMessageHandler(type, handler);
+}
index 5224365da9a6e94fda0f9029672c6d04c6a6151a..f7b00b5cb969e3c3b0113422719d2e35b77aaeea 100644 (file)
@@ -177,6 +177,8 @@ struct Ewk_Context : public base::RefCounted<Ewk_Context> {
   void EnableAppControl(bool enabled);
   void SetMaxRefreshRate(int max_refresh_rate);
   void SetXWalkExtensionProfile(const std::string& extension_path);
+  void SetXWalkExtensionMessageHandler(const std::string& type,
+                                       Ewk_RuntimeMessageHandler handler);
 
  private:
   EWebContext* impl;
index 6e750fbb37808d0535bccbbf2c6c2f732084831d..567f63df29015560d0f6a083eed001a229bc77e6 100644 (file)
@@ -1014,6 +1014,14 @@ void ewk_context_set_xwalk_extension_profile(Ewk_Context* ewk_context,
 }
 /* LCOV_EXCL_STOP */
 
+void ewk_context_add_xwalk_extension_message_handler(Ewk_Context* ewk_context,
+                                                     const char* type,
+                                                     Ewk_RuntimeMessageHandler handler) {
+  EINA_SAFETY_ON_NULL_RETURN(ewk_context);
+  LOG(INFO) << "type : " << type;
+  ewk_context->SetXWalkExtensionMessageHandler(type, handler);
+}
+
 Eina_Bool ewk_context_background_music_get(Ewk_Context* context)
 {
   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
index dad9f246a0a7d53963d27f08e9964454b5a22716..239ac69e36abf7fc87398d38f39b6cb1c52ac9fb 100644 (file)
@@ -921,6 +921,32 @@ EXPORT_API void ewk_context_set_xwalk_extension_profile(
     Ewk_Context* ewk_context,
     const char* extension_path);
 
+/**
+ * @brief   Sets a callback to handle xwalk extension internal message
+ *
+ * @details SetXWalkExtensionMessageHandler handles runtime message like as tizen://exit
+ * file
+ *
+ *
+ * @param[in] context object
+ * @param[in] runtime message type
+ * @param[in] message callback handler - char* (*callback)(const char* argument)
+ *
+ * i.e.)
+ *   ewk_context_add_xwalk_extension_message_handler(context, "tizen://exit", AppExit);
+ *
+ *   char* AppExit(const char* argument) {
+ *     // TODO
+ *     return strdup("success");
+ *   }
+ */
+
+typedef char* (*Ewk_RuntimeMessageHandler)(const char*);
+EXPORT_API void ewk_context_add_xwalk_extension_message_handler(
+    Ewk_Context* ewk_context,
+    const char* type,
+    Ewk_RuntimeMessageHandler handler);
+
 /**
 * @}
 */