Changeset 214112 in webkit
- Timestamp:
- Mar 17, 2017, 12:48:36 PM (8 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r214110 r214112 1 2017-03-17 Nan Wang <n_wang@apple.com> 2 3 AX: VoiceOver no longer works corectly with editable text in the web 4 https://bugs.webkit.org/show_bug.cgi?id=169801 5 6 Reviewed by Chris Fleizach. 7 8 * accessibility/ios-simulator/element-text-range-for-text-control-expected.txt: Added. 9 * accessibility/ios-simulator/element-text-range-for-text-control.html: Added. 10 * accessibility/mac/text-markers-for-input-with-placeholder-expected.txt: Added. 11 * accessibility/mac/text-markers-for-input-with-placeholder.html: Added. 12 1 13 2017-03-17 Dave Hyatt <hyatt@apple.com> 2 14 -
trunk/Source/WebCore/ChangeLog
r214111 r214112 1 2017-03-17 Nan Wang <n_wang@apple.com> 2 3 AX: VoiceOver no longer works corectly with editable text in the web 4 https://bugs.webkit.org/show_bug.cgi?id=169801 5 6 Reviewed by Chris Fleizach. 7 8 The issue is that since we are entering text controls when getting the text marker, 9 the end text marker of the input tag might associate to the placeholder div instead of 10 the input tag itself. 11 Fixed the issue by checking the shadow elements using shadowHost() instead of isShadowRoot(). 12 Also, only enter text controls when navigating by characters/indexes, so that both Mac and 13 iOS will get the correct text marker ranges for shadow host elements. 14 15 Tests: accessibility/ios-simulator/element-text-range-for-text-control.html 16 accessibility/mac/text-markers-for-input-with-placeholder.html 17 18 * accessibility/AXObjectCache.cpp: 19 (WebCore::AXObjectCache::traverseToOffsetInRange): 20 (WebCore::AXObjectCache::startOrEndCharacterOffsetForRange): 21 (WebCore::AXObjectCache::characterOffsetForIndex): 22 * accessibility/AXObjectCache.h: 23 1 24 2017-03-17 Wenson Hsieh <wenson_hsieh@apple.com> 2 25 -
trunk/Source/WebCore/accessibility/AXObjectCache.cpp
r213355 r214112 1556 1556 bool toNodeEnd = option & TraverseOptionToNodeEnd; 1557 1557 bool validateOffset = option & TraverseOptionValidateOffset; 1558 bool doNotEnterTextControls = option & TraverseOptionDoNotEnterTextControls; 1558 1559 1559 1560 int offsetInCharacter = 0; … … 1565 1566 int lastStartOffset = 0; 1566 1567 1567 TextIterator iterator(range.get(), TextIteratorEntersTextControls);1568 TextIterator iterator(range.get(), doNotEnterTextControls ? TextIteratorDefaultBehavior : TextIteratorEntersTextControls); 1568 1569 1569 1570 // When the range has zero length, there might be replaced node or brTag that we need to increment the characterOffset. … … 1618 1619 currentNode = childNode; 1619 1620 hasReplacedNodeOrBR = true; 1620 } else if ( currentNode->isShadowRoot()) {1621 } else if (Element *shadowHost = currentNode->shadowHost()) { 1621 1622 // Since we are entering text controls, we should set the currentNode 1622 1623 // to be the shadow host when there's no content. 1623 currentNode = currentNode->shadowHost(); 1624 continue; 1624 if (nodeIsTextControl(shadowHost)) { 1625 currentNode = currentNode->shadowHost(); 1626 continue; 1627 } 1625 1628 } else if (currentNode != previousNode) { 1626 1629 // We should set the start offset and length for the current node in case this is the last iteration. … … 1838 1841 } 1839 1842 1840 CharacterOffset AXObjectCache::startOrEndCharacterOffsetForRange(RefPtr<Range> range, bool isStart )1843 CharacterOffset AXObjectCache::startOrEndCharacterOffsetForRange(RefPtr<Range> range, bool isStart, bool enterTextControls) 1841 1844 { 1842 1845 if (!range) … … 1866 1869 } 1867 1870 1868 return traverseToOffsetInRange(WTFMove(copyRange), offset, isStart ? TraverseOptionDefault : TraverseOptionToNodeEnd, stayWithinRange); 1871 TraverseOption options = isStart ? TraverseOptionDefault : TraverseOptionToNodeEnd; 1872 if (!enterTextControls) 1873 options = static_cast<TraverseOption>(options | TraverseOptionDoNotEnterTextControls); 1874 return traverseToOffsetInRange(WTFMove(copyRange), offset, options, stayWithinRange); 1869 1875 } 1870 1876 … … 2617 2623 2618 2624 RefPtr<Range> range = obj->elementRange(); 2619 CharacterOffset start = startOrEndCharacterOffsetForRange(range, true );2620 CharacterOffset end = startOrEndCharacterOffsetForRange(range, false );2625 CharacterOffset start = startOrEndCharacterOffsetForRange(range, true, true); 2626 CharacterOffset end = startOrEndCharacterOffsetForRange(range, false, true); 2621 2627 CharacterOffset result = start; 2622 2628 for (int i = 0; i < index; i++) { -
trunk/Source/WebCore/accessibility/AXObjectCache.h
r211500 r214112 223 223 CharacterOffset previousCharacterOffset(const CharacterOffset&, bool ignorePreviousNodeEnd = true); 224 224 void startOrEndTextMarkerDataForRange(TextMarkerData&, RefPtr<Range>, bool); 225 CharacterOffset startOrEndCharacterOffsetForRange(RefPtr<Range>, bool );225 CharacterOffset startOrEndCharacterOffsetForRange(RefPtr<Range>, bool, bool enterTextControls = false); 226 226 AccessibilityObject* accessibilityObjectForTextMarkerData(TextMarkerData&); 227 227 RefPtr<Range> rangeForUnorderedCharacterOffsets(const CharacterOffset&, const CharacterOffset&); … … 352 352 353 353 // CharacterOffset functions. 354 enum TraverseOption { TraverseOptionDefault = 1 << 0, TraverseOptionToNodeEnd = 1 << 1, TraverseOptionIncludeStart = 1 << 2, TraverseOptionValidateOffset = 1 << 3 };354 enum TraverseOption { TraverseOptionDefault = 1 << 0, TraverseOptionToNodeEnd = 1 << 1, TraverseOptionIncludeStart = 1 << 2, TraverseOptionValidateOffset = 1 << 3, TraverseOptionDoNotEnterTextControls = 1 << 4 }; 355 355 Node* nextNode(Node*) const; 356 356 Node* previousNode(Node*) const;
Note:
See TracChangeset
for help on using the changeset viewer.