Changeset 152561 in webkit


Ignore:
Timestamp:
Jul 11, 2013, 1:36:15 AM (12 years ago)
Author:
mario@webkit.org
Message:

[ATK] Refactor code for translating offsets between WebCore a11y and ATK
https://bugs.webkit.org/show_bug.cgi?id=118179

Reviewed by Chris Fleizach.

Encapsulate better and make more clear the translation of offsets
between our ATK implementation and WebCore's accessibility layer.

Values for offsets can differ sometimes between those two worlds
due to some extra flattening we need to do in ATK based ports to
properly expose the accessibility hierarchy to ATs, which
sometimes means adding extra text elements in the exposed text
through the AtkText interface (e.g. list items markers).

  • accessibility/atk/WebKitAccessibleInterfaceText.cpp:

(offsetAdjustmentForListItem): Helper function to refactor code
needed to translate offsets from WebCore to ATK worlds. Currently
related to considering list item markers in LTR text only.
(webCoreOffsetToAtkOffset): Convenience function for code
readability purposes. It just calls offsetAdjustmentForListItem.
(atkOffsetToWebCoreOffset): Likewise.
(getSelectionOffsetsForObject): Use webCoreOffsetToAtkOffset.
(webkitAccessibleTextGetCaretOffset): Use webCoreOffsetToAtkOffset
to translate an offset from WebCore to ATK before returning it.
(webkitAccessibleTextSetSelection): Use atkOffsetToWebCoreOffset
to translate an offset from WebCore to ATK before using it.
(webkitAccessibleTextSetCaretOffset): Likewise.

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r152554 r152561  
     12013-07-11  Mario Sanchez Prada  <mario.prada@samsung.com>
     2
     3        [ATK] Refactor code for translating offsets between WebCore a11y and ATK
     4        https://bugs.webkit.org/show_bug.cgi?id=118179
     5
     6        Reviewed by Chris Fleizach.
     7
     8        Encapsulate better and make more clear the translation of offsets
     9        between our ATK implementation and WebCore's accessibility layer.
     10
     11        Values for offsets can differ sometimes between those two worlds
     12        due to some extra flattening we need to do in ATK based ports to
     13        properly expose the accessibility hierarchy to ATs, which
     14        sometimes means adding extra text elements in the exposed text
     15        through the AtkText interface (e.g. list items markers).
     16
     17        * accessibility/atk/WebKitAccessibleInterfaceText.cpp:
     18        (offsetAdjustmentForListItem): Helper function to refactor code
     19        needed to translate offsets from WebCore to ATK worlds. Currently
     20        related to considering list item markers in LTR text only.
     21        (webCoreOffsetToAtkOffset): Convenience function for code
     22        readability purposes. It just calls offsetAdjustmentForListItem.
     23        (atkOffsetToWebCoreOffset): Likewise.
     24        (getSelectionOffsetsForObject): Use webCoreOffsetToAtkOffset.
     25        (webkitAccessibleTextGetCaretOffset): Use webCoreOffsetToAtkOffset
     26        to translate an offset from WebCore to ATK before returning it.
     27        (webkitAccessibleTextSetSelection): Use atkOffsetToWebCoreOffset
     28        to translate an offset from WebCore to ATK before using it.
     29        (webkitAccessibleTextSetCaretOffset): Likewise.
     30
    1312013-07-10  Sam Weinig  <sam@webkit.org>
    232
  • trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceText.cpp

    r152537 r152561  
    473473}
    474474
     475static int offsetAdjustmentForListItem(const AccessibilityObject* object)
     476{
     477    // We need to adjust the offsets for the list item marker in
     478    // Left-To-Right text, since we expose it together with the text.
     479    RenderObject* renderer = object->renderer();
     480    if (renderer && renderer->isListItem() && renderer->style()->direction() == LTR)
     481        return toRenderListItem(renderer)->markerTextWithSuffix().length();
     482
     483    return 0;
     484}
     485
     486static int webCoreOffsetToAtkOffset(const AccessibilityObject* object, int offset)
     487{
     488    if (!object->isListItem())
     489        return offset;
     490
     491    return offset + offsetAdjustmentForListItem(object);
     492}
     493
     494static int atkOffsetToWebCoreOffset(AtkText* text, int offset)
     495{
     496    AccessibilityObject* coreObject = core(text);
     497    if (!coreObject || !coreObject->isListItem())
     498        return offset;
     499
     500    return offset - offsetAdjustmentForListItem(coreObject);
     501}
     502
    475503static void getSelectionOffsetsForObject(AccessibilityObject* coreObject, VisibleSelection& selection, gint& startOffset, gint& endOffset)
    476504{
     
    514542    RefPtr<Range> rangeInParent = Range::create(node->document(), parentFirstPosition, nodeRangeStart);
    515543
     544
    516545    // Set values for start and end offsets.
    517     startOffset = TextIterator::rangeLength(rangeInParent.get(), true);
    518 
    519     // We need to adjust the offsets for the list item marker.
    520     RenderObject* renderer = coreObject->renderer();
    521     if (renderer && renderer->isListItem()) {
    522         String markerText = toRenderListItem(renderer)->markerTextWithSuffix();
    523         startOffset += markerText.length();
    524     }
     546    startOffset = webCoreOffsetToAtkOffset(coreObject, TextIterator::rangeLength(rangeInParent.get(), true));
    525547
    526548    RefPtr<Range> nodeRange = Range::create(node->document(), nodeRangeStart, nodeRangeEnd);
     
    681703        return 0;
    682704
    683     RenderObject* renderer = coreObject->renderer();
    684     if (renderer && renderer->isListItem()) {
    685         String markerText = toRenderListItem(renderer)->markerTextWithSuffix();
    686 
    687         // We need to adjust the offset for the list item marker.
    688         offset += markerText.length();
    689     }
    690 
    691     // TODO: Verify this for RTL text.
    692     return offset;
     705    return webCoreOffsetToAtkOffset(coreObject, offset);
    693706}
    694707
     
    822835
    823836    // We need to adjust the offsets for the list item marker.
    824     RenderObject* renderer = coreObject->renderer();
    825     if (renderer && renderer->isListItem()) {
    826         String markerText = toRenderListItem(renderer)->markerTextWithSuffix();
    827         int markerLength = markerText.length();
    828         if (startOffset < markerLength || endOffset < markerLength)
     837    int offsetAdjustment = offsetAdjustmentForListItem(coreObject);
     838    if (offsetAdjustment) {
     839        if (startOffset < offsetAdjustment || endOffset < offsetAdjustment)
    829840            return FALSE;
    830841
    831         startOffset -= markerLength;
    832         endOffset -= markerLength;
     842        startOffset = atkOffsetToWebCoreOffset(text, startOffset);
     843        endOffset = atkOffsetToWebCoreOffset(text, endOffset);
    833844    }
    834845
     
    865876        return FALSE;
    866877
    867     RenderObject* renderer = coreObject->renderer();
    868     if (renderer && renderer->isListItem()) {
    869         String markerText = toRenderListItem(renderer)->markerTextWithSuffix();
    870         int markerLength = markerText.length();
    871         if (offset < markerLength)
     878    // We need to adjust the offsets for the list item marker.
     879    int offsetAdjustment = offsetAdjustmentForListItem(coreObject);
     880    if (offsetAdjustment) {
     881        if (offset < offsetAdjustment)
    872882            return FALSE;
    873883
    874         // We need to adjust the offset for list items.
    875         offset -= markerLength;
     884        offset = atkOffsetToWebCoreOffset(text, offset);
    876885    }
    877886
Note: See TracChangeset for help on using the changeset viewer.