Index: third_party/WebKit/Source/core/editing/iterators/TextIteratorTextState.cpp |
diff --git a/third_party/WebKit/Source/core/editing/iterators/TextIteratorTextState.cpp b/third_party/WebKit/Source/core/editing/iterators/TextIteratorTextState.cpp |
index e6cc3b103b01324e621b9241d2307396364f661e..6971b1fc9e918a5f2e15a57132022c8cca5842ee 100644 |
--- a/third_party/WebKit/Source/core/editing/iterators/TextIteratorTextState.cpp |
+++ b/third_party/WebKit/Source/core/editing/iterators/TextIteratorTextState.cpp |
@@ -52,7 +52,7 @@ UChar TextIteratorTextState::CharacterAt(unsigned index) const { |
return single_character_buffer_; |
} |
- return text_[PositionStartOffset() + index]; |
+ return text_[text_start_offset_ + index]; |
} |
String TextIteratorTextState::Substring(unsigned position, |
@@ -66,7 +66,7 @@ String TextIteratorTextState::Substring(unsigned position, |
DCHECK_EQ(length, 1u); |
return String(&single_character_buffer_, 1); |
} |
- return text_.Substring(PositionStartOffset() + position, length); |
+ return text_.Substring(text_start_offset_ + position, length); |
} |
void TextIteratorTextState::AppendTextToStringBuilder( |
@@ -81,7 +81,7 @@ void TextIteratorTextState::AppendTextToStringBuilder( |
DCHECK_EQ(position, 0u); |
builder.Append(single_character_buffer_); |
} else { |
- builder.Append(text_, PositionStartOffset() + position, length_to_append); |
+ builder.Append(text_, text_start_offset_ + position, length_to_append); |
} |
} |
@@ -94,15 +94,15 @@ void TextIteratorTextState::UpdateForReplacedElement(Node* base_node) { |
single_character_buffer_ = 0; |
text_length_ = 0; |
- last_character_ = 0; |
text_start_offset_ = 0; |
+ last_character_ = 0; |
} |
void TextIteratorTextState::EmitAltText(Node* node) { |
text_ = ToHTMLElement(node)->AltText(); |
+ text_start_offset_ = 0; |
text_length_ = text_.length(); |
last_character_ = text_length_ ? text_[text_length_ - 1] : 0; |
- text_start_offset_ = 0; |
} |
void TextIteratorTextState::FlushPositionOffsets() const { |
@@ -135,12 +135,14 @@ void TextIteratorTextState::SpliceBuffer(UChar c, |
single_character_buffer_ = c; |
DCHECK(single_character_buffer_); |
text_length_ = 1; |
+ text_start_offset_ = 0; |
// remember some iteration state |
last_character_ = c; |
- text_start_offset_ = 0; |
} |
+// TODO(xiaochengh): Remove the dependency on LayoutText, so that the class can |
+// also be used by Layout NG. |
void TextIteratorTextState::EmitText(Node* text_node, |
LayoutText* layout_object, |
int text_start_offset, |
@@ -160,14 +162,14 @@ void TextIteratorTextState::EmitText(Node* text_node, |
position_node_ = text_node; |
position_offset_base_node_ = nullptr; |
- position_start_offset_ = text_start_offset; |
- position_end_offset_ = text_end_offset; |
+ position_start_offset_ = text_start_offset + layout_object->TextStartOffset(); |
+ position_end_offset_ = text_end_offset + layout_object->TextStartOffset(); |
single_character_buffer_ = 0; |
+ text_start_offset_ = text_start_offset; |
text_length_ = text_end_offset - text_start_offset; |
last_character_ = text_[text_end_offset - 1]; |
has_emitted_ = true; |
- text_start_offset_ = layout_object->TextStartOffset(); |
} |
void TextIteratorTextState::AppendTextTo(ForwardsTextBuffer* output, |
@@ -186,17 +188,11 @@ void TextIteratorTextState::AppendTextTo(ForwardsTextBuffer* output, |
output->PushCharacters(single_character_buffer_, 1); |
return; |
} |
- if (PositionNode()) { |
- FlushPositionOffsets(); |
- unsigned offset = PositionStartOffset() + position; |
- if (text_.Is8Bit()) |
- output->PushRange(text_.Characters8() + offset, length_to_append); |
- else |
- output->PushRange(text_.Characters16() + offset, length_to_append); |
- return; |
- } |
- // We shouldn't be attempting to append text that doesn't exist. |
- NOTREACHED(); |
+ unsigned offset = text_start_offset_ + position; |
+ if (text_.Is8Bit()) |
+ output->PushRange(text_.Characters8() + offset, length_to_append); |
+ else |
+ output->PushRange(text_.Characters16() + offset, length_to_append); |
} |
} // namespace blink |