| 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 0f770c279da58da514638bd7d4d43860096ed801..5d25c510e3258a7a990185f625cfc181eb1ad462 100644
|
| --- a/ui/accessibility/platform/atk_util_auralinux.cc
|
| +++ b/ui/accessibility/platform/atk_util_auralinux.cc
|
| @@ -5,17 +5,10 @@
|
| #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/location.h"
|
| #include "base/logging.h"
|
| #include "base/memory/singleton.h"
|
| #include "ui/accessibility/platform/atk_util_auralinux.h"
|
| @@ -23,49 +16,41 @@
|
|
|
| namespace {
|
|
|
| -typedef void (*gnome_accessibility_module_init)();
|
| -
|
| -const char kAccessibilityEnabled[] = "ACCESSIBILITY_ENABLED";
|
| -const char kAtkBridgePath[] = "gtk-2.0/modules/libatk-bridge.so";
|
| -const char kAtkBridgeSymbolName[] = "gnome_accessibility_module_init";
|
| -
|
| -gnome_accessibility_module_init g_accessibility_module_init = nullptr;
|
| -
|
| -bool AccessibilityModuleInitOnFileThread() {
|
| - // Try to load libatk-bridge.so.
|
| - base::FilePath atk_bridge_path(ATK_LIB_DIR);
|
| - atk_bridge_path = atk_bridge_path.Append(kAtkBridgePath);
|
| - 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 false;
|
| - }
|
| -
|
| - if (!g_module_symbol(bridge, kAtkBridgeSymbolName,
|
| - (gpointer *)&g_accessibility_module_init)) {
|
| - VLOG(1) << "Unable to get symbol pointer from " << atk_bridge_path.value();
|
| - // Just to make sure it's null;
|
| - g_accessibility_module_init = nullptr;
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| #if defined(USE_GCONF)
|
|
|
| const char kGnomeAccessibilityEnabledKey[] =
|
| "/desktop/gnome/interface/accessibility";
|
|
|
| -#elif defined(USE_DBUS)
|
| +bool ShouldEnableAccessibility() {
|
| + GConfClient* client = gconf_client_get_default();
|
| + if (!client) {
|
| + LOG(ERROR) << "gconf_client_get_default failed";
|
| + return false;
|
| + }
|
|
|
| -const char kServiceName[] = "org.a11y.Bus";
|
| -const char kObjectPath[] = "/org/a11y/bus";
|
| -const char kInterfaceName[] = "org.a11y.Status";
|
| -const char kPropertyName[] = "IsEnabled";
|
| + 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;
|
| + }
|
|
|
| -#endif
|
| + g_object_unref(client);
|
| + return value;
|
| +}
|
| +
|
| +#else // !defined(USE_GCONF)
|
| +
|
| +bool ShouldEnableAccessibility() {
|
| + // TODO(k.czech): implement this for non-GNOME desktops.
|
| + return false;
|
| +}
|
| +
|
| +#endif // defined(USE_GCONF)
|
|
|
| } // namespace
|
|
|
| @@ -154,135 +139,44 @@
|
| return Singleton<AtkUtilAuraLinux>::get();
|
| }
|
|
|
| -#if defined(USE_GCONF) || defined(USE_DBUS)
|
| -
|
| -AtkUtilAuraLinux::AtkUtilAuraLinux()
|
| - : is_enabled_(false) {
|
| -}
|
| -
|
| -#else
|
| -
|
| AtkUtilAuraLinux::AtkUtilAuraLinux() {
|
| }
|
|
|
| -#endif
|
| -
|
| void AtkUtilAuraLinux::Initialize(
|
| scoped_refptr<base::TaskRunner> init_task_runner) {
|
| + // TODO(k.czech): use |init_task_runner| to post a task to do the
|
| + // initialization rather than doing it on this thread.
|
| + // http://crbug.com/468112
|
|
|
| // Register our util class.
|
| g_type_class_unref(g_type_class_ref(ATK_UTIL_AURALINUX_TYPE));
|
|
|
| - init_task_runner->PostTaskAndReply(
|
| - FROM_HERE,
|
| - base::Bind(
|
| - &AtkUtilAuraLinux::CheckIfAccessibilityIsEnabledOnFileThread,
|
| - base::Unretained(this)),
|
| - base::Bind(
|
| - &AtkUtilAuraLinux::FinishAccessibilityInitOnUIThread,
|
| - base::Unretained(this)));
|
| + if (!ShouldEnableAccessibility()) {
|
| + VLOG(1) << "Will not enable ATK accessibility support.";
|
| + return;
|
| + }
|
| +
|
| + VLOG(1) << "Enabling ATK accessibility support.";
|
| +
|
| + // 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;
|
| + }
|
| +
|
| + // 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)();
|
| + }
|
| }
|
|
|
| AtkUtilAuraLinux::~AtkUtilAuraLinux() {
|
| }
|
|
|
| -void AtkUtilAuraLinux::CheckIfAccessibilityIsEnabledOnFileThread() {
|
| - char* enable_accessibility = getenv(kAccessibilityEnabled);
|
| - if ((enable_accessibility && atoi(enable_accessibility) == 1) ||
|
| - CheckPlatformAccessibilitySupportOnFileThread())
|
| - is_enabled_ = AccessibilityModuleInitOnFileThread();
|
| -}
|
| -
|
| -#if defined(USE_GCONF)
|
| -
|
| -bool AtkUtilAuraLinux::CheckPlatformAccessibilitySupportOnFileThread() {
|
| - GConfClient* client = gconf_client_get_default();
|
| - if (!client) {
|
| - LOG(ERROR) << "gconf_client_get_default failed";
|
| - return false;
|
| - }
|
| -
|
| - GError* error = nullptr;
|
| - bool is_enabled = gconf_client_get_bool(client,
|
| - kGnomeAccessibilityEnabledKey,
|
| - &error);
|
| -
|
| - g_object_unref(client);
|
| -
|
| - if (error) {
|
| - VLOG(1) << "gconf_client_get_bool failed";
|
| - g_error_free(error);
|
| - return false;
|
| - }
|
| -
|
| - return is_enabled;
|
| -}
|
| -
|
| -#elif defined(USE_DBUS)
|
| -
|
| -bool AtkUtilAuraLinux::CheckPlatformAccessibilitySupportOnFileThread() {
|
| - dbus::Bus::Options options;
|
| - scoped_refptr<dbus::Bus> dbus(new dbus::Bus(options));
|
| - dbus::ObjectProxy* object_proxy = dbus->GetObjectProxy(
|
| - kServiceName, dbus::ObjectPath(kObjectPath));
|
| -
|
| - DCHECK(object_proxy);
|
| -
|
| - dbus::MethodCall method_call(DBUS_INTERFACE_PROPERTIES, "Get");
|
| - dbus::MessageWriter message_writer(&method_call);
|
| - message_writer.AppendString(kInterfaceName);
|
| - message_writer.AppendString(kPropertyName);
|
| -
|
| - // TODO(k.czech) replace this with asynchronous call
|
| - scoped_ptr<dbus::Response> response(
|
| - object_proxy->CallMethodAndBlock(&method_call,
|
| - dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
|
| -
|
| - if (!response) {
|
| - LOG(ERROR) << "AtSpi: failed to get " << kPropertyName;
|
| - dbus->ShutdownAndBlock();
|
| - return false;
|
| - }
|
| -
|
| - // TODO(k.czech) handle case for at-spi2-core version 2.2.0/2.2.2
|
| - // org.a11y.Bus.Enabled returns variant struct with a bool instead of bool
|
| - bool is_enabled = false;
|
| - dbus::MessageReader reader(response.get());
|
| - if (!reader.PopVariantOfBool(&is_enabled))
|
| - LOG(ERROR) << "AtSpi: unexpected response";
|
| -
|
| - dbus->ShutdownAndBlock();
|
| -
|
| - return is_enabled;
|
| -}
|
| -
|
| -#else
|
| -
|
| -bool AtkUtilAuraLinux::CheckPlatformAccessibilitySupportOnFileThread() {
|
| - return false;
|
| -}
|
| -
|
| -#endif
|
| -
|
| -#if defined(USE_GCONF) || defined(USE_DBUS)
|
| -
|
| -void AtkUtilAuraLinux::FinishAccessibilityInitOnUIThread() {
|
| - if (!is_enabled_) {
|
| - VLOG(1) << "Will not enable ATK accessibility support.";
|
| - return;
|
| - }
|
| -
|
| - VLOG(1) << "Enabling ATK accessibility support.";
|
| - // Try to call gnome_accessibility_module_init from libatk-bridge.so.
|
| - DCHECK(g_accessibility_module_init);
|
| - g_accessibility_module_init();
|
| -}
|
| -
|
| -#else
|
| -
|
| -void AtkUtilAuraLinux::FinishAccessibilityInitOnUIThread() {
|
| -}
|
| -
|
| -#endif
|
| -
|
| } // namespace ui
|
|
|