This source file includes following definitions.
- rangeFromContentOffsets
- content
- positionOffsetInContent
#include "config.h"
#include "core/editing/SurroundingText.h"
#include "core/dom/Document.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)
{
if (visiblePosition.isNull())
return;
const unsigned halfMaxLength = maxLength / 2;
CharacterIterator forwardIterator(makeRange(visiblePosition, endOfDocument(visiblePosition)).get(), TextIteratorStopsOnFormControls);
if (!forwardIterator.atEnd())
forwardIterator.advance(maxLength - halfMaxLength);
Position position = visiblePosition.deepEquivalent().parentAnchoredEquivalent();
Document* document = position.document();
ASSERT(document);
RefPtrWillBeRawPtr<Range> forwardRange = forwardIterator.range();
if (!forwardRange || !Range::create(*document, position, forwardRange->startPosition())->text().length()) {
ASSERT(forwardRange);
return;
}
BackwardsCharacterIterator backwardsIterator(makeRange(startOfDocument(visiblePosition), visiblePosition).get(), TextIteratorStopsOnFormControls);
if (!backwardsIterator.atEnd())
backwardsIterator.advance(halfMaxLength);
RefPtrWillBeRawPtr<Range> backwardsRange = backwardsIterator.range();
if (!backwardsRange) {
ASSERT(backwardsRange);
return;
}
m_positionOffsetInContent = Range::create(*document, backwardsRange->endPosition(), position)->text().length();
m_contentRange = Range::create(*document, backwardsRange->endPosition(), forwardRange->startPosition());
ASSERT(m_contentRange);
}
PassRefPtrWillBeRawPtr<Range> SurroundingText::rangeFromContentOffsets(unsigned startOffsetInContent, unsigned endOffsetInContent)
{
if (startOffsetInContent >= endOffsetInContent || endOffsetInContent > content().length())
return nullptr;
CharacterIterator iterator(m_contentRange.get());
ASSERT(!iterator.atEnd());
iterator.advance(startOffsetInContent);
ASSERT(iterator.range());
Position start = iterator.range()->startPosition();
ASSERT(!iterator.atEnd());
iterator.advance(endOffsetInContent - startOffsetInContent);
ASSERT(iterator.range());
Position end = iterator.range()->startPosition();
ASSERT(start.document());
return Range::create(*start.document(), start, end);
}
String SurroundingText::content() const
{
if (m_contentRange)
return m_contentRange->text();
return String();
}
unsigned SurroundingText::positionOffsetInContent() const
{
return m_positionOffsetInContent;
}
}