| 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..10ec32134f29413470dc2baea4968a5f93518200 100644
|
| --- a/Source/core/editing/spellcheck/TextCheckingHelper.cpp
|
| +++ b/Source/core/editing/spellcheck/TextCheckingHelper.cpp
|
| @@ -27,8 +27,6 @@
|
| #include "config.h"
|
| #include "core/editing/spellcheck/TextCheckingHelper.h"
|
|
|
| -#include "bindings/core/v8/ExceptionState.h"
|
| -#include "bindings/core/v8/ExceptionStatePlaceholder.h"
|
| #include "core/dom/Document.h"
|
| #include "core/dom/Range.h"
|
| #include "core/editing/VisiblePosition.h"
|
| @@ -99,21 +97,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 +115,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,99 +124,109 @@ 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
|
| +int TextCheckingParagraph::offsetTo(const Position& position) const
|
| {
|
| - ASSERT(m_checkingRange);
|
| - RefPtrWillBeRawPtr<Range> range = offsetAsRange()->cloneRange();
|
| - range->setEnd(position.computeContainerNode(), position.computeOffsetInContainerNode(), exceptionState);
|
| - if (exceptionState.hadException())
|
| - return 0;
|
| - return TextIterator::rangeLength(range->startPosition(), range->endPosition());
|
| + ASSERT(m_checkingRange.isNotNull());
|
| + return TextIterator::rangeLength(offsetAsRange().startPosition(), position);
|
| }
|
|
|
| bool TextCheckingParagraph::isEmpty() const
|
| {
|
| - // Both predicates should have same result, but we check both just for sure.
|
| + // Both predicates should have same result, but we check both just to be sure.
|
| // We need to investigate to remove this redundancy.
|
| 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;
|
| }
|
|
|
| @@ -237,7 +241,7 @@ TextCheckingHelper::~TextCheckingHelper()
|
| {
|
| }
|
|
|
| -String TextCheckingHelper::findFirstMisspelling(int& firstMisspellingOffset, bool markAll, RefPtrWillBeRawPtr<Range>& firstMisspellingRange)
|
| +String TextCheckingHelper::findFirstMisspelling(int& firstMisspellingOffset, bool markAll)
|
| {
|
| WordAwareIterator it(m_start, m_end);
|
| firstMisspellingOffset = 0;
|
| @@ -274,7 +278,6 @@ String TextCheckingHelper::findFirstMisspelling(int& firstMisspellingOffset, boo
|
| if (!firstMisspelling) {
|
| firstMisspellingOffset = currentChunkOffset + misspellingLocation;
|
| firstMisspelling = it.substring(misspellingLocation, misspellingLength);
|
| - firstMisspellingRange = Range::create(misspellingRange.document(), m_start, m_end);
|
| }
|
|
|
| // Store marker for misspelled word.
|
| @@ -460,7 +463,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;
|
| @@ -505,17 +508,17 @@ String TextCheckingHelper::findFirstBadGrammar(GrammarDetail& outGrammarDetail,
|
| return firstBadGrammarPhrase;
|
| }
|
|
|
| -void TextCheckingHelper::markAllMisspellings(RefPtrWillBeRawPtr<Range>& firstMisspellingRange)
|
| +bool TextCheckingHelper::markAllMisspellings()
|
| {
|
| // Use the "markAll" feature of findFirstMisspelling. Ignore the return value and the "out parameter";
|
| // all we need to do is mark every instance.
|
| int ignoredOffset;
|
| - findFirstMisspelling(ignoredOffset, true, firstMisspellingRange);
|
| + return findFirstMisspelling(ignoredOffset, true).isEmpty();
|
| }
|
|
|
| void TextCheckingHelper::markAllBadGrammar()
|
| {
|
| - // Use the "markAll" feature of ofindFirstBadGrammar. Ignore the return value and "out parameters"; all we need to
|
| + // Use the "markAll" feature of findFirstBadGrammar. Ignore the return value and "out parameters"; all we need to
|
| // do is mark every instance.
|
| GrammarDetail ignoredGrammarDetail;
|
| int ignoredOffset;
|
|
|