Chromium Code Reviews| Index: Source/core/editing/TextIterator.cpp |
| diff --git a/Source/core/editing/TextIterator.cpp b/Source/core/editing/TextIterator.cpp |
| index 2fad13588cfa45747555c261c1aacff8826cf7e9..83771b03662dfe4df00a7cc42b0f2644a8b111ee 100644 |
| --- a/Source/core/editing/TextIterator.cpp |
| +++ b/Source/core/editing/TextIterator.cpp |
| @@ -570,7 +570,7 @@ UChar TextIterator::characterAt(unsigned index) const |
| return m_singleCharacterBuffer; |
| } |
| - return string()[startOffset() + index]; |
| + return string()[positionStartOffset() + index]; |
| } |
| String TextIterator::substring(unsigned position, unsigned length) const |
| @@ -584,7 +584,7 @@ String TextIterator::substring(unsigned position, unsigned length) const |
| ASSERT(length == 1); |
| return String(&m_singleCharacterBuffer, 1); |
| } |
| - return string().substring(startOffset() + position, length); |
| + return string().substring(positionStartOffset() + position, length); |
| } |
| void TextIterator::appendTextToStringBuilder(StringBuilder& builder, unsigned position, unsigned maxLength) const |
| @@ -596,7 +596,7 @@ void TextIterator::appendTextToStringBuilder(StringBuilder& builder, unsigned po |
| ASSERT(!position); |
| builder.append(m_singleCharacterBuffer); |
| } else { |
| - builder.append(string(), startOffset() + position, lengthToAppend); |
| + builder.append(string(), positionStartOffset() + position, lengthToAppend); |
| } |
| } |
| @@ -1096,6 +1096,16 @@ bool TextIterator::handleNonTextNode() |
| return true; |
| } |
| +void TextIterator::flushPositionOffsets() const |
| +{ |
| + if (m_positionOffsetBaseNode) { |
|
yosin_UTC9
2014/09/08 01:55:19
nit: It seems early return reduce indentation.
if
Mads Ager (chromium)
2014/09/08 08:50:46
Done.
|
| + int index = m_positionOffsetBaseNode->nodeIndex(); |
| + m_positionStartOffset += index; |
| + m_positionEndOffset += index; |
| + m_positionOffsetBaseNode = nullptr; |
| + } |
| +} |
| + |
| void TextIterator::exitNode() |
| { |
| // prevent emitting a newline when exiting a collapsed block at beginning of the range |
| @@ -1181,12 +1191,7 @@ PassRefPtrWillBeRawPtr<Range> TextIterator::range() const |
| { |
| // use the current run information, if we have it |
| if (m_positionNode) { |
| - if (m_positionOffsetBaseNode) { |
| - int index = m_positionOffsetBaseNode->nodeIndex(); |
| - m_positionStartOffset += index; |
| - m_positionEndOffset += index; |
| - m_positionOffsetBaseNode = nullptr; |
| - } |
| + flushPositionOffsets(); |
| return Range::create(m_positionNode->document(), m_positionNode, m_positionStartOffset, m_positionNode, m_positionEndOffset); |
| } |
| @@ -1199,17 +1204,52 @@ PassRefPtrWillBeRawPtr<Range> TextIterator::range() const |
| Node* TextIterator::node() const |
| { |
| - RefPtrWillBeRawPtr<Range> textRange = range(); |
| - if (!textRange) |
| - return 0; |
| + if (m_positionNode || m_endContainer) { |
| + Node* node = startContainer(); |
| + if (node->offsetInCharacters()) |
| + return node; |
| + return NodeTraversal::childAt(*node, startOffset()); |
| + } |
| + return 0; |
| +} |
| - Node* node = textRange->startContainer(); |
| - if (!node) |
| - return 0; |
| - if (node->offsetInCharacters()) |
| - return node; |
| +int TextIterator::startOffset() const |
| +{ |
| + if (m_positionNode) { |
| + flushPositionOffsets(); |
| + return m_positionStartOffset; |
| + } |
| + ASSERT(m_endContainer); |
| + return m_endOffset; |
| +} |
| - return NodeTraversal::childAt(*node, textRange->startOffset()); |
| +int TextIterator::endOffset() const |
| +{ |
| + if (m_positionNode) { |
| + flushPositionOffsets(); |
| + return m_positionEndOffset; |
| + } |
| + ASSERT(m_endContainer); |
| + return m_endOffset; |
| +} |
| + |
| +Node* TextIterator::startContainer() const |
| +{ |
| + if (m_positionNode) { |
| + return m_positionNode; |
| + } |
| + ASSERT(m_endContainer); |
| + return m_endContainer; |
| +} |
| + |
| +Position TextIterator::startPosition() const |
| +{ |
| + return createLegacyEditingPosition(startContainer(), startOffset()); |
| +} |
| + |
| +Position TextIterator::endPosition() const |
| +{ |
| + return createLegacyEditingPosition(startContainer(), endOffset()); |
| } |
| // -------- |
| @@ -1503,6 +1543,27 @@ PassRefPtrWillBeRawPtr<Range> SimplifiedBackwardsTextIterator::range() const |
| return Range::create(m_startNode->document(), m_startNode, m_startOffset, m_startNode, m_startOffset); |
| } |
| +Node* SimplifiedBackwardsTextIterator::startContainer() const |
| +{ |
| + if (m_positionNode) |
| + return m_positionNode; |
| + return m_startNode; |
| +} |
| + |
| +int SimplifiedBackwardsTextIterator::endOffset() const |
| +{ |
| + if (m_positionNode) |
| + return m_positionEndOffset; |
| + return m_startOffset; |
| +} |
| + |
| +Position SimplifiedBackwardsTextIterator::startPosition() const |
| +{ |
| + if (m_positionNode) |
| + return createLegacyEditingPosition(m_positionNode, m_positionStartOffset); |
| + return createLegacyEditingPosition(m_startNode, m_startOffset); |
| +} |
| + |
| // -------- |
| CharacterIterator::CharacterIterator(const Range* range, TextIteratorBehaviorFlags behavior) |
| @@ -1546,6 +1607,47 @@ PassRefPtrWillBeRawPtr<Range> CharacterIterator::range() const |
| return r.release(); |
| } |
| +Node* CharacterIterator::startContainer() const |
| +{ |
| + return m_textIterator.startContainer(); |
| +} |
| + |
| +int CharacterIterator::startOffset() const |
| +{ |
| + if (!m_textIterator.atEnd()) { |
| + if (m_textIterator.length() > 1) |
| + return m_textIterator.startOffset() + m_runOffset; |
| + ASSERT(!m_runOffset); |
| + } |
| + return m_textIterator.startOffset(); |
| +} |
| + |
| +Position CharacterIterator::startPosition() const |
| +{ |
| + if (!m_textIterator.atEnd()) { |
| + if (m_textIterator.length() > 1) { |
| + Node* n = m_textIterator.startContainer(); |
| + int offset = m_textIterator.startOffset() + m_runOffset; |
| + return createLegacyEditingPosition(n, offset); |
| + } |
| + ASSERT(!m_runOffset); |
| + } |
| + return m_textIterator.startPosition(); |
| +} |
| + |
| +Position CharacterIterator::endPosition() const |
| +{ |
| + if (!m_textIterator.atEnd()) { |
| + if (m_textIterator.length() > 1) { |
| + Node* n = m_textIterator.startContainer(); |
| + int offset = m_textIterator.startOffset() + m_runOffset; |
| + return createLegacyEditingPosition(n, offset + 1); |
| + } |
| + ASSERT(!m_runOffset); |
| + } |
| + return m_textIterator.endPosition(); |
| +} |
| + |
| void CharacterIterator::advance(int count) |
| { |
| if (count <= 0) { |
| @@ -1594,13 +1696,11 @@ void CharacterIterator::advance(int count) |
| static void calculateCharacterSubrange(CharacterIterator& it, int offset, int length, Position& startPosition, Position& endPosition) |
| { |
| it.advance(offset); |
| - RefPtrWillBeRawPtr<Range> start = it.range(); |
| - startPosition = start->startPosition(); |
| + startPosition = it.startPosition(); |
| if (length > 1) |
| it.advance(length - 1); |
| - RefPtrWillBeRawPtr<Range> end = it.range(); |
| - endPosition = end->endPosition(); |
| + endPosition = it.endPosition(); |
| } |
| BackwardsCharacterIterator::BackwardsCharacterIterator(const Range* range, TextIteratorBehaviorFlags behavior) |
| @@ -1630,6 +1730,17 @@ PassRefPtrWillBeRawPtr<Range> BackwardsCharacterIterator::range() const |
| return r.release(); |
| } |
| +Position BackwardsCharacterIterator::endPosition() const |
| +{ |
| + Node* n = m_textIterator.startContainer(); |
| + if (m_textIterator.atEnd()) { |
| + if (m_textIterator.length() > 1) |
| + return createLegacyEditingPosition(n, m_textIterator.endOffset() - m_runOffset); |
| + ASSERT(!m_runOffset); |
| + } |
| + return createLegacyEditingPosition(n, m_textIterator.endOffset()); |
| +} |
| + |
| void BackwardsCharacterIterator::advance(int count) |
| { |
| if (count <= 0) { |
| @@ -1699,8 +1810,6 @@ void WordAwareIterator::advance() |
| while (!m_textIterator.atEnd() && !m_textIterator.length()) |
| m_textIterator.advance(); |
| - m_range = m_textIterator.range(); |
| - |
| if (m_textIterator.atEnd()) |
| return; |
| @@ -1722,7 +1831,6 @@ void WordAwareIterator::advance() |
| // Start gobbling chunks until we get to a suitable stopping point |
| m_textIterator.appendTextTo(m_buffer); |
| - m_range->setEnd(m_textIterator.range()->endContainer(), m_textIterator.range()->endOffset(), IGNORE_EXCEPTION); |
| } |
| } |