diff options
Diffstat (limited to 'Source/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp')
-rw-r--r-- | Source/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp | 73 |
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) |