Index: third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp |
diff --git a/third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp b/third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp |
index 5ff8ed7d6c0f2d2b91a7afcf09cffc428e65ed68..2a1c2e8aa25bfdcac1d63d6704796f6c9f5720c5 100644 |
--- a/third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp |
+++ b/third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp |
@@ -37,6 +37,7 @@ |
#include "core/editing/Position.h" |
#include "core/editing/VisiblePosition.h" |
#include "core/editing/VisibleUnits.h" |
+#include "core/editing/iterators/TextIteratorTextNodeHandler.h" |
#include "core/frame/LocalFrameView.h" |
#include "core/frame/UseCounter.h" |
#include "core/html/HTMLElement.h" |
@@ -186,8 +187,9 @@ TextIteratorAlgorithm<Strategy>::TextIteratorAlgorithm( |
shadow_depth_( |
ShadowDepthOf<Strategy>(*start_container_, *end_container_)), |
behavior_(AdjustBehaviorFlags<Strategy>(behavior)), |
- text_state_(behavior_), |
- text_node_handler_(behavior_, &text_state_) { |
+ text_state_(new TextIteratorTextState(behavior_)), |
+ text_node_handler_( |
+ new TextIteratorTextNodeHandler(behavior_, text_state_)) { |
DCHECK(start_container_); |
DCHECK(end_container_); |
@@ -253,12 +255,12 @@ bool TextIteratorAlgorithm<Strategy>::HandleRememberedProgress() { |
if (needs_handle_replaced_element_) { |
HandleReplacedElement(); |
- if (text_state_.PositionNode()) |
+ if (text_state_->PositionNode()) |
return true; |
} |
// Try to emit more text runs if we are handling a text node. |
- return text_node_handler_.HandleRemainingTextRuns(); |
+ return text_node_handler_->HandleRemainingTextRuns(); |
} |
template <typename Strategy> |
@@ -269,7 +271,7 @@ void TextIteratorAlgorithm<Strategy>::Advance() { |
if (node_) |
DCHECK(!node_->GetDocument().NeedsLayoutTreeUpdate()) << node_; |
- text_state_.ResetRunInformation(); |
+ text_state_->ResetRunInformation(); |
if (HandleRememberedProgress()) |
return; |
@@ -355,7 +357,7 @@ void TextIteratorAlgorithm<Strategy>::Advance() { |
HandleNonTextNode(); |
} |
iteration_progress_ = kHandledNode; |
- if (text_state_.PositionNode()) |
+ if (text_state_->PositionNode()) |
return; |
} |
} |
@@ -388,7 +390,7 @@ void TextIteratorAlgorithm<Strategy>::Advance() { |
parent_node = Strategy::Parent(*node_); |
if (have_layout_object) |
ExitNode(); |
- if (text_state_.PositionNode()) { |
+ if (text_state_->PositionNode()) { |
iteration_progress_ = kHandledChildren; |
return; |
} |
@@ -449,7 +451,7 @@ void TextIteratorAlgorithm<Strategy>::Advance() { |
iteration_progress_ = kHandledNone; |
// how would this ever be? |
- if (text_state_.PositionNode()) |
+ if (text_state_->PositionNode()) |
return; |
} |
} |
@@ -473,16 +475,16 @@ void TextIteratorAlgorithm<Strategy>::HandleTextNode() { |
// an offset range with unbounded endpoint(s) in an easy but still clear way. |
if (node_ != start_container_) { |
if (node_ != end_container_) |
- text_node_handler_.HandleTextNodeWhole(text); |
+ text_node_handler_->HandleTextNodeWhole(text); |
else |
- text_node_handler_.HandleTextNodeEndAt(text, end_offset_); |
+ text_node_handler_->HandleTextNodeEndAt(text, end_offset_); |
return; |
} |
if (node_ != end_container_) { |
- text_node_handler_.HandleTextNodeStartFrom(text, start_offset_); |
+ text_node_handler_->HandleTextNodeStartFrom(text, start_offset_); |
return; |
} |
- text_node_handler_.HandleTextNodeInRange(text, start_offset_, end_offset_); |
+ text_node_handler_->HandleTextNodeInRange(text, start_offset_, end_offset_); |
} |
template <typename Strategy> |
@@ -519,9 +521,9 @@ void TextIteratorAlgorithm<Strategy>::HandleReplacedElement() { |
return; |
} |
- DCHECK_EQ(last_text_node_, text_node_handler_.GetNode()); |
+ DCHECK_EQ(last_text_node_, text_node_handler_->GetNode()); |
if (last_text_node_) { |
- if (text_node_handler_.FixLeadingWhiteSpaceForReplacedElement( |
+ if (text_node_handler_->FixLeadingWhiteSpaceForReplacedElement( |
Strategy::Parent(*last_text_node_))) { |
needs_handle_replaced_element_ = true; |
return; |
@@ -541,11 +543,11 @@ void TextIteratorAlgorithm<Strategy>::HandleReplacedElement() { |
return; |
} |
- text_state_.UpdateForReplacedElement(node_); |
+ text_state_->UpdateForReplacedElement(node_); |
if (EmitsImageAltText() && TextIterator::SupportsAltText(node_)) { |
- text_state_.EmitAltText(node_); |
- if (text_state_.length()) |
+ text_state_->EmitAltText(node_); |
+ if (text_state_->length()) |
return; |
} |
} |
@@ -673,11 +675,11 @@ bool TextIteratorAlgorithm<Strategy>::ShouldRepresentNodeOffsetZero() { |
// Leave element positioned flush with start of a paragraph |
// (e.g. do not insert tab before a table cell at the start of a paragraph) |
- if (text_state_.LastCharacter() == '\n') |
+ if (text_state_->LastCharacter() == '\n') |
return false; |
// Otherwise, show the position if we have emitted any characters |
- if (text_state_.HasEmitted()) |
+ if (text_state_->HasEmitted()) |
return true; |
// We've not emitted anything yet. Generally, there is no need for any |
@@ -782,7 +784,7 @@ void TextIteratorAlgorithm<Strategy>::ExitNode() { |
// FIXME: !m_hasEmitted does not necessarily mean there was a collapsed |
// block... it could have been an hr (e.g.). Also, a collapsed block could |
// have height (e.g. a table) and therefore look like a blank line. |
- if (!text_state_.HasEmitted()) |
+ if (!text_state_->HasEmitted()) |
return; |
// Emit with a position *inside* m_node, after m_node's contents, in |
@@ -801,7 +803,7 @@ void TextIteratorAlgorithm<Strategy>::ExitNode() { |
// FIXME: We need to emit a '\n' as we leave an empty block(s) that |
// contain a VisiblePosition when doing selection preservation. |
- if (text_state_.LastCharacter() != '\n') { |
+ if (text_state_->LastCharacter() != '\n') { |
// insert a newline with a position following this block's contents. |
SpliceBuffer(kNewlineCharacter, Strategy::Parent(*base_node), base_node, |
1, 1); |
@@ -816,7 +818,7 @@ void TextIteratorAlgorithm<Strategy>::ExitNode() { |
} |
// If nothing was emitted, see if we need to emit a space. |
- if (!text_state_.PositionNode() && ShouldEmitSpaceBeforeAndAfterNode(node_)) |
+ if (!text_state_->PositionNode() && ShouldEmitSpaceBeforeAndAfterNode(node_)) |
SpliceBuffer(kSpaceCharacter, Strategy::Parent(*base_node), base_node, 1, |
1); |
} |
@@ -827,16 +829,16 @@ void TextIteratorAlgorithm<Strategy>::SpliceBuffer(UChar c, |
Node* offset_base_node, |
int text_start_offset, |
int text_end_offset) { |
- text_state_.SpliceBuffer(c, text_node, offset_base_node, text_start_offset, |
- text_end_offset); |
- text_node_handler_.ResetCollapsedWhiteSpaceFixup(); |
+ text_state_->SpliceBuffer(c, text_node, offset_base_node, text_start_offset, |
+ text_end_offset); |
+ text_node_handler_->ResetCollapsedWhiteSpaceFixup(); |
} |
template <typename Strategy> |
EphemeralRangeTemplate<Strategy> TextIteratorAlgorithm<Strategy>::Range() |
const { |
// use the current run information, if we have it |
- if (text_state_.PositionNode()) { |
+ if (text_state_->PositionNode()) { |
return EphemeralRangeTemplate<Strategy>(StartPositionInCurrentContainer(), |
EndPositionInCurrentContainer()); |
} |
@@ -851,8 +853,8 @@ EphemeralRangeTemplate<Strategy> TextIteratorAlgorithm<Strategy>::Range() |
template <typename Strategy> |
Document* TextIteratorAlgorithm<Strategy>::OwnerDocument() const { |
- if (text_state_.PositionNode()) |
- return &text_state_.PositionNode()->GetDocument(); |
+ if (text_state_->PositionNode()) |
+ return &text_state_->PositionNode()->GetDocument(); |
if (end_container_) |
return &end_container_->GetDocument(); |
return 0; |
@@ -860,7 +862,7 @@ Document* TextIteratorAlgorithm<Strategy>::OwnerDocument() const { |
template <typename Strategy> |
Node* TextIteratorAlgorithm<Strategy>::GetNode() const { |
- if (text_state_.PositionNode() || end_container_) { |
+ if (text_state_->PositionNode() || end_container_) { |
Node* node = CurrentContainer(); |
if (node->IsCharacterDataNode()) |
return node; |
@@ -871,9 +873,9 @@ Node* TextIteratorAlgorithm<Strategy>::GetNode() const { |
template <typename Strategy> |
int TextIteratorAlgorithm<Strategy>::StartOffsetInCurrentContainer() const { |
- if (text_state_.PositionNode()) { |
- text_state_.FlushPositionOffsets(); |
- return text_state_.PositionStartOffset() + text_state_.TextStartOffset(); |
+ if (text_state_->PositionNode()) { |
+ text_state_->FlushPositionOffsets(); |
+ return text_state_->PositionStartOffset() + text_state_->TextStartOffset(); |
} |
DCHECK(end_container_); |
return end_offset_; |
@@ -881,9 +883,9 @@ int TextIteratorAlgorithm<Strategy>::StartOffsetInCurrentContainer() const { |
template <typename Strategy> |
int TextIteratorAlgorithm<Strategy>::EndOffsetInCurrentContainer() const { |
- if (text_state_.PositionNode()) { |
- text_state_.FlushPositionOffsets(); |
- return text_state_.PositionEndOffset() + text_state_.TextStartOffset(); |
+ if (text_state_->PositionNode()) { |
+ text_state_->FlushPositionOffsets(); |
+ return text_state_->PositionEndOffset() + text_state_->TextStartOffset(); |
} |
DCHECK(end_container_); |
return end_offset_; |
@@ -891,8 +893,8 @@ int TextIteratorAlgorithm<Strategy>::EndOffsetInCurrentContainer() const { |
template <typename Strategy> |
Node* TextIteratorAlgorithm<Strategy>::CurrentContainer() const { |
- if (text_state_.PositionNode()) { |
- return text_state_.PositionNode(); |
+ if (text_state_->PositionNode()) { |
+ return text_state_->PositionNode(); |
} |
DCHECK(end_container_); |
return end_container_; |
@@ -966,7 +968,7 @@ void TextIteratorAlgorithm<Strategy>::CopyCodeUnitsTo( |
ForwardsTextBuffer* output, |
int position, |
int copy_length) const { |
- text_state_.AppendTextTo(output, position, copy_length); |
+ text_state_->AppendTextTo(output, position, copy_length); |
} |
// -------- |