Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(932)

Unified Diff: Source/core/editing/TextIterator.cpp

Issue 210363006: Add a constructor to TextIterator taking two Positions as iteration range. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/editing/TextIterator.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/editing/TextIterator.cpp
diff --git a/Source/core/editing/TextIterator.cpp b/Source/core/editing/TextIterator.cpp
index 3c452ce0bcb46bf8bd74f4379d47a8edb93838d9..2120c104c1d30bc9f379d2d4c7befa6f28da19ad 100644
--- a/Source/core/editing/TextIterator.cpp
+++ b/Source/core/editing/TextIterator.cpp
@@ -247,9 +247,15 @@ TextIterator::TextIterator(const Range* range, TextIteratorBehaviorFlags behavio
, m_endOffset(0)
, m_positionNode(0)
, m_textLength(0)
+ , m_needsAnotherNewline(false)
+ , m_textBox(0)
, m_remainingTextBox(0)
, m_firstLetterText(0)
+ , m_lastTextNode(0)
+ , m_lastTextNodeEndedWithCollapsedSpace(false)
+ , m_lastCharacter(0)
, m_sortedTextBoxesPosition(0)
+ , m_hasEmitted(false)
, m_emitsCharactersBetweenAllVisiblePositions(behavior & TextIteratorEmitsCharactersBetweenAllVisiblePositions)
, m_entersTextControls(behavior & TextIteratorEntersTextControls)
, m_emitsOriginalText(behavior & TextIteratorEmitsOriginalText)
@@ -260,49 +266,81 @@ TextIterator::TextIterator(const Range* range, TextIteratorBehaviorFlags behavio
, m_emitsImageAltText(behavior & TextIteratorEmitsImageAltText)
, m_entersAuthorShadowRoots(behavior & TextIteratorEntersAuthorShadowRoots)
{
- if (!range)
- return;
+ if (range)
+ initialize(range->startPosition(), range->endPosition());
+}
+
+TextIterator::TextIterator(const Position& start, const Position& end, TextIteratorBehaviorFlags behavior)
+ : m_shadowDepth(0)
+ , m_startContainer(0)
+ , m_startOffset(0)
+ , m_endContainer(0)
+ , m_endOffset(0)
+ , m_positionNode(0)
+ , m_textLength(0)
+ , m_needsAnotherNewline(false)
+ , m_textBox(0)
+ , m_remainingTextBox(0)
+ , m_firstLetterText(0)
+ , m_lastTextNode(0)
+ , m_lastTextNodeEndedWithCollapsedSpace(false)
+ , m_lastCharacter(0)
+ , m_sortedTextBoxesPosition(0)
+ , m_hasEmitted(false)
+ , m_emitsCharactersBetweenAllVisiblePositions(behavior & TextIteratorEmitsCharactersBetweenAllVisiblePositions)
+ , m_entersTextControls(behavior & TextIteratorEntersTextControls)
+ , m_emitsOriginalText(behavior & TextIteratorEmitsOriginalText)
+ , m_handledFirstLetter(false)
+ , m_ignoresStyleVisibility(behavior & TextIteratorIgnoresStyleVisibility)
+ , m_stopsOnFormControls(behavior & TextIteratorStopsOnFormControls)
+ , m_shouldStop(false)
+ , m_emitsImageAltText(behavior & TextIteratorEmitsImageAltText)
+ , m_entersAuthorShadowRoots(behavior & TextIteratorEntersAuthorShadowRoots)
yosin_UTC9 2014/03/26 01:08:02 Once Blink incorporate C++11 delegating constructo
Yuta Kitamura 2014/03/26 01:58:58 Yup; actually this long initializer list is kind o
+{
+ initialize(start, end);
+}
+
+void TextIterator::initialize(const Position& start, const Position& end)
+{
+ ASSERT(comparePositions(start, end) <= 0);
- // get and validate the range endpoints
- Node* startContainer = range->startContainer();
+ // Get and validate |start| and |end|.
+ Node* startContainer = start.containerNode();
if (!startContainer)
return;
- int startOffset = range->startOffset();
- Node* endContainer = range->endContainer();
- int endOffset = range->endOffset();
-
- // Callers should be handing us well-formed ranges. If we discover that this isn't
- // the case, we could consider changing this assertion to an early return.
- ASSERT(range->boundaryPointsValid());
+ int startOffset = start.computeOffsetInContainerNode();
+ Node* endContainer = end.containerNode();
+ if (!endContainer)
+ return;
+ int endOffset = end.computeOffsetInContainerNode();
- // remember range - this does not change
+ // Remember the range - this does not change.
m_startContainer = startContainer;
m_startOffset = startOffset;
m_endContainer = endContainer;
m_endOffset = endOffset;
- // set up the current node for processing
- m_node = range->firstNode();
+ // Set up the current node for processing.
+ if (startContainer->offsetInCharacters())
+ m_node = startContainer;
+ else if (Node* child = startContainer->traverseToChildAt(startOffset))
+ m_node = child;
+ else if (!startOffset)
+ m_node = startContainer;
+ else
+ m_node = NodeTraversal::nextSkippingChildren(*startContainer);
+
if (!m_node)
return;
+
setUpFullyClippedStack(m_fullyClippedStack, m_node);
m_offset = m_node == m_startContainer ? m_startOffset : 0;
m_iterationProgress = HandledNone;
- // calculate first out of bounds node
+ // Calculate first out of bounds node.
m_pastEndNode = nextInPreOrderCrossingShadowBoundaries(endContainer, endOffset);
- // initialize node processing state
- m_needsAnotherNewline = false;
- m_textBox = 0;
-
- // initialize record of previous node processing
- m_hasEmitted = false;
- m_lastTextNode = 0;
- m_lastTextNodeEndedWithCollapsedSpace = false;
- m_lastCharacter = 0;
-
- // identify the first run
+ // Identify the first run.
advance();
}
« no previous file with comments | « Source/core/editing/TextIterator.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698