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();
}
eldbus_proxy_signal_handler_add(eldbus_proxy_, "ItemClicked",
ClipboardHelperEfl::OnClipboardItemClicked,
this);
+ g_eldbus_initialized = true;
}
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 {
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
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();
}
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))
#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;
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