Index: Source/core/editing/SurroundingText.cpp |
diff --git a/Source/core/editing/SurroundingText.cpp b/Source/core/editing/SurroundingText.cpp |
index e005ce0f96d7285eb19f3e7a9cfd45a2876f3436..01fd7bb8121d6ba841cbeda155d66d72588a54f7 100644 |
--- a/Source/core/editing/SurroundingText.cpp |
+++ b/Source/core/editing/SurroundingText.cpp |
@@ -39,26 +39,41 @@ |
namespace WebCore { |
+SurroundingText::SurroundingText(const Position& startPosition, const Position& endPosition, unsigned maxLength) |
+ : m_startOffsetInContent(0) |
+ , m_endOffsetInContent(0) |
+{ |
+ process(startPosition, endPosition, maxLength); |
+} |
+ |
SurroundingText::SurroundingText(const Position& position, unsigned maxLength) |
- : m_positionOffsetInContent(0) |
+ : m_startOffsetInContent(0) |
+ , m_endOffsetInContent(0) |
{ |
- const unsigned halfMaxLength = maxLength / 2; |
+ process(position, position, maxLength); |
+} |
- Document* document = position.document(); |
- // The |position| will have no document if it is null (as in no position). |
- if (!document) |
+void SurroundingText::process(const Position& startPosition, const Position& endPosition, unsigned maxLength) |
+{ |
+ if (startPosition.isNull() || endPosition.isNull()) |
return; |
+ const unsigned halfMaxLength = maxLength / 2; |
+ |
+ Document* document = startPosition.document(); |
+ ASSERT(document && startPosition.document() == endPosition.document()); |
+ |
// The forward range starts at the selection end and ends at the document's |
// end. It will then be updated to only contain the text in the text in the |
// right range around the selection. |
- RefPtrWillBeRawPtr<Range> forwardRange = makeRange(position, lastPositionInNode(document->documentElement())); |
+ RefPtrWillBeRawPtr<Range> forwardRange = makeRange(endPosition, lastPositionInNode(document->documentElement())); |
CharacterIterator forwardIterator(forwardRange.get(), TextIteratorStopsOnFormControls); |
+ // FIXME: why do we stop going trough the text if we were not able to select something on the right? |
if (!forwardIterator.atEnd()) |
forwardIterator.advance(maxLength - halfMaxLength); |
forwardRange = forwardIterator.range(); |
- if (!forwardRange || !Range::create(*document, position, forwardRange->startPosition())->text().length()) { |
+ if (!forwardRange || !Range::create(*document, endPosition, forwardRange->startPosition())->text().length()) { |
ASSERT(forwardRange); |
return; |
} |
@@ -66,7 +81,7 @@ SurroundingText::SurroundingText(const Position& position, unsigned maxLength) |
// Same as with the forward range but with the backward range. The range |
// starts at the document's start and ends at the selection start and will |
// be updated. |
- RefPtrWillBeRawPtr<Range> backwardsRange = makeRange(firstPositionInNode(document->documentElement()), position); |
+ RefPtrWillBeRawPtr<Range> backwardsRange = makeRange(firstPositionInNode(document->documentElement()), startPosition); |
BackwardsCharacterIterator backwardsIterator(backwardsRange.get(), TextIteratorStopsOnFormControls); |
if (!backwardsIterator.atEnd()) |
backwardsIterator.advance(halfMaxLength); |
@@ -77,7 +92,8 @@ SurroundingText::SurroundingText(const Position& position, unsigned maxLength) |
return; |
} |
- m_positionOffsetInContent = Range::create(*document, backwardsRange->endPosition(), position)->text().length(); |
+ m_startOffsetInContent = Range::create(*document, backwardsRange->endPosition(), startPosition)->text().length(); |
+ m_endOffsetInContent = Range::create(*document, backwardsRange->endPosition(), endPosition)->text().length(); |
m_contentRange = Range::create(*document, backwardsRange->endPosition(), forwardRange->startPosition()); |
ASSERT(m_contentRange); |
} |
@@ -112,9 +128,14 @@ String SurroundingText::content() const |
return String(); |
} |
-unsigned SurroundingText::positionOffsetInContent() const |
+unsigned SurroundingText::startOffsetInContent() const |
+{ |
+ return m_startOffsetInContent; |
+} |
+ |
+unsigned SurroundingText::endOffsetInContent() const |
{ |
- return m_positionOffsetInContent; |
+ return m_endOffsetInContent; |
} |
} // namespace WebCore |