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.cpp73
1 files changed, 55 insertions, 18 deletions
diff --git a/Source/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp b/Source/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp
index 8f39113..1d23612 100644
--- a/Source/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp
+++ b/Source/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp
@@ -175,7 +175,7 @@ static const gchar* webkit_accessible_get_name(AtkObject* object)
return webkit_accessible_text_get_text(ATK_TEXT(atkObject), 0, -1);
}
- // Try text under the node
+ // Try text under the node.
String textUnder = renderObject->textUnderElement();
if (textUnder.length())
return returnString(textUnder);
@@ -191,6 +191,13 @@ static const gchar* webkit_accessible_get_name(AtkObject* object)
}
}
+ // Fallback for the webArea object: just return the document's title.
+ if (renderObject->isWebArea()) {
+ Document* document = coreObject->document();
+ if (document)
+ return returnString(document->title());
+ }
+
return returnString(coreObject->stringValue());
}
@@ -1113,29 +1120,28 @@ gchar* textForObject(AccessibilityRenderObject* accObject)
static gchar* webkit_accessible_text_get_text(AtkText* text, gint startOffset, gint endOffset)
{
AccessibilityObject* coreObject = core(text);
- String ret;
- unsigned start = startOffset;
+
+ int end = endOffset;
if (endOffset == -1) {
- endOffset = coreObject->stringValue().length();
- if (!endOffset)
- endOffset = coreObject->textUnderElement().length();
+ end = coreObject->stringValue().length();
+ if (!end)
+ end = coreObject->textUnderElement().length();
}
- int length = endOffset - startOffset;
+ String ret;
if (coreObject->isTextControl())
- ret = coreObject->doAXStringForRange(PlainTextRange(start, length));
+ ret = coreObject->doAXStringForRange(PlainTextRange(0, endOffset));
else {
- ret = coreObject->stringValue().substring(start, length);
+ ret = coreObject->stringValue();
if (!ret)
- ret = coreObject->textUnderElement().substring(start, length);
+ ret = coreObject->textUnderElement();
}
if (!ret.length()) {
// This can happen at least with anonymous RenderBlocks (e.g. body text amongst paragraphs)
- ret = String(textForObject(static_cast<AccessibilityRenderObject*>(coreObject)));
- if (!endOffset)
- endOffset = ret.length();
- ret = ret.substring(start, endOffset - startOffset);
+ ret = String(textForObject(toAccessibilityRenderObject(coreObject)));
+ if (!end)
+ end = ret.length();
}
// Prefix a item number/bullet if needed
@@ -1144,9 +1150,12 @@ static gchar* webkit_accessible_text_get_text(AtkText* text, gint startOffset, g
if (objRenderer && objRenderer->isListItem()) {
String markerText = toRenderListItem(objRenderer)->markerTextWithSuffix();
ret = objRenderer->style()->direction() == LTR ? markerText + ret : ret + markerText;
+ if (endOffset == -1)
+ end += markerText.length();
}
}
+ ret = ret.substring(startOffset, end - startOffset);
return g_strdup(ret.utf8().data());
}
@@ -1212,7 +1221,7 @@ static gint webkit_accessible_text_get_caret_offset(AtkText* text)
if (!coreObject->isAccessibilityRenderObject())
return 0;
- Node* focusedNode = coreObject->selection().end().node();
+ Node* focusedNode = coreObject->selection().end().deprecatedNode();
if (!focusedNode)
return 0;
@@ -1619,6 +1628,14 @@ static void getSelectionOffsetsForObject(AccessibilityObject* coreObject, Visibl
// Set values for start and end offsets.
startOffset = TextIterator::rangeLength(rangeInParent.get());
+
+ // We need to adjust the offsets for the list item marker.
+ RenderObject* renderer = toAccessibilityRenderObject(coreObject)->renderer();
+ if (renderer && renderer->isListItem()) {
+ String markerText = toRenderListItem(renderer)->markerTextWithSuffix();
+ startOffset += markerText.length();
+ }
+
RefPtr<Range> nodeRange = Range::create(node->document(), nodeRangeStart, nodeRangeEnd);
endOffset = startOffset + TextIterator::rangeLength(nodeRange.get());
}
@@ -1675,6 +1692,10 @@ static gboolean webkit_accessible_text_set_selection(AtkText* text, gint selecti
if (selectionNum)
return FALSE;
+ AccessibilityObject* coreObject = core(text);
+ if (!coreObject->isAccessibilityRenderObject())
+ return FALSE;
+
// Consider -1 and out-of-bound values and correct them to length
gint textCount = webkit_accessible_text_get_character_count(text);
if (startOffset < 0 || startOffset > textCount)
@@ -1682,11 +1703,24 @@ static gboolean webkit_accessible_text_set_selection(AtkText* text, gint selecti
if (endOffset < 0 || endOffset > textCount)
endOffset = textCount;
- AccessibilityObject* coreObject = core(text);
+ // We need to adjust the offsets for the list item marker.
+ RenderObject* renderer = toAccessibilityRenderObject(coreObject)->renderer();
+ if (renderer && renderer->isListItem()) {
+ String markerText = toRenderListItem(renderer)->markerTextWithSuffix();
+ int markerLength = markerText.length();
+ if (startOffset < markerLength || endOffset < markerLength)
+ return FALSE;
+
+ startOffset -= markerLength;
+ endOffset -= markerLength;
+ }
+
PlainTextRange textRange(startOffset, endOffset - startOffset);
VisiblePositionRange range = coreObject->visiblePositionRangeForRange(textRange);
- coreObject->setSelectedVisiblePositionRange(range);
+ if (range.isNull())
+ return FALSE;
+ coreObject->setSelectedVisiblePositionRange(range);
return TRUE;
}
@@ -2464,6 +2498,9 @@ void webkit_accessible_detach(WebKitAccessible* accessible)
{
ASSERT(accessible->m_object);
+ if (core(accessible)->roleValue() == WebAreaRole)
+ g_signal_emit_by_name(accessible, "state-change", "defunct", true);
+
// We replace the WebCore AccessibilityObject with a fallback object that
// provides default implementations to avoid repetitive null-checking after
// detachment.
@@ -2500,7 +2537,7 @@ AccessibilityObject* objectAndOffsetUnignored(AccessibilityObject* coreObject, i
Node* node = realObject->node();
if (node) {
- VisiblePosition startPosition = VisiblePosition(node, 0, DOWNSTREAM);
+ VisiblePosition startPosition = VisiblePosition(positionBeforeNode(node), DOWNSTREAM);
VisiblePosition endPosition = realObject->selection().visibleEnd();
if (startPosition == endPosition)