578static gchar* webkitAccessibleTextGetChar(AtkText* text, gint offset, GetTextRelativePosition textPosition, gint* startOffset, gint* endOffset)
579{
580 AccessibilityObject* coreObject = core(text);
581 if (!coreObject || !coreObject->isAccessibilityRenderObject())
582 return g_strdup("");
583
584 int actualOffset = offset;
585 if (textPosition == GetTextPositionBefore)
586 actualOffset--;
587 else if (textPosition == GetTextPositionAfter)
588 actualOffset++;
589
590 GOwnPtr<char> textData(webkitAccessibleTextGetText(text, 0, -1));
591 int textLength = g_utf8_strlen(textData.get(), -1);
592
593 *startOffset = std::max(0, actualOffset);
594 *startOffset = std::min(*startOffset, textLength);
595
596 *endOffset = std::max(0, actualOffset + 1);
597 *endOffset = std::min(*endOffset, textLength);
598
599 if (*startOffset == *endOffset)
600 return g_strdup("");
601
602 // Make sure we return the line break if we are at the visual end of a line.
603 VisiblePosition visPos = coreObject->visiblePositionForIndex(actualOffset);
604 if (isEndOfLine(visPos))
605 return g_strdup("\n");
606
607 return g_utf8_substring(textData.get(), *startOffset, *endOffset);
608}
609