diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/editing/SurroundingText.cpp')
-rw-r--r-- | chromium/third_party/WebKit/Source/core/editing/SurroundingText.cpp | 68 |
1 files changed, 49 insertions, 19 deletions
diff --git a/chromium/third_party/WebKit/Source/core/editing/SurroundingText.cpp b/chromium/third_party/WebKit/Source/core/editing/SurroundingText.cpp index e90e9e717e8..ca1a5ed17d8 100644 --- a/chromium/third_party/WebKit/Source/core/editing/SurroundingText.cpp +++ b/chromium/third_party/WebKit/Source/core/editing/SurroundingText.cpp @@ -32,52 +32,77 @@ #include "core/editing/SurroundingText.h" #include "core/dom/Document.h" +#include "core/dom/Element.h" +#include "core/dom/Position.h" #include "core/dom/Range.h" #include "core/editing/TextIterator.h" -#include "core/editing/VisiblePosition.h" -#include "core/editing/VisibleUnits.h" namespace WebCore { -SurroundingText::SurroundingText(const VisiblePosition& visiblePosition, unsigned maxLength) - : m_positionOffsetInContent(0) +SurroundingText::SurroundingText(const Range& range, unsigned maxLength) + : m_startOffsetInContent(0) + , m_endOffsetInContent(0) { - if (visiblePosition.isNull()) - return; + initialize(range.startPosition(), range.endPosition(), maxLength); +} + +SurroundingText::SurroundingText(const Position& position, unsigned maxLength) + : m_startOffsetInContent(0) + , m_endOffsetInContent(0) +{ + initialize(position, position, maxLength); +} + +void SurroundingText::initialize(const Position& startPosition, const Position& endPosition, unsigned maxLength) +{ + ASSERT(startPosition.document() == endPosition.document()); const unsigned halfMaxLength = maxLength / 2; - CharacterIterator forwardIterator(makeRange(visiblePosition, endOfDocument(visiblePosition)).get(), TextIteratorStopsOnFormControls); + + Document* document = startPosition.document(); + // The position will have no document if it is null (as in no position). + if (!document) + return; + + // 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 = Range::create(*document, endPosition, lastPositionInNode(document->documentElement()).parentAnchoredEquivalent()); + 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); - Position position = visiblePosition.deepEquivalent().parentAnchoredEquivalent(); - Document* document = position.document(); - ASSERT(document); - RefPtr<Range> forwardRange = forwardIterator.range(); - if (!forwardRange || !Range::create(*document, position, forwardRange->startPosition())->text().length()) { + forwardRange = forwardIterator.range(); + if (!forwardRange || !Range::create(*document, endPosition, forwardRange->startPosition())->text().length()) { ASSERT(forwardRange); return; } - BackwardsCharacterIterator backwardsIterator(makeRange(startOfDocument(visiblePosition), visiblePosition).get(), TextIteratorStopsOnFormControls); + // 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 = Range::create(*document, firstPositionInNode(document->documentElement()).parentAnchoredEquivalent(), startPosition); + BackwardsCharacterIterator backwardsIterator(backwardsRange.get(), TextIteratorStopsOnFormControls); if (!backwardsIterator.atEnd()) backwardsIterator.advance(halfMaxLength); - RefPtr<Range> backwardsRange = backwardsIterator.range(); + backwardsRange = backwardsIterator.range(); if (!backwardsRange) { ASSERT(backwardsRange); 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); } -PassRefPtr<Range> SurroundingText::rangeFromContentOffsets(unsigned startOffsetInContent, unsigned endOffsetInContent) +PassRefPtrWillBeRawPtr<Range> SurroundingText::rangeFromContentOffsets(unsigned startOffsetInContent, unsigned endOffsetInContent) { if (startOffsetInContent >= endOffsetInContent || endOffsetInContent > content().length()) - return 0; + return nullptr; CharacterIterator iterator(m_contentRange.get()); @@ -104,9 +129,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 |