[M108 Migration] Migrate patches related to eldbus 81/288281/2
authorayush.k123 <ayush.k123@samsung.com>
Tue, 14 Feb 2023 09:17:24 +0000 (14:47 +0530)
committerBot Blink <blinkbot@samsung.com>
Thu, 16 Feb 2023 00:24:14 +0000 (00:24 +0000)
This patch contains the following code related to eldbus
1) Initialize eldbus on engine side
2) Check eldbus property when initialized
3) Relase a reference of eldbus connection during ewk_shutdown

Refernces: https://review.tizen.org/gerrit/281257/

Change-Id: Ib21c63b3bcdf0c17d7217c82bb6a159b97f25065
Signed-off-by: Ayush Kumar <ayush.k123@samsung.com>
packaging/chromium-efl.spec
tizen_src/build/BUILD.gn
tizen_src/chromium_impl/ui/base/clipboard/clipboard_helper_efl_wayland.cc
tizen_src/chromium_impl/ui/base/clipboard/clipboard_helper_efl_wayland.h
tizen_src/ewk/efl_integration/eweb_accessibility_util.cc
tizen_src/ewk/efl_integration/eweb_accessibility_util.h
tizen_src/ewk/efl_integration/ewk_global_data.cc
tizen_src/ewk/efl_integration/public/ewk_main.cc

index d16e310..83c4782 100644 (file)
@@ -75,6 +75,7 @@ BuildRequires: pkgconfig(ecore-imf)
 BuildRequires: pkgconfig(ecore-imf-evas)
 BuildRequires: pkgconfig(ecore-input)
 BuildRequires: pkgconfig(efl-extension)
+BuildRequires: pkgconfig(eldbus)
 BuildRequires: pkgconfig(elementary)
 BuildRequires: pkgconfig(esplusplayer)
 BuildRequires: pkgconfig(evas)
index e7c5d68..16ed3dc 100644 (file)
@@ -111,6 +111,14 @@ tizen_pkg_config("libatk-bridge") {
   packages = [ "atk-bridge-2.0" ]
 }
 
+config("eldbus") {
+  ldflags = [ "-leldbus" ]
+}
+
+tizen_pkg_config("libeldbus") {
+  packages = [ "eldbus" ]
+}
+
 config("ecore-input") {
   ldflags = [ "-lecore_input" ]
 }
index e906489..2599142 100644 (file)
@@ -25,12 +25,18 @@ const std::string::size_type kHTMLImageFromClipboardAppFrontLength =
 const std::string kHTMLImageFromClipboardAppEnd("\">");
 const std::string kDataURIImagePrefix("<img alt=\"\" src=\"data:image;base64,");
 const std::string kDataURIImageSuffix("\">");
+static bool g_eldbus_initialized = false;
 }  // namespace
 
 ClipboardHelperEfl* ClipboardHelperEfl::GetInstance() {
   return base::Singleton<ClipboardHelperEfl>::get();
 }
 
+void ClipboardHelperEfl::ShutdownIfNeeded() {
+  if (g_eldbus_initialized)
+    ClipboardHelperEfl::GetInstance()->CbhmEldbusDeinit();
+}
+
 ClipboardHelperEfl::ClipboardHelperEfl() {
   CbhmEldbusInit();
 }
@@ -499,6 +505,7 @@ void ClipboardHelperEfl::CbhmEldbusInit() {
   eldbus_proxy_signal_handler_add(eldbus_proxy_, "ItemClicked",
                                   ClipboardHelperEfl::OnClipboardItemClicked,
                                   this);
+  g_eldbus_initialized = true;
 }
 
 void ClipboardHelperEfl::CbhmEldbusDeinit() {
@@ -506,8 +513,11 @@ void ClipboardHelperEfl::CbhmEldbusDeinit() {
   if (!IsMobileProfile())
     return;
 
-  if (cbhm_conn_)
+  if (cbhm_conn_) {
     eldbus_connection_unref(cbhm_conn_);
+    cbhm_conn_ = nullptr;
+  }
+  g_eldbus_initialized = false;
 }
 
 int ClipboardHelperEfl::CbhmNumberOfItems() const {
index 0143fdb..b5180c6 100644 (file)
@@ -58,6 +58,7 @@ class COMPONENT_EXPORT(UI_BASE) ClipboardHelperEfl {
   void SetContentEditable(bool is_content_editable) {
     is_content_editable_ = is_content_editable;
   }
+  static void ShutdownIfNeeded();
 
  private:
   friend struct base::DefaultSingletonTraits<ClipboardHelperEfl>;
@@ -122,7 +123,7 @@ class COMPONENT_EXPORT(UI_BASE) ClipboardHelperEfl {
 
   // Clipboard app integration:
   Eldbus_Proxy* eldbus_proxy_;
-  Eldbus_Connection* cbhm_conn_;
+  Eldbus_Connection* cbhm_conn_ = nullptr;
   ExecCommandCallback exec_command_callback_;
 
   bool clipboard_window_opened_ = false;
index 74e6c1d..2ac024f 100644 (file)
@@ -58,6 +58,12 @@ G_DEFINE_TYPE_WITH_PRIVATE(EWebAccessibilityRoot,
                            eweb_accessibility_root,
                            ATK_TYPE_OBJECT);
 
+const char* const kA11yDbusName = "org.a11y.Bus";
+const char* const kA11yDbusPath = "/org/a11y/bus";
+const char* const kA11yDbusInterface = "org.a11y.Bus";
+const char* const kA11yDbusStatusInterface = "org.a11y.Status";
+const char* const kA11yDbusEnabledProperty = "IsEnabled";
+
 #if defined(ENABLE_WRT_JS)
 EWebAccessibility* eweb_accessibility_ = nullptr;
 #endif
@@ -111,6 +117,69 @@ static void PropertyChangedCb(keynode_t* keynodeName, void* data) {
   obj->ToggleBrowserAccessibility(result);
 }
 
+static void A11yPropertyChangedCb(void* data,
+                                  Eldbus_Proxy* proxy EINA_UNUSED,
+                                  void* event) {
+  EWebAccessibilityUtil* obj = static_cast<EWebAccessibilityUtil*>(data);
+  if (!obj) {
+    LOG(ERROR) << "obj is NULL";
+    return;
+  }
+
+  Eldbus_Proxy_Event_Property_Changed* ev =
+      static_cast<Eldbus_Proxy_Event_Property_Changed*>(event);
+  Eina_Bool result = EINA_FALSE;
+  const char* ifc = eldbus_proxy_interface_get(ev->proxy);
+
+  if (ev->name &&
+      !strncmp(ev->name, kA11yDbusEnabledProperty,
+               strlen(kA11yDbusEnabledProperty)) &&
+      ifc &&
+      !strncmp(kA11yDbusStatusInterface, ifc,
+               strlen(kA11yDbusStatusInterface))) {
+    if (!eina_value_get(ev->value, &result)) {
+      LOG(ERROR) << "Unable to get " << kA11yDbusEnabledProperty
+                 << " property value";
+      return;
+    }
+
+    obj->ToggleBrowserAccessibility(result);
+  }
+}
+
+static void AtSpiClientEnabledGet(void* data,
+                                  const Eldbus_Message* msg,
+                                  Eldbus_Pending* pending) {
+  EWebAccessibilityUtil* obj = static_cast<EWebAccessibilityUtil*>(data);
+  if (!obj) {
+    LOG(ERROR) << "obj is NULL";
+    return;
+  }
+
+  const char* errname = nullptr;
+  const char* errmsg = nullptr;
+  Eina_Bool is_enabled = EINA_FALSE;
+  Eldbus_Message_Iter* variant = nullptr;
+
+  if (eldbus_message_error_get(msg, &errname, &errmsg)) {
+    LOG(ERROR) << "eldbus_message_error_get " << errname << errmsg;
+    return;
+  }
+
+  if (!eldbus_message_arguments_get(msg, "v", &variant)) {
+    LOG(ERROR) << kA11yDbusEnabledProperty << " not packed into variant.";
+    return;
+  }
+
+  if (!eldbus_message_iter_arguments_get(variant, "b", &is_enabled)) {
+    LOG(ERROR) << "Could not get " << kA11yDbusEnabledProperty
+               << " boolean property";
+    return;
+  }
+
+  obj->ToggleBrowserAccessibility(is_enabled);
+}
+
 EWebAccessibilityUtil* EWebAccessibilityUtil::GetInstance() {
   return base::Singleton<EWebAccessibilityUtil>::get();
 }
@@ -125,14 +194,67 @@ EWebAccessibilityUtil::EWebAccessibilityUtil() {
   atkUtilClass->get_root = eweb_util_get_root;
   vconf_notify_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS,
                            PropertyChangedCb, this);
+  if (!IsTvProfile())
+    A11yEldbusInit();
 }
 
 EWebAccessibilityUtil::~EWebAccessibilityUtil() {
   vconf_ignore_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS,
                            PropertyChangedCb);
+  if (!IsTvProfile())
+    A11yEldbusDeInit();
+
   CleanAtkBridgeAdaptor();
 }
 
+void EWebAccessibilityUtil::A11yEldbusInit() {
+  if (!(eldbus_conn_ = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION))) {
+    LOG(ERROR) << "eldbus_connection_get() failed";
+    return;
+  }
+
+  if (!(eldbus_obj_ =
+            eldbus_object_get(eldbus_conn_, kA11yDbusName, kA11yDbusPath))) {
+    LOG(ERROR) << "eldbus_object_get() failed";
+    eldbus_connection_unref(eldbus_conn_);
+    return;
+  }
+
+  Eldbus_Proxy* proxy = nullptr;
+  Eldbus_Pending* req = nullptr;
+
+  if (!(proxy = eldbus_proxy_get(eldbus_obj_, kA11yDbusStatusInterface))) {
+    LOG(ERROR) << "eldbus_proxy_get() failed";
+    eldbus_object_unref(eldbus_obj_);
+    eldbus_connection_unref(eldbus_conn_);
+    return;
+  }
+
+  if (!(req = eldbus_proxy_property_get(proxy, kA11yDbusEnabledProperty,
+                                        AtSpiClientEnabledGet, this))) {
+    LOG(ERROR) << "eldbus_proxy_property_get() failed";
+    eldbus_object_unref(eldbus_obj_);
+    eldbus_connection_unref(eldbus_conn_);
+    return;
+  }
+
+  eldbus_proxy_properties_monitor(proxy, EINA_TRUE);
+  eldbus_proxy_event_callback_add(proxy, ELDBUS_PROXY_EVENT_PROPERTY_CHANGED,
+                                  A11yPropertyChangedCb, this);
+}
+
+void EWebAccessibilityUtil::A11yEldbusDeInit() {
+  if (eldbus_obj_) {
+    eldbus_object_unref(eldbus_obj_);
+    eldbus_obj_ = nullptr;
+  }
+
+  if (eldbus_conn_) {
+    eldbus_connection_unref(eldbus_conn_);
+    eldbus_conn_ = nullptr;
+  }
+}
+
 void EWebAccessibilityUtil::NotifyAccessibilityStatus(bool mode) {
   for (const auto& wc : content::WebContentsImpl::GetAllWebContents()) {
     if (EWebView* ewebview = WebViewFromWebContents(wc))
index 33fcf40..339eb61 100644 (file)
@@ -5,6 +5,8 @@
 #ifndef EWEB_ACCESSIBILITY_UTIL_H
 #define EWEB_ACCESSIBILITY_UTIL_H
 
+#include <Eldbus.h>
+
 #include "base/memory/singleton.h"
 
 #if defined(ENABLE_WRT_JS)
@@ -31,12 +33,17 @@ class EWebAccessibilityUtil {
   EWebAccessibilityUtil(const EWebAccessibilityUtil&) = delete;
   EWebAccessibilityUtil& operator=(const EWebAccessibilityUtil&) = delete;
 
+  void A11yEldbusInit();
+  void A11yEldbusDeInit();
   void NotifyAccessibilityStatus(bool mode);
   void InitAtkBridgeAdaptor();
   void CleanAtkBridgeAdaptor();
 
   bool atk_bridge_initialized_ = false;
   friend struct base::DefaultSingletonTraits<EWebAccessibilityUtil>;
+
+  Eldbus_Object* eldbus_obj_ = nullptr;
+  Eldbus_Connection* eldbus_conn_ = nullptr;
 };
 
 #endif  // EWEB_ACCESSIBILITY_UTIL_H
index ae28b71..1904ddf 100644 (file)
@@ -37,7 +37,6 @@
 #include "mojo/core/embedder/embedder.h"
 #include "renderer/content_renderer_client_efl.h"
 #include "ui/aura/screen_ozone.h"
-#include "ui/base/resource/resource_bundle.h"
 #include "ui/ozone/public/ozone_platform.h"
 
 #if BUILDFLAG(IS_TIZEN)
 void* EflExtensionHandle = 0;
 #endif
 
+#if defined(USE_WAYLAND)
+#include "ui/base/clipboard/clipboard_helper_efl_wayland.h"
+#endif
+
 using content::BrowserMainRunner;
 using content::BrowserThread;
 using content::ContentMainDelegateEfl;
@@ -95,6 +98,12 @@ EwkGlobalData::~EwkGlobalData() {
     auto crce = static_cast<ContentRendererClientEfl*>(crc);
     crce->set_shutting_down(true);
     content::RenderProcessHostImpl::ShutDownInProcessRenderer();
+
+#if defined(USE_WAYLAND)
+    // In single process mode, at-exit callbacks are disabled, so we should run
+    // shutdown sequence manually if it is needed.
+    ClipboardHelperEfl::ShutdownIfNeeded();
+#endif
   }
 
   // Delete browser context for browser context cleanup that use
index bb61717..2a29423 100644 (file)
 #include <Eina.h>
 #include <Evas.h>
 
+#if defined(TIZEN_ATK_SUPPORT)
+#include <Eldbus.h>
+#endif
+
 #include "command_line_efl.h"
 #include "eweb_context.h"
 #include "ewk_global_data.h"
@@ -118,10 +122,21 @@ int ewk_init(void)
     ERR("Could not init edje.");
     goto error_edje;
   }
+#if defined(TIZEN_ATK_SUPPORT)
+  if (!eldbus_init()) {
+    CRITICAL("Could not load eldbus");
+    goto error_eldbus;
+  }
+#endif
 
   _ewk_init_web_engine();
   return ++_ewkInitCount;
 
+#if defined(TIZEN_ATK_SUPPORT)
+error_eldbus:
+  edje_shutdown();
+#endif
+
 error_edje:
 #if defined(USE_WAYLAND)
 #if TIZEN_VERSION_AT_LEAST(5, 0, 0)
@@ -161,6 +176,9 @@ int ewk_shutdown(void)
 
   _ewk_shutdown_web_engine();
 
+#if defined(TIZEN_ATK_SUPPORT)
+  eldbus_shutdown();
+#endif
   edje_shutdown();
 #if defined(USE_WAYLAND)
 #if TIZEN_VERSION_AT_LEAST(5, 0, 0)