summaryrefslogtreecommitdiff
path: root/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceValue.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceValue.cpp')
-rw-r--r--Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceValue.cpp105
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;