| Index: Source/core/editing/TextIterator.cpp
|
| diff --git a/Source/core/editing/TextIterator.cpp b/Source/core/editing/TextIterator.cpp
|
| index b85b148eaf9608052ac88662b451df18dd732357..a406ad8cc5ad2bfd340e3531adcc16bcab8583fa 100644
|
| --- a/Source/core/editing/TextIterator.cpp
|
| +++ b/Source/core/editing/TextIterator.cpp
|
| @@ -1183,15 +1183,19 @@ SimplifiedBackwardsTextIterator::SimplifiedBackwardsTextIterator(const Range* r,
|
| int startOffset = r->startOffset();
|
| int endOffset = r->endOffset();
|
|
|
| - if (!startNode->offsetInCharacters()) {
|
| - if (startOffset >= 0 && startOffset < static_cast<int>(startNode->childNodeCount())) {
|
| - startNode = startNode->childNode(startOffset);
|
| + if (!startNode->offsetInCharacters() && startOffset >= 0) {
|
| + // childNode() will return 0 if the offset is out of range. We rely on this behavior
|
| + // instead of calling childNodeCount() to avoid traversing the children twice.
|
| + if (Node* childAtOffset = startNode->childNode(startOffset)) {
|
| + startNode = childAtOffset;
|
| startOffset = 0;
|
| }
|
| }
|
| - if (!endNode->offsetInCharacters()) {
|
| - if (endOffset > 0 && endOffset <= static_cast<int>(endNode->childNodeCount())) {
|
| - endNode = endNode->childNode(endOffset - 1);
|
| + if (!endNode->offsetInCharacters() && endOffset > 0) {
|
| + // childNode() will return 0 if the offset is out of range. We rely on this behavior
|
| + // instead of calling childNodeCount() to avoid traversing the children twice.
|
| + if (Node* childAtOffset = endNode->childNode(endOffset - 1)) {
|
| + endNode = childAtOffset;
|
| endOffset = lastOffsetInNode(endNode);
|
| }
|
| }
|
|
|