| Index: content/browser/accessibility/browser_accessibility_auralinux.cc
|
| diff --git a/content/browser/accessibility/browser_accessibility_auralinux.cc b/content/browser/accessibility/browser_accessibility_auralinux.cc
|
| index 2cd0ea703f580e1955510849f878d35f9b083066..d3a41e923532d32d49e51389616d0b2ce822349c 100644
|
| --- a/content/browser/accessibility/browser_accessibility_auralinux.cc
|
| +++ b/content/browser/accessibility/browser_accessibility_auralinux.cc
|
| @@ -21,6 +21,90 @@ static BrowserAccessibilityAuraLinux* ToBrowserAccessibilityAuraLinux(
|
| }
|
|
|
| //
|
| +// AtkAction interface.
|
| +//
|
| +
|
| +static BrowserAccessibilityAuraLinux* ToBrowserAccessibilityAuraLinux(
|
| + AtkAction* atk_action) {
|
| + if (!IS_BROWSER_ACCESSIBILITY(atk_action))
|
| + return NULL;
|
| +
|
| + return ToBrowserAccessibilityAuraLinux(BROWSER_ACCESSIBILITY(atk_action));
|
| +}
|
| +
|
| +static gboolean browser_accessibility_do_action(AtkAction* atk_action,
|
| + gint index) {
|
| + g_return_val_if_fail(ATK_IS_ACTION(atk_action), FALSE);
|
| + g_return_val_if_fail(!index, FALSE);
|
| +
|
| + BrowserAccessibilityAuraLinux* obj =
|
| + ToBrowserAccessibilityAuraLinux(atk_action);
|
| + if (!obj)
|
| + return FALSE;
|
| +
|
| + obj->manager()->DoDefaultAction(*obj);
|
| +
|
| + return TRUE;
|
| +}
|
| +
|
| +static gint browser_accessibility_get_n_actions(AtkAction* atk_action) {
|
| + g_return_val_if_fail(ATK_IS_ACTION(atk_action), 0);
|
| +
|
| + BrowserAccessibilityAuraLinux* obj =
|
| + ToBrowserAccessibilityAuraLinux(atk_action);
|
| + if (!obj)
|
| + return 0;
|
| +
|
| + return 1;
|
| +}
|
| +
|
| +static const gchar* browser_accessibility_get_description(AtkAction* atk_action,
|
| + gint) {
|
| + g_return_val_if_fail(ATK_IS_ACTION(atk_action), 0);
|
| + BrowserAccessibilityAuraLinux* obj =
|
| + ToBrowserAccessibilityAuraLinux(atk_action);
|
| + if (!obj)
|
| + return 0;
|
| +
|
| + return 0;
|
| +}
|
| +
|
| +static const gchar* browser_accessibility_get_name(AtkAction* atk_action,
|
| + gint index) {
|
| + g_return_val_if_fail(ATK_IS_ACTION(atk_action), 0);
|
| + g_return_val_if_fail(!index, 0);
|
| + BrowserAccessibilityAuraLinux* obj =
|
| + ToBrowserAccessibilityAuraLinux(atk_action);
|
| + if (!obj)
|
| + return 0;
|
| +
|
| + return obj->GetStringAttribute(ui::AX_ATTR_ACTION).c_str();
|
| +}
|
| +
|
| +static const gchar* browser_accessibility_get_keybinding(AtkAction* atk_action,
|
| + gint index) {
|
| + g_return_val_if_fail(ATK_IS_ACTION(atk_action), 0);
|
| + g_return_val_if_fail(!index, 0);
|
| + BrowserAccessibilityAuraLinux* obj =
|
| + ToBrowserAccessibilityAuraLinux(atk_action);
|
| + if (!obj)
|
| + return 0;
|
| +
|
| + return obj->GetStringAttribute(ui::AX_ATTR_ACCESS_KEY).c_str();
|
| +}
|
| +
|
| +static void ActionInterfaceInit(AtkActionIface* iface) {
|
| + iface->do_action = browser_accessibility_do_action;
|
| + iface->get_n_actions = browser_accessibility_get_n_actions;
|
| + iface->get_description = browser_accessibility_get_description;
|
| + iface->get_name = browser_accessibility_get_name;
|
| + iface->get_keybinding = browser_accessibility_get_keybinding;
|
| +}
|
| +
|
| +static const GInterfaceInfo ActionInfo = {
|
| + reinterpret_cast<GInterfaceInitFunc>(ActionInterfaceInit), 0, 0};
|
| +
|
| +//
|
| // AtkComponent interface.
|
| //
|
|
|
| @@ -106,6 +190,85 @@ static const GInterfaceInfo ComponentInfo = {
|
| 0};
|
|
|
| //
|
| +// AtkDocument interface.
|
| +//
|
| +
|
| +static BrowserAccessibilityAuraLinux* ToBrowserAccessibilityAuraLinux(
|
| + AtkDocument* atk_doc) {
|
| + if (!IS_BROWSER_ACCESSIBILITY(atk_doc))
|
| + return NULL;
|
| +
|
| + return ToBrowserAccessibilityAuraLinux(BROWSER_ACCESSIBILITY(atk_doc));
|
| +}
|
| +
|
| +static const gchar* GetDocumentAttributeValue(
|
| + BrowserAccessibilityAuraLinux* obj,
|
| + const gchar* attribute) {
|
| + if (!g_ascii_strcasecmp(attribute, "DocType"))
|
| + return obj->GetStringAttribute(ui::AX_ATTR_DOC_DOCTYPE).c_str();
|
| + else if (!g_ascii_strcasecmp(attribute, "MimeType"))
|
| + return obj->GetStringAttribute(ui::AX_ATTR_DOC_MIMETYPE).c_str();
|
| + else if (!g_ascii_strcasecmp(attribute, "Title"))
|
| + return obj->GetStringAttribute(ui::AX_ATTR_DOC_TITLE).c_str();
|
| + else if (!g_ascii_strcasecmp(attribute, "URI"))
|
| + return obj->GetStringAttribute(ui::AX_ATTR_DOC_URL).c_str();
|
| +
|
| + return 0;
|
| +}
|
| +
|
| +AtkAttributeSet* SetAtkAttributeSet(AtkAttributeSet* attribute_set,
|
| + const char* name,
|
| + const char* value) {
|
| + AtkAttribute* attribute =
|
| + static_cast<AtkAttribute*>(g_malloc(sizeof(AtkAttribute)));
|
| + attribute->name = g_strdup(name);
|
| + attribute->value = g_strdup(value);
|
| + attribute_set = g_slist_prepend(attribute_set, attribute);
|
| + return attribute_set;
|
| +}
|
| +
|
| +static const gchar* browser_accessibility_get_attribute_value(
|
| + AtkDocument* atk_doc,
|
| + const gchar* attribute) {
|
| + g_return_val_if_fail(ATK_IS_DOCUMENT(atk_doc), 0);
|
| + BrowserAccessibilityAuraLinux* obj = ToBrowserAccessibilityAuraLinux(atk_doc);
|
| + if (!obj)
|
| + return 0;
|
| +
|
| + return GetDocumentAttributeValue(obj, attribute);
|
| +}
|
| +
|
| +static AtkAttributeSet* browser_accessibility_get_attributes(
|
| + AtkDocument* atk_doc) {
|
| + g_return_val_if_fail(ATK_IS_DOCUMENT(atk_doc), 0);
|
| + BrowserAccessibilityAuraLinux* obj = ToBrowserAccessibilityAuraLinux(atk_doc);
|
| + if (!obj)
|
| + return 0;
|
| +
|
| + AtkAttributeSet* attribute_set = 0;
|
| + const gchar* doc_attributes[] = {"DocType", "MimeType", "Title", "URI"};
|
| + const gchar* value = 0;
|
| +
|
| + for (unsigned i = 0; i < G_N_ELEMENTS(doc_attributes); i++) {
|
| + value = GetDocumentAttributeValue(obj, doc_attributes[i]);
|
| + if (value)
|
| + attribute_set =
|
| + SetAtkAttributeSet(attribute_set, doc_attributes[i], value);
|
| + }
|
| +
|
| + return attribute_set;
|
| +}
|
| +
|
| +static void DocumentInterfaceInit(AtkDocumentIface* iface) {
|
| + iface->get_document_attribute_value =
|
| + browser_accessibility_get_attribute_value;
|
| + iface->get_document_attributes = browser_accessibility_get_attributes;
|
| +}
|
| +
|
| +static const GInterfaceInfo DocumentInfo = {
|
| + reinterpret_cast<GInterfaceInitFunc>(DocumentInterfaceInit), 0, 0};
|
| +
|
| +//
|
| // AtkValue interface.
|
| //
|
|
|
| @@ -411,12 +574,22 @@ static int GetInterfaceMaskFromObject(BrowserAccessibilityAuraLinux* obj) {
|
| // Component interface is always supported.
|
| interface_mask |= 1 << ATK_COMPONENT_INTERFACE;
|
|
|
| + // Action interface is basic one. It just relays on executing default action
|
| + // for each object.
|
| + interface_mask |= 1 << ATK_ACTION_INTERFACE;
|
| +
|
| + // Value Interface
|
| int role = obj->GetRole();
|
| if (role == ui::AX_ROLE_PROGRESS_INDICATOR ||
|
| role == ui::AX_ROLE_SCROLL_BAR || role == ui::AX_ROLE_SLIDER) {
|
| interface_mask |= 1 << ATK_VALUE_INTERFACE;
|
| }
|
|
|
| + // Document Interface
|
| + if (role == ui::AX_ROLE_DOCUMENT || role == ui::AX_ROLE_ROOT_WEB_AREA ||
|
| + role == ui::AX_ROLE_WEB_AREA)
|
| + interface_mask |= 1 << ATK_DOCUMENT_INTERFACE;
|
| +
|
| return interface_mask;
|
| }
|
|
|
| @@ -443,8 +616,12 @@ static GType GetAccessibilityTypeFromObject(
|
|
|
| type = g_type_register_static(BROWSER_ACCESSIBILITY_TYPE, atk_type_name,
|
| &type_info, GTypeFlags(0));
|
| + if (interface_mask & (1 << ATK_ACTION_INTERFACE))
|
| + g_type_add_interface_static(type, ATK_TYPE_ACTION, &ActionInfo);
|
| if (interface_mask & (1 << ATK_COMPONENT_INTERFACE))
|
| g_type_add_interface_static(type, ATK_TYPE_COMPONENT, &ComponentInfo);
|
| + if (interface_mask & (1 << ATK_DOCUMENT_INTERFACE))
|
| + g_type_add_interface_static(type, ATK_TYPE_DOCUMENT, &DocumentInfo);
|
| if (interface_mask & (1 << ATK_VALUE_INTERFACE))
|
| g_type_add_interface_static(type, ATK_TYPE_VALUE, &ValueInfo);
|
|
|
|
|