Commit 2181d88d authored by k.czech's avatar k.czech Committed by Commit bot

Initialize Linux Aura accessibility on the file thread.

It's a part of larger task to move the whole initialization
on the separate thread. Previous CL introduced some hard to
track issues and broke some perf bots. This CL is first part
to make sure bots are fine. It moves gconf related
initialization on the file thread.

BUG=472183, 468989, 468112

Review URL: https://codereview.chromium.org/1640273002

Cr-Commit-Position: refs/heads/master@{#372074}
parent 2256ca23
...@@ -8,7 +8,9 @@ ...@@ -8,7 +8,9 @@
#endif #endif
#include <glib-2.0/gmodule.h> #include <glib-2.0/gmodule.h>
#include "base/bind.h"
#include "base/files/file_path.h" #include "base/files/file_path.h"
#include "base/location.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/memory/singleton.h" #include "base/memory/singleton.h"
#include "ui/accessibility/platform/atk_util_auralinux.h" #include "ui/accessibility/platform/atk_util_auralinux.h"
...@@ -16,41 +18,42 @@ ...@@ -16,41 +18,42 @@
namespace { namespace {
#if defined(USE_GCONF) typedef void (*gnome_accessibility_module_init)();
const char kGnomeAccessibilityEnabledKey[] = const char kAtkBridgePath[] = "gtk-2.0/modules/libatk-bridge.so";
"/desktop/gnome/interface/accessibility"; const char kAtkBridgeSymbolName[] = "gnome_accessibility_module_init";
bool ShouldEnableAccessibility() { gnome_accessibility_module_init g_accessibility_module_init = nullptr;
GConfClient* client = gconf_client_get_default();
if (!client) { bool AccessibilityModuleInitOnFileThread() {
LOG(ERROR) << "gconf_client_get_default failed"; // 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; return false;
} }
GError* error = nullptr; if (!g_module_symbol(bridge, kAtkBridgeSymbolName,
gboolean value = gconf_client_get_bool(client, (gpointer *)&g_accessibility_module_init)) {
kGnomeAccessibilityEnabledKey, VLOG(1) << "Unable to get symbol pointer from " << atk_bridge_path.value();
&error); // Just to make sure it's null;
if (error) { g_accessibility_module_init = nullptr;
VLOG(1) << "gconf_client_get_bool failed";
g_error_free(error);
g_object_unref(client);
return false; return false;
} }
g_object_unref(client); return true;
return value;
} }
#else // !defined(USE_GCONF) #if defined(USE_GCONF)
bool ShouldEnableAccessibility() { const char kAccessibilityEnabled[] = "ACCESSIBILITY_ENABLED";
// TODO(k.czech): implement this for non-GNOME desktops. const char kGnomeAccessibilityEnabledKey[] =
return false; "/desktop/gnome/interface/accessibility";
}
#endif // defined(USE_GCONF) #endif
} // namespace } // namespace
...@@ -139,44 +142,88 @@ AtkUtilAuraLinux* AtkUtilAuraLinux::GetInstance() { ...@@ -139,44 +142,88 @@ AtkUtilAuraLinux* AtkUtilAuraLinux::GetInstance() {
return base::Singleton<AtkUtilAuraLinux>::get(); return base::Singleton<AtkUtilAuraLinux>::get();
} }
#if defined(USE_GCONF)
AtkUtilAuraLinux::AtkUtilAuraLinux()
: is_enabled_(false) {
}
#else
AtkUtilAuraLinux::AtkUtilAuraLinux() { AtkUtilAuraLinux::AtkUtilAuraLinux() {
} }
#endif // defined(USE_GCONF)
void AtkUtilAuraLinux::Initialize( void AtkUtilAuraLinux::Initialize(
scoped_refptr<base::TaskRunner> /* init_task_runner */) { 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. // Register our util class.
g_type_class_unref(g_type_class_ref(ATK_UTIL_AURALINUX_TYPE)); g_type_class_unref(g_type_class_ref(ATK_UTIL_AURALINUX_TYPE));
if (!ShouldEnableAccessibility()) { init_task_runner->PostTaskAndReply(
VLOG(1) << "Will not enable ATK accessibility support."; FROM_HERE,
return; base::Bind(
&AtkUtilAuraLinux::CheckIfAccessibilityIsEnabledOnFileThread,
base::Unretained(this)),
base::Bind(
&AtkUtilAuraLinux::FinishAccessibilityInitOnUIThread,
base::Unretained(this)));
}
AtkUtilAuraLinux::~AtkUtilAuraLinux() {
}
#if defined(USE_GCONF)
void AtkUtilAuraLinux::CheckIfAccessibilityIsEnabledOnFileThread() {
char* enable_accessibility = getenv(kAccessibilityEnabled);
if ((enable_accessibility && atoi(enable_accessibility) == 1) ||
CheckPlatformAccessibilitySupportOnFileThread())
is_enabled_ = AccessibilityModuleInitOnFileThread();
}
bool AtkUtilAuraLinux::CheckPlatformAccessibilitySupportOnFileThread() {
GConfClient* client = gconf_client_get_default();
if (!client) {
LOG(ERROR) << "gconf_client_get_default failed";
return false;
} }
VLOG(1) << "Enabling ATK accessibility support."; GError* error = nullptr;
bool is_enabled = gconf_client_get_bool(client,
kGnomeAccessibilityEnabledKey,
&error);
// Try to load libatk-bridge.so. g_object_unref(client);
base::FilePath atk_bridge_path(ATK_LIB_DIR);
atk_bridge_path = atk_bridge_path.Append("gtk-2.0/modules/libatk-bridge.so"); if (error) {
GModule* bridge = g_module_open(atk_bridge_path.value().c_str(), VLOG(1) << "gconf_client_get_bool failed";
static_cast<GModuleFlags>(0)); g_error_free(error);
if (!bridge) { return false;
VLOG(1) << "Unable to open module " << atk_bridge_path.value();
return;
} }
// Try to call gnome_accessibility_module_init from libatk-bridge.so. return is_enabled;
void (*gnome_accessibility_module_init)(); }
if (g_module_symbol(bridge, "gnome_accessibility_module_init",
(gpointer *)&gnome_accessibility_module_init)) { void AtkUtilAuraLinux::FinishAccessibilityInitOnUIThread() {
(*gnome_accessibility_module_init)(); if (!is_enabled_) {
VLOG(1) << "Will not enable ATK accessibility support.";
return;
} }
DCHECK(g_accessibility_module_init);
g_accessibility_module_init();
} }
AtkUtilAuraLinux::~AtkUtilAuraLinux() { #else
void AtkUtilAuraLinux::CheckIfAccessibilityIsEnabledOnFileThread() {
}
void AtkUtilAuraLinux::FinishAccessibilityInitOnUIThread() {
} }
#endif // defined(USE_GCONF)
} // namespace ui } // namespace ui
...@@ -29,6 +29,14 @@ class AtkUtilAuraLinux { ...@@ -29,6 +29,14 @@ class AtkUtilAuraLinux {
private: private:
friend struct base::DefaultSingletonTraits<AtkUtilAuraLinux>; friend struct base::DefaultSingletonTraits<AtkUtilAuraLinux>;
void CheckIfAccessibilityIsEnabledOnFileThread();
bool CheckPlatformAccessibilitySupportOnFileThread();
void FinishAccessibilityInitOnUIThread();
#if defined(USE_GCONF)
bool is_enabled_;
#endif
}; };
} // namespace ui } // namespace ui
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment