diff options
Diffstat (limited to 'Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceValue.cpp')
-rw-r--r-- | Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceValue.cpp | 105 |
1 files changed, 86 insertions, 19 deletions
diff --git a/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceValue.cpp b/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceValue.cpp index 19c6cf003..ac582fa66 100644 --- a/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceValue.cpp +++ b/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceValue.cpp @@ -26,6 +26,7 @@ #include "HTMLNames.h" #include "WebKitAccessibleUtil.h" #include "WebKitAccessibleWrapperAtk.h" +#include <wtf/text/CString.h> using namespace WebCore; @@ -37,6 +38,83 @@ static AccessibilityObject* core(AtkValue* value) return webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(value)); } +static bool webkitAccessibleSetNewValue(AtkValue* coreValue, const gdouble newValue) +{ + AccessibilityObject* coreObject = core(coreValue); + if (!coreObject->canSetValueAttribute()) + return FALSE; + + // Check value against range limits + double value; + value = std::max(static_cast<double>(coreObject->minValueForRange()), newValue); + value = std::min(static_cast<double>(coreObject->maxValueForRange()), newValue); + + coreObject->setValue(String::number(value)); + return TRUE; +} + +static float webkitAccessibleGetIncrementValue(AccessibilityObject* coreObject) +{ + if (!coreObject->getAttribute(HTMLNames::stepAttr).isEmpty()) + return coreObject->stepValueForRange(); + + // If 'step' attribute is not defined, WebCore assumes a 5% of the + // range between minimum and maximum values. Implicit value of step should be one or larger. + float step = (coreObject->maxValueForRange() - coreObject->minValueForRange()) * 0.05; + return step < 1 ? 1 : step; +} + +#if ATK_CHECK_VERSION(2,11,92) +static void webkitAccessibleGetValueAndText(AtkValue* value, gdouble* currentValue, gchar** alternativeText) +{ + g_return_if_fail(ATK_VALUE(value)); + returnIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(value)); + + AccessibilityObject* coreObject = core(value); + if (!coreObject) + return; + + if (currentValue) + *currentValue = coreObject->valueForRange(); + if (alternativeText) + *alternativeText = g_strdup_printf("%s", coreObject->valueDescription().utf8().data()); +} + +static double webkitAccessibleGetIncrement(AtkValue* value) +{ + g_return_val_if_fail(ATK_VALUE(value), 0); + returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(value), 0); + + AccessibilityObject* coreObject = core(value); + if (!coreObject) + return 0; + + return webkitAccessibleGetIncrementValue(coreObject); +} + +static void webkitAccessibleSetValue(AtkValue* value, const gdouble newValue) +{ + g_return_if_fail(ATK_VALUE(value)); + returnIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(value)); + + webkitAccessibleSetNewValue(value, newValue); +} + +static AtkRange* webkitAccessibleGetRange(AtkValue* value) +{ + g_return_val_if_fail(ATK_VALUE(value), nullptr); + returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(value), nullptr); + + AccessibilityObject* coreObject = core(value); + if (!coreObject) + return nullptr; + + gdouble minValue = coreObject->minValueForRange(); + gdouble maxValue = coreObject->maxValueForRange(); + gchar* valueDescription = g_strdup_printf("%s", coreObject->valueDescription().utf8().data()); + return atk_range_new(minValue, maxValue, valueDescription); +} +#endif static void webkitAccessibleValueGetCurrentValue(AtkValue* value, GValue* gValue) { g_return_if_fail(ATK_VALUE(value)); @@ -92,16 +170,7 @@ static gboolean webkitAccessibleValueSetCurrentValue(AtkValue* value, const GVal else return FALSE; - AccessibilityObject* coreObject = core(value); - if (!coreObject->canSetValueAttribute()) - return FALSE; - - // Check value against range limits - newValue = std::max(static_cast<double>(coreObject->minValueForRange()), newValue); - newValue = std::min(static_cast<double>(coreObject->maxValueForRange()), newValue); - - coreObject->setValue(String::number(newValue)); - return TRUE; + return webkitAccessibleSetNewValue(value, newValue); } static void webkitAccessibleValueGetMinimumIncrement(AtkValue* value, GValue* gValue) @@ -113,19 +182,17 @@ static void webkitAccessibleValueGetMinimumIncrement(AtkValue* value, GValue* gV g_value_init(gValue, G_TYPE_FLOAT); AccessibilityObject* coreObject = core(value); - if (!coreObject->getAttribute(HTMLNames::stepAttr).isEmpty()) { - g_value_set_float(gValue, coreObject->stepValueForRange()); - return; - } - - // If 'step' attribute is not defined, WebCore assumes a 5% of the - // range between minimum and maximum values. Implicit value of step should be one or larger. - float step = (coreObject->maxValueForRange() - coreObject->minValueForRange()) * 0.05; - g_value_set_float(gValue, step < 1 ? 1 : step); + g_value_set_float(gValue, webkitAccessibleGetIncrementValue(coreObject)); } void webkitAccessibleValueInterfaceInit(AtkValueIface* iface) { +#if ATK_CHECK_VERSION(2,11,92) + iface->get_value_and_text = webkitAccessibleGetValueAndText; + iface->get_increment = webkitAccessibleGetIncrement; + iface->set_value = webkitAccessibleSetValue; + iface->get_range = webkitAccessibleGetRange; +#endif iface->get_current_value = webkitAccessibleValueGetCurrentValue; iface->get_maximum_value = webkitAccessibleValueGetMaximumValue; iface->get_minimum_value = webkitAccessibleValueGetMinimumValue; |