From: ayush.k123 Date: Tue, 14 Feb 2023 09:17:24 +0000 (+0530) Subject: [M108 Migration] Migrate patches related to eldbus X-Git-Tag: submit/tizen/20230227.160252~61 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F81%2F288281%2F2;p=platform%2Fframework%2Fweb%2Fchromium-efl.git [M108 Migration] Migrate patches related to eldbus 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 --- diff --git a/packaging/chromium-efl.spec b/packaging/chromium-efl.spec index d16e310..83c4782 100644 --- a/packaging/chromium-efl.spec +++ b/packaging/chromium-efl.spec @@ -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) diff --git a/tizen_src/build/BUILD.gn b/tizen_src/build/BUILD.gn index e7c5d68f..16ed3dc 100644 --- a/tizen_src/build/BUILD.gn +++ b/tizen_src/build/BUILD.gn @@ -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" ] } diff --git a/tizen_src/chromium_impl/ui/base/clipboard/clipboard_helper_efl_wayland.cc b/tizen_src/chromium_impl/ui/base/clipboard/clipboard_helper_efl_wayland.cc index e906489..2599142a 100644 --- a/tizen_src/chromium_impl/ui/base/clipboard/clipboard_helper_efl_wayland.cc +++ b/tizen_src/chromium_impl/ui/base/clipboard/clipboard_helper_efl_wayland.cc @@ -25,12 +25,18 @@ const std::string::size_type kHTMLImageFromClipboardAppFrontLength = const std::string kHTMLImageFromClipboardAppEnd("\">"); const std::string kDataURIImagePrefix("\"\""); +static bool g_eldbus_initialized = false; } // namespace ClipboardHelperEfl* ClipboardHelperEfl::GetInstance() { return base::Singleton::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 { diff --git a/tizen_src/chromium_impl/ui/base/clipboard/clipboard_helper_efl_wayland.h b/tizen_src/chromium_impl/ui/base/clipboard/clipboard_helper_efl_wayland.h index 0143fdb..b5180c6 100644 --- a/tizen_src/chromium_impl/ui/base/clipboard/clipboard_helper_efl_wayland.h +++ b/tizen_src/chromium_impl/ui/base/clipboard/clipboard_helper_efl_wayland.h @@ -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; @@ -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; diff --git a/tizen_src/ewk/efl_integration/eweb_accessibility_util.cc b/tizen_src/ewk/efl_integration/eweb_accessibility_util.cc index 74e6c1d..2ac024f 100644 --- a/tizen_src/ewk/efl_integration/eweb_accessibility_util.cc +++ b/tizen_src/ewk/efl_integration/eweb_accessibility_util.cc @@ -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(data); + if (!obj) { + LOG(ERROR) << "obj is NULL"; + return; + } + + Eldbus_Proxy_Event_Property_Changed* ev = + static_cast(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(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::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)) diff --git a/tizen_src/ewk/efl_integration/eweb_accessibility_util.h b/tizen_src/ewk/efl_integration/eweb_accessibility_util.h index 33fcf40..339eb61 100644 --- a/tizen_src/ewk/efl_integration/eweb_accessibility_util.h +++ b/tizen_src/ewk/efl_integration/eweb_accessibility_util.h @@ -5,6 +5,8 @@ #ifndef EWEB_ACCESSIBILITY_UTIL_H #define EWEB_ACCESSIBILITY_UTIL_H +#include + #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; + + Eldbus_Object* eldbus_obj_ = nullptr; + Eldbus_Connection* eldbus_conn_ = nullptr; }; #endif // EWEB_ACCESSIBILITY_UTIL_H diff --git a/tizen_src/ewk/efl_integration/ewk_global_data.cc b/tizen_src/ewk/efl_integration/ewk_global_data.cc index ae28b71..1904ddf 100644 --- a/tizen_src/ewk/efl_integration/ewk_global_data.cc +++ b/tizen_src/ewk/efl_integration/ewk_global_data.cc @@ -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) @@ -45,6 +44,10 @@ 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(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 diff --git a/tizen_src/ewk/efl_integration/public/ewk_main.cc b/tizen_src/ewk/efl_integration/public/ewk_main.cc index bb61717..2a29423 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_main.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_main.cc @@ -27,6 +27,10 @@ #include #include +#if defined(TIZEN_ATK_SUPPORT) +#include +#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)