Chromium Code Reviews| Index: Source/core/editing/spellcheck/TextCheckingHelper.cpp |
| diff --git a/Source/core/editing/spellcheck/TextCheckingHelper.cpp b/Source/core/editing/spellcheck/TextCheckingHelper.cpp |
| index ede8e89051d753aef1a661c68875df45601cc79e..6afde0a6377d5d193864859aa42ff7680299f2b2 100644 |
| --- a/Source/core/editing/spellcheck/TextCheckingHelper.cpp |
| +++ b/Source/core/editing/spellcheck/TextCheckingHelper.cpp |
| @@ -99,21 +99,17 @@ static void findMisspellings(TextCheckerClient& client, const UChar* text, int s |
| } |
| } |
| -void expandRangeToSentenceBoundary(Range& range) |
| +EphemeralRange expandRangeToSentenceBoundary(const EphemeralRange& range) |
| { |
| - range.setStart(startOfSentence(createVisiblePosition(range.startPosition())).deepEquivalent()); |
| - range.setEnd(endOfSentence(createVisiblePosition(range.endPosition())).deepEquivalent()); |
| + return EphemeralRange(startOfSentence(createVisiblePosition(range.startPosition())).deepEquivalent(), endOfSentence(createVisiblePosition(range.endPosition())).deepEquivalent()); |
| } |
| -static PassRefPtrWillBeRawPtr<Range> expandToParagraphBoundary(PassRefPtrWillBeRawPtr<Range> range) |
| +static EphemeralRange expandToParagraphBoundary(const EphemeralRange& range) |
| { |
| - RefPtrWillBeRawPtr<Range> paragraphRange = range->cloneRange(); |
| - paragraphRange->setStart(startOfParagraph(createVisiblePosition(range->startPosition())).deepEquivalent()); |
| - paragraphRange->setEnd(endOfParagraph(createVisiblePosition(range->endPosition())).deepEquivalent()); |
| - return paragraphRange; |
| + return EphemeralRange(startOfParagraph(createVisiblePosition(range.startPosition())).deepEquivalent(), endOfParagraph(createVisiblePosition(range.endPosition())).deepEquivalent()); |
| } |
| -TextCheckingParagraph::TextCheckingParagraph(PassRefPtrWillBeRawPtr<Range> checkingRange) |
| +TextCheckingParagraph::TextCheckingParagraph(const EphemeralRange checkingRange) |
| : m_checkingRange(checkingRange) |
| , m_checkingStart(-1) |
| , m_checkingEnd(-1) |
| @@ -121,7 +117,7 @@ TextCheckingParagraph::TextCheckingParagraph(PassRefPtrWillBeRawPtr<Range> check |
| { |
| } |
| -TextCheckingParagraph::TextCheckingParagraph(PassRefPtrWillBeRawPtr<Range> checkingRange, PassRefPtrWillBeRawPtr<Range> paragraphRange) |
| +TextCheckingParagraph::TextCheckingParagraph(const EphemeralRange checkingRange, const EphemeralRange paragraphRange) |
| : m_checkingRange(checkingRange) |
| , m_paragraphRange(paragraphRange) |
| , m_checkingStart(-1) |
| @@ -130,52 +126,68 @@ TextCheckingParagraph::TextCheckingParagraph(PassRefPtrWillBeRawPtr<Range> check |
| { |
| } |
| +TextCheckingParagraph::TextCheckingParagraph(PassRefPtrWillBeRawPtr<Range> checkingRange, PassRefPtrWillBeRawPtr<Range> paragraphRange) |
| + : m_checkingRange(checkingRange.get()) |
| + , m_paragraphRange(paragraphRange.get()) |
| + , m_checkingStart(-1) |
| + , m_checkingEnd(-1) |
| + , m_checkingLength(-1) |
| +{ |
| +} |
| + |
| TextCheckingParagraph::~TextCheckingParagraph() |
| { |
| } |
| void TextCheckingParagraph::expandRangeToNextEnd() |
| { |
| - ASSERT(m_checkingRange); |
| - paragraphRange()->setEnd(endOfParagraph(startOfNextParagraph(createVisiblePosition(paragraphRange()->startPosition()))).deepEquivalent()); |
| + ASSERT(m_checkingRange.isNotNull()); |
| + setParagraphRange(EphemeralRange(paragraphRange().startPosition(), endOfParagraph(startOfNextParagraph(createVisiblePosition(paragraphRange().startPosition()))).deepEquivalent())); |
| invalidateParagraphRangeValues(); |
| } |
| void TextCheckingParagraph::invalidateParagraphRangeValues() |
| { |
| m_checkingStart = m_checkingEnd = -1; |
| - m_offsetAsRange = nullptr; |
| + m_offsetAsRange = EphemeralRange(); |
| m_text = String(); |
| } |
| int TextCheckingParagraph::rangeLength() const |
| { |
| - ASSERT(m_checkingRange); |
| - return TextIterator::rangeLength(paragraphRange()->startPosition(), paragraphRange()->endPosition()); |
| + ASSERT(m_checkingRange.isNotNull()); |
| + return TextIterator::rangeLength(paragraphRange().startPosition(), paragraphRange().endPosition()); |
| } |
| -PassRefPtrWillBeRawPtr<Range> TextCheckingParagraph::paragraphRange() const |
| +EphemeralRange TextCheckingParagraph::paragraphRange() const |
| { |
| - ASSERT(m_checkingRange); |
| - if (!m_paragraphRange) |
| + ASSERT(m_checkingRange.isNotNull()); |
| + if (m_paragraphRange.isNull()) |
| m_paragraphRange = expandToParagraphBoundary(checkingRange()); |
| return m_paragraphRange; |
| } |
| -PassRefPtrWillBeRawPtr<Range> TextCheckingParagraph::subrange(int characterOffset, int characterCount) const |
| +void TextCheckingParagraph::setParagraphRange(const EphemeralRange& range) |
| +{ |
| + m_paragraphRange = range; |
| +} |
| + |
| +EphemeralRange TextCheckingParagraph::subrange(int characterOffset, int characterCount) const |
| { |
| - ASSERT(m_checkingRange); |
| - return createRange(calculateCharacterSubrange(EphemeralRange(paragraphRange().get()), characterOffset, characterCount)); |
| + ASSERT(m_checkingRange.isNotNull()); |
| + return calculateCharacterSubrange(paragraphRange(), characterOffset, characterCount); |
| } |
| int TextCheckingParagraph::offsetTo(const Position& position, ExceptionState& exceptionState) const |
| { |
| - ASSERT(m_checkingRange); |
| - RefPtrWillBeRawPtr<Range> range = offsetAsRange()->cloneRange(); |
| + ASSERT(m_checkingRange.isNotNull()); |
| + RefPtrWillBeRawPtr<Range> range = createRange(offsetAsRange()); |
|
yosin_UTC9
2015/09/10 01:58:39
Let's avoid to use |Range|.
This could be:
return
sof
2015/09/10 06:12:10
Don't we need to account for the exception-raising
yosin_UTC9
2015/09/10 06:37:03
Since caller is SpellChecker::markAndReplaceFor()
sof
2015/09/10 06:42:27
But this is a public function taking an ExceptionS
yosin_UTC9
2015/09/10 07:01:46
Yes, please. We don't want to have V8 thing in spe
sof
2015/09/10 07:16:27
Good, let's simplify that away.
|
| range->setEnd(position.computeContainerNode(), position.computeOffsetInContainerNode(), exceptionState); |
| if (exceptionState.hadException()) |
| return 0; |
| - return TextIterator::rangeLength(range->startPosition(), range->endPosition()); |
| + int offset = TextIterator::rangeLength(range->startPosition(), range->endPosition()); |
| + range->dispose(); |
| + return offset; |
| } |
| bool TextCheckingParagraph::isEmpty() const |
| @@ -185,44 +197,44 @@ bool TextCheckingParagraph::isEmpty() const |
| return isRangeEmpty() || isTextEmpty(); |
| } |
| -PassRefPtrWillBeRawPtr<Range> TextCheckingParagraph::offsetAsRange() const |
| +EphemeralRange TextCheckingParagraph::offsetAsRange() const |
| { |
| - ASSERT(m_checkingRange); |
| - if (!m_offsetAsRange) |
| - m_offsetAsRange = Range::create(paragraphRange()->startContainer()->document(), paragraphRange()->startPosition(), checkingRange()->startPosition()); |
| + ASSERT(m_checkingRange.isNotNull()); |
| + if (m_offsetAsRange.isNull()) |
| + m_offsetAsRange = EphemeralRange(paragraphRange().startPosition(), checkingRange().startPosition()); |
| return m_offsetAsRange; |
| } |
| const String& TextCheckingParagraph::text() const |
| { |
| - ASSERT(m_checkingRange); |
| + ASSERT(m_checkingRange.isNotNull()); |
| if (m_text.isEmpty()) |
| - m_text = plainText(EphemeralRange(paragraphRange().get())); |
| + m_text = plainText(paragraphRange()); |
| return m_text; |
| } |
| int TextCheckingParagraph::checkingStart() const |
| { |
| - ASSERT(m_checkingRange); |
| + ASSERT(m_checkingRange.isNotNull()); |
| if (m_checkingStart == -1) |
| - m_checkingStart = TextIterator::rangeLength(offsetAsRange()->startPosition(), offsetAsRange()->endPosition()); |
| + m_checkingStart = TextIterator::rangeLength(offsetAsRange().startPosition(), offsetAsRange().endPosition()); |
| return m_checkingStart; |
| } |
| int TextCheckingParagraph::checkingEnd() const |
| { |
| - ASSERT(m_checkingRange); |
| + ASSERT(m_checkingRange.isNotNull()); |
| if (m_checkingEnd == -1) |
| - m_checkingEnd = checkingStart() + TextIterator::rangeLength(checkingRange()->startPosition(), checkingRange()->endPosition()); |
| + m_checkingEnd = checkingStart() + TextIterator::rangeLength(checkingRange().startPosition(), checkingRange().endPosition()); |
| return m_checkingEnd; |
| } |
| int TextCheckingParagraph::checkingLength() const |
| { |
| - ASSERT(m_checkingRange); |
| + ASSERT(m_checkingRange.isNotNull()); |
| if (-1 == m_checkingLength) |
| - m_checkingLength = TextIterator::rangeLength(checkingRange()->startPosition(), checkingRange()->endPosition()); |
| + m_checkingLength = TextIterator::rangeLength(checkingRange().startPosition(), checkingRange().endPosition()); |
| return m_checkingLength; |
| } |
| @@ -460,7 +472,7 @@ String TextCheckingHelper::findFirstBadGrammar(GrammarDetail& outGrammarDetail, |
| // Expand the search range to encompass entire paragraphs, since grammar checking needs that much context. |
| // Determine the character offset from the start of the paragraph to the start of the original search range, |
| // since we will want to ignore results in this area. |
| - TextCheckingParagraph paragraph(Range::create(m_start.computeContainerNode()->document(), m_start, m_end)); |
| + TextCheckingParagraph paragraph(EphemeralRange(m_start, m_end)); |
| // Start checking from beginning of paragraph, but skip past results that occur before the start of the original search range. |
| int startOffset = 0; |