| Index: third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
|
| diff --git a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
|
| index c780186a855528cd7f12301a390698cbf61c3ff1..0a92208d5194a59991460ecdf23dc3bd731eaf3b 100644
|
| --- a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
|
| +++ b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
|
| @@ -1940,9 +1940,15 @@ void AXLayoutObject::setSelection(const AXRange& selection)
|
| if (!frame)
|
| return;
|
|
|
| - frame->selection().setSelection(VisibleSelection(
|
| - Position(anchorNode, selection.anchorOffset),
|
| - Position(focusNode, selection.focusOffset)));
|
| + // Set the selection based on visible positions, because the offsets in accessibility nodes
|
| + // are based on visible indexes, which often skips redundant whitespace, for example.
|
| + ContainerNode* anchorContainerNode = anchorNode->isContainerNode() ? toContainerNode(anchorNode) : anchorNode->parentNode();
|
| + ContainerNode* focusContainerNode = focusNode->isContainerNode() ? toContainerNode(focusNode) : focusNode->parentNode();
|
| + if (anchorContainerNode && focusContainerNode) {
|
| + VisiblePosition anchorVisiblePosition = blink::visiblePositionForIndex(selection.anchorOffset, anchorContainerNode);
|
| + VisiblePosition focusVisiblePosition = blink::visiblePositionForIndex(selection.focusOffset, focusContainerNode);
|
| + frame->selection().setSelection(VisibleSelection(anchorVisiblePosition, focusVisiblePosition));
|
| + }
|
| }
|
|
|
| bool AXLayoutObject::isValidSelectionBound(const AXObject* boundObject) const
|
|
|