Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(238)

Unified Diff: ui/accessibility/platform/atk_util_auralinux.cc

Issue 1028553003: Linux Aura accessibility is enabled only on GNOME desktops (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: One more correction Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/accessibility/platform/atk_util_auralinux.cc
diff --git a/ui/accessibility/platform/atk_util_auralinux.cc b/ui/accessibility/platform/atk_util_auralinux.cc
index 7fcaf219351289fe7eba1f670d7a6743a8b40ddc..fc076d278e8d9a83838af2eedbbaea7da70d23d9 100644
--- a/ui/accessibility/platform/atk_util_auralinux.cc
+++ b/ui/accessibility/platform/atk_util_auralinux.cc
@@ -5,12 +5,21 @@
#include <atk/atk.h>
#if defined(USE_GCONF)
#include <gconf/gconf-client.h>
+#elif defined(USE_DBUS)
+#include "dbus/bus.h"
+#include "dbus/message.h"
+#include "dbus/object_path.h"
+#include "dbus/object_proxy.h"
#endif
#include <glib-2.0/gmodule.h>
+#include "base/bind.h"
#include "base/files/file_path.h"
#include "base/logging.h"
#include "base/memory/singleton.h"
+#include "base/message_loop/message_loop.h"
+#include "base/message_loop/message_loop_proxy.h"
+#include "base/threading/thread.h"
#include "ui/accessibility/platform/atk_util_auralinux.h"
#include "ui/accessibility/platform/ax_platform_node_auralinux.h"
@@ -21,37 +30,34 @@ namespace {
const char kGnomeAccessibilityEnabledKey[] =
"/desktop/gnome/interface/accessibility";
-bool ShouldEnableAccessibility() {
- GConfClient* client = gconf_client_get_default();
- if (!client) {
- LOG(ERROR) << "gconf_client_get_default failed";
- return false;
- }
+#elif defined(USE_DBUS)
- GError* error = nullptr;
- gboolean value = gconf_client_get_bool(client,
- kGnomeAccessibilityEnabledKey,
- &error);
- if (error) {
- VLOG(1) << "gconf_client_get_bool failed";
- g_error_free(error);
- g_object_unref(client);
- return false;
- }
+const char kServiceName[] = "org.a11y.Bus";
+const char kObjectPath[] = "/org/a11y/bus";
+const char kInterfaceName[] = "org.a11y.Status";
+const char kPropertyName[] = "IsEnabled";
- g_object_unref(client);
- return value;
-}
+#endif
-#else // !defined(USE_GCONF)
+void accessibilityModuleInit() {
dmazzoni 2015/04/20 16:33:22 AccessibilityModuleInit
+ // Try to load libatk-bridge.so.
+ base::FilePath atk_bridge_path(ATK_LIB_DIR);
+ atk_bridge_path = atk_bridge_path.Append("gtk-2.0/modules/libatk-bridge.so");
+ GModule* bridge = g_module_open(atk_bridge_path.value().c_str(),
+ static_cast<GModuleFlags>(0));
+ if (!bridge) {
+ VLOG(1) << "Unable to open module " << atk_bridge_path.value();
+ return;
+ }
-bool ShouldEnableAccessibility() {
- // TODO(k.czech): implement this for non-GNOME desktops.
- return false;
+ // Try to call gnome_accessibility_module_init from libatk-bridge.so.
+ void (*gnome_accessibility_module_init)();
+ if (g_module_symbol(bridge, "gnome_accessibility_module_init",
+ (gpointer *)&gnome_accessibility_module_init)) {
+ (*gnome_accessibility_module_init)();
+ }
}
-#endif // defined(USE_GCONF)
-
} // namespace
G_BEGIN_DECLS
@@ -143,32 +149,124 @@ AtkUtilAuraLinux::AtkUtilAuraLinux() {
// Register our util class.
g_type_class_unref(g_type_class_ref(ATK_UTIL_AURALINUX_TYPE));
- if (!ShouldEnableAccessibility()) {
+ char* enableAccessibility = getenv("ACCESSIBILITY_ENABLED");
dmazzoni 2015/04/20 16:33:22 Use enable_accessibility for the variable name. M
+ if (enableAccessibility && atoi(enableAccessibility) == 1) {
+ accessibilityModuleInit();
+ return;
+ }
+
+ CheckIfAccessibilityIsEnabled();
+}
+
+AtkUtilAuraLinux::~AtkUtilAuraLinux() {
+}
+
+#if defined(USE_GCONF) || defined(USE_DBUS)
+
+void AtkUtilAuraLinux::CheckIfAccessibilityIsEnabled() {
+ isEnabled = false;
+
+ accessibility_init_thread_.reset(
+ new base::Thread("Accessibility Init Thread"));
+ base::Thread::Options threadOptions(base::MessageLoop::Type::TYPE_IO, 0);
dmazzoni 2015/04/20 16:33:22 thread_options
+ accessibility_init_thread_->StartWithOptions(threadOptions);
+ accessibility_init_thread_->task_runner()->PostTaskAndReply(
+ FROM_HERE,
+ base::Bind(&AtkUtilAuraLinux::CheckPlatformAccessibilitySupport,
+ base::Unretained(this)),
+ base::Bind(&AtkUtilAuraLinux::OnStopAccessibilityThread,
+ base::Unretained(this)));
+}
+
+void AtkUtilAuraLinux::OnStopAccessibilityThread() {
+ accessibility_init_thread_.reset();
+ if (!isEnabled) {
VLOG(1) << "Will not enable ATK accessibility support.";
return;
}
VLOG(1) << "Enabling ATK accessibility support.";
+ accessibilityModuleInit();
+}
- // Try to load libatk-bridge.so.
- base::FilePath atk_bridge_path(ATK_LIB_DIR);
- atk_bridge_path = atk_bridge_path.Append("gtk-2.0/modules/libatk-bridge.so");
- GModule* bridge = g_module_open(atk_bridge_path.value().c_str(),
- static_cast<GModuleFlags>(0));
- if (!bridge) {
- VLOG(1) << "Unable to open module " << atk_bridge_path.value();
+#else
+
+void AtkUtilAuraLinux::CheckIfAccessibilityIsEnabled() {
+}
+
+void AtkUtilAuraLinux::OnStopAccessibilityThread() {
+}
+
+#endif
+
+#if defined(USE_GCONF)
+void AtkUtilAuraLinux::CheckPlatformAccessibilitySupport() {
+ DCHECK(accessibility_init_thread_->task_runner()->RunsTasksOnCurrentThread());
+
+ GConfClient* client = gconf_client_get_default();
+ if (!client) {
+ LOG(ERROR) << "gconf_client_get_default failed";
return;
}
- // Try to call gnome_accessibility_module_init from libatk-bridge.so.
- void (*gnome_accessibility_module_init)();
- if (g_module_symbol(bridge, "gnome_accessibility_module_init",
- (gpointer *)&gnome_accessibility_module_init)) {
- (*gnome_accessibility_module_init)();
+ GError* error = nullptr;
+ isEnabled = gconf_client_get_bool(client,
+ kGnomeAccessibilityEnabledKey,
dmazzoni 2015/04/20 16:33:22 indentation
+ &error);
+
+ g_object_unref(client);
+
+ if (error) {
+ VLOG(1) << "gconf_client_get_bool failed";
+ g_error_free(error);
+ return;
}
}
-AtkUtilAuraLinux::~AtkUtilAuraLinux() {
+#elif defined(USE_DBUS)
+
+void AtkUtilAuraLinux::CheckPlatformAccessibilitySupport() {
+ DCHECK(accessibility_init_thread_->task_runner()->RunsTasksOnCurrentThread());
+
+ dbus::Bus::Options options;
+ options.dbus_task_runner = accessibility_init_thread_->task_runner();
+
+ scoped_refptr<dbus::Bus> dbus(new dbus::Bus(options));
+ dbus::ObjectProxy* objectProxy = dbus->GetObjectProxy(
dmazzoni 2015/04/20 16:33:22 object_proxy
+ kServiceName, dbus::ObjectPath(kObjectPath));
+
+ DCHECK(objectProxy);
+
+ dbus::MethodCall methodCall(DBUS_INTERFACE_PROPERTIES, "Get");
+ dbus::MessageWriter messageWriter(&methodCall);
+ messageWriter.AppendString(kInterfaceName);
+ messageWriter.AppendString(kPropertyName);
+
+ scoped_ptr<dbus::Response> response(
+ objectProxy->CallMethodAndBlock(&methodCall,
+ dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
+
+ if (!response) {
+ LOG(ERROR) << "AtSpi: failed to get " << kPropertyName;
+ dbus->ShutdownAndBlock();
+ return;
+ }
+
+ dbus::MessageReader reader(response.get());
+ if (!reader.PopVariantOfBool(&isEnabled)) {
+ LOG(ERROR) << "AtSpi: unexpected response";
+ dbus->ShutdownAndBlock();
+ return;
+ }
+
+ dbus->ShutdownAndBlock();
}
+#else
+
+void AtkUtilAuraLinux::CheckPlatformAccessibilitySupport() {
+}
+
+#endif
+
} // namespace ui

Powered by Google App Engine
This is Rietveld 408576698