static gboolean webkitAccessibleTextSetSelection(AtkText* text, gint selectionNum, gint startOffset, gint endOffset) { // WebCore does not support multiple selection, so anything but 0 does not make sense for now. 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 = webkitAccessibleTextGetCharacterCount(text); if (startOffset < 0 || startOffset > textCount) startOffset = textCount; if (endOffset < 0 || endOffset > textCount) endOffset = textCount; // We need to adjust the offsets for the list item marker. int offsetAdjustment = offsetAdjustmentForListItem(coreObject); if (offsetAdjustment) { if (startOffset < offsetAdjustment || endOffset < offsetAdjustment) return FALSE; startOffset = atkOffsetToWebCoreOffset(text, startOffset); endOffset = atkOffsetToWebCoreOffset(text, endOffset); } PlainTextRange textRange(startOffset, endOffset - startOffset); VisiblePositionRange range = coreObject->visiblePositionRangeForRange(textRange); if (range.isNull()) return FALSE; coreObject->setSelectedVisiblePositionRange(range); return TRUE; }
static gboolean webkitAccessibleTextSetCaretOffset(AtkText* text, gint offset) { AccessibilityObject* coreObject = core(text); if (!coreObject->isAccessibilityRenderObject()) return FALSE; RenderObject* renderer = coreObject->renderer(); if (renderer && renderer->isListItem()) { String markerText = toRenderListItem(renderer)->markerTextWithSuffix(); int markerLength = markerText.length(); if (offset < markerLength) return FALSE; // We need to adjust the offset for list items. offset -= markerLength; } PlainTextRange textRange(offset, 0); VisiblePositionRange range = coreObject->visiblePositionRangeForRange(textRange); if (range.isNull()) return FALSE; coreObject->setSelectedVisiblePositionRange(range); return TRUE; }
int AccessibilityObject::lengthForVisiblePositionRange(const VisiblePositionRange& visiblePositionRange) const { // FIXME: Multi-byte support if (visiblePositionRange.isNull()) return -1; int length = 0; RefPtr<Range> range = makeRange(visiblePositionRange.start, visiblePositionRange.end); for (TextIterator it(range.get()); !it.atEnd(); it.advance()) { // non-zero length means textual node, zero length means replaced node (AKA "attachments" in AX) if (it.length() != 0) { length += it.length(); } else { // locate the node and starting offset for this replaced range int exception = 0; Node* node = it.range()->startContainer(exception); ASSERT(node == it.range()->endContainer(exception)); int offset = it.range()->startOffset(exception); if (replacedNodeNeedsCharacter(node->childNode(offset))) length++; } } return length; }
String AccessibilityObject::stringForVisiblePositionRange(const VisiblePositionRange& visiblePositionRange) const { if (visiblePositionRange.isNull()) return String(); Vector<UChar> resultVector; RefPtr<Range> range = makeRange(visiblePositionRange.start, visiblePositionRange.end); for (TextIterator it(range.get()); !it.atEnd(); it.advance()) { // non-zero length means textual node, zero length means replaced node (AKA "attachments" in AX) if (it.length() != 0) { resultVector.append(it.characters(), it.length()); } else { // locate the node and starting offset for this replaced range int exception = 0; Node* node = it.range()->startContainer(exception); ASSERT(node == it.range()->endContainer(exception)); int offset = it.range()->startOffset(exception); if (replacedNodeNeedsCharacter(node->childNode(offset))) { resultVector.append(objectReplacementCharacter); } } } return String::adopt(resultVector); }
String AccessibilityObject::stringForVisiblePositionRange(const VisiblePositionRange& visiblePositionRange) const { if (visiblePositionRange.isNull()) return String(); StringBuilder builder; RefPtr<Range> range = makeRange(visiblePositionRange.start, visiblePositionRange.end); for (TextIterator it(range.get()); !it.atEnd(); it.advance()) { // non-zero length means textual node, zero length means replaced node (AKA "attachments" in AX) if (it.length()) { // Add a textual representation for list marker text String listMarkerText = listMarkerTextForNodeAndPosition(it.node(), visiblePositionRange.start); if (!listMarkerText.isEmpty()) builder.append(listMarkerText); builder.append(it.characters(), it.length()); } else { // locate the node and starting offset for this replaced range int exception = 0; Node* node = it.range()->startContainer(exception); ASSERT(node == it.range()->endContainer(exception)); int offset = it.range()->startOffset(exception); if (replacedNodeNeedsCharacter(node->childNode(offset))) builder.append(objectReplacementCharacter); } } return builder.toString(); }
static gboolean webkitAccessibleTextSetSelection(AtkText* text, gint selectionNum, gint startOffset, gint endOffset) { // WebCore does not support multiple selection, so anything but 0 does not make sense for now. 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 = webkitAccessibleTextGetCharacterCount(text); if (startOffset < 0 || startOffset > textCount) startOffset = textCount; if (endOffset < 0 || endOffset > textCount) endOffset = textCount; // We need to adjust the offsets for the list item marker. RenderObject* renderer = 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); if (range.isNull()) return FALSE; coreObject->setSelectedVisiblePositionRange(range); return TRUE; }
static gboolean webkitAccessibleTextSetCaretOffset(AtkText* text, gint offset) { AccessibilityObject* coreObject = core(text); if (!coreObject->isAccessibilityRenderObject()) return FALSE; // We need to adjust the offsets for the list item marker. int offsetAdjustment = offsetAdjustmentForListItem(coreObject); if (offsetAdjustment) { if (offset < offsetAdjustment) return FALSE; offset = atkOffsetToWebCoreOffset(text, offset); } PlainTextRange textRange(offset, 0); VisiblePositionRange range = coreObject->visiblePositionRangeForRange(textRange); if (range.isNull()) return FALSE; coreObject->setSelectedVisiblePositionRange(range); return TRUE; }