summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp')
-rw-r--r--Source/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp104
1 files changed, 84 insertions, 20 deletions
diff --git a/Source/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp b/Source/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp
index 1d23612..7dff2e3 100644
--- a/Source/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp
+++ b/Source/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp
@@ -158,6 +158,11 @@ static AccessibilityObject* core(AtkDocument* document)
return core(ATK_OBJECT(document));
}
+static AccessibilityObject* core(AtkValue* value)
+{
+ return core(ATK_OBJECT(value));
+}
+
static gchar* webkit_accessible_text_get_text(AtkText* text, gint startOffset, gint endOffset);
static const gchar* webkit_accessible_get_name(AtkObject* object)
@@ -471,6 +476,14 @@ static AtkRole atkRole(AccessibilityRole role)
case ListItemRole:
case ListBoxOptionRole:
return ATK_ROLE_LIST_ITEM;
+ case ParagraphRole:
+ return ATK_ROLE_PARAGRAPH;
+ case LabelRole:
+ return ATK_ROLE_LABEL;
+ case DivRole:
+ return ATK_ROLE_SECTION;
+ case FormRole:
+ return ATK_ROLE_FORM;
default:
return ATK_ROLE_UNKNOWN;
}
@@ -478,31 +491,16 @@ static AtkRole atkRole(AccessibilityRole role)
static AtkRole webkit_accessible_get_role(AtkObject* object)
{
- AccessibilityObject* axObject = core(object);
+ AccessibilityObject* coreObject = core(object);
- if (!axObject)
+ if (!coreObject)
return ATK_ROLE_UNKNOWN;
- // WebCore does not know about paragraph role, label role, or section role
- if (axObject->isAccessibilityRenderObject()) {
- Node* node = static_cast<AccessibilityRenderObject*>(axObject)->renderer()->node();
- if (node) {
- if (node->hasTagName(HTMLNames::pTag))
- return ATK_ROLE_PARAGRAPH;
- if (node->hasTagName(HTMLNames::labelTag))
- return ATK_ROLE_LABEL;
- if (node->hasTagName(HTMLNames::divTag))
- return ATK_ROLE_SECTION;
- if (node->hasTagName(HTMLNames::formTag))
- return ATK_ROLE_FORM;
- }
- }
-
// Note: Why doesn't WebCore have a password field for this
- if (axObject->isPasswordField())
+ if (coreObject->isPasswordField())
return ATK_ROLE_PASSWORD_TEXT;
- return atkRole(axObject->roleValue());
+ return atkRole(coreObject->roleValue());
}
static bool selectionBelongsToObject(AccessibilityObject* coreObject, VisibleSelection& selection)
@@ -2301,6 +2299,63 @@ static void atk_document_interface_init(AtkDocumentIface* iface)
iface->get_document_locale = webkit_accessible_document_get_locale;
}
+
+static void webkitAccessibleValueGetCurrentValue(AtkValue* value, GValue* gValue)
+{
+ memset(gValue, 0, sizeof(GValue));
+ g_value_init(gValue, G_TYPE_DOUBLE);
+ g_value_set_double(gValue, core(value)->valueForRange());
+}
+
+static void webkitAccessibleValueGetMaximumValue(AtkValue* value, GValue* gValue)
+{
+ memset(gValue, 0, sizeof(GValue));
+ g_value_init(gValue, G_TYPE_DOUBLE);
+ g_value_set_double(gValue, core(value)->maxValueForRange());
+}
+
+static void webkitAccessibleValueGetMinimumValue(AtkValue* value, GValue* gValue)
+{
+ memset(gValue, 0, sizeof(GValue));
+ g_value_init(gValue, G_TYPE_DOUBLE);
+ g_value_set_double(gValue, core(value)->minValueForRange());
+}
+
+static gboolean webkitAccessibleValueSetCurrentValue(AtkValue* value, const GValue* gValue)
+{
+ if (!G_VALUE_HOLDS_DOUBLE(gValue) && !G_VALUE_HOLDS_INT(gValue))
+ return FALSE;
+
+ AccessibilityObject* coreObject = core(value);
+ if (!coreObject->canSetValueAttribute())
+ return FALSE;
+
+ if (G_VALUE_HOLDS_DOUBLE(gValue))
+ coreObject->setValue(String::number(g_value_get_double(gValue)));
+ else
+ coreObject->setValue(String::number(g_value_get_int(gValue)));
+
+ return TRUE;
+}
+
+static void webkitAccessibleValueGetMinimumIncrement(AtkValue* value, GValue* gValue)
+{
+ memset(gValue, 0, sizeof(GValue));
+ g_value_init(gValue, G_TYPE_DOUBLE);
+
+ // There's not such a thing in the WAI-ARIA specification, thus return zero.
+ g_value_set_double(gValue, 0.0);
+}
+
+static void atkValueInterfaceInit(AtkValueIface* iface)
+{
+ iface->get_current_value = webkitAccessibleValueGetCurrentValue;
+ iface->get_maximum_value = webkitAccessibleValueGetMaximumValue;
+ iface->get_minimum_value = webkitAccessibleValueGetMinimumValue;
+ iface->set_current_value = webkitAccessibleValueSetCurrentValue;
+ iface->get_minimum_increment = webkitAccessibleValueGetMinimumIncrement;
+}
+
static const GInterfaceInfo AtkInterfacesInitFunctions[] = {
{(GInterfaceInitFunc)atk_action_interface_init,
(GInterfaceFinalizeFunc) 0, 0},
@@ -2321,6 +2376,8 @@ static const GInterfaceInfo AtkInterfacesInitFunctions[] = {
{(GInterfaceInitFunc)atkHyperlinkImplInterfaceInit,
(GInterfaceFinalizeFunc) 0, 0},
{(GInterfaceInitFunc)atk_document_interface_init,
+ (GInterfaceFinalizeFunc) 0, 0},
+ {(GInterfaceInitFunc)atkValueInterfaceInit,
(GInterfaceFinalizeFunc) 0, 0}
};
@@ -2334,7 +2391,8 @@ enum WAIType {
WAI_TABLE,
WAI_HYPERTEXT,
WAI_HYPERLINK,
- WAI_DOCUMENT
+ WAI_DOCUMENT,
+ WAI_VALUE,
};
static GType GetAtkInterfaceTypeFromWAIType(WAIType type)
@@ -2360,6 +2418,8 @@ static GType GetAtkInterfaceTypeFromWAIType(WAIType type)
return ATK_TYPE_HYPERLINK_IMPL;
case WAI_DOCUMENT:
return ATK_TYPE_DOCUMENT;
+ case WAI_VALUE:
+ return ATK_TYPE_VALUE;
}
return G_TYPE_INVALID;
@@ -2431,6 +2491,10 @@ static guint16 getInterfaceMaskFromObject(AccessibilityObject* coreObject)
if (role == WebAreaRole)
interfaceMask |= 1 << WAI_DOCUMENT;
+ // Value
+ if (role == SliderRole)
+ interfaceMask |= 1 << WAI_VALUE;
+
return interfaceMask;
}