Index: third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp |
diff --git a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp |
index 32854e4b03abc65190d17347c1cc930e1f95868d..931a12f679b2e71586a9b4ad451789373405eaff 100644 |
--- a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp |
+++ b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp |
@@ -123,31 +123,32 @@ void SpellChecker::toggleContinuousSpellChecking() |
void SpellChecker::didBeginEditing(Element* element) |
{ |
- if (isContinuousSpellCheckingEnabled() && unifiedTextCheckerEnabled()) { |
- bool isTextField = false; |
- HTMLTextFormControlElement* enclosingHTMLTextFormControlElement = 0; |
- if (!isHTMLTextFormControlElement(*element)) |
- enclosingHTMLTextFormControlElement = enclosingTextFormControl(Position::firstPositionInNode(element)); |
- element = enclosingHTMLTextFormControlElement ? enclosingHTMLTextFormControlElement : element; |
- Element* parent = element; |
- if (isHTMLTextFormControlElement(*element)) { |
- HTMLTextFormControlElement* textControl = toHTMLTextFormControlElement(element); |
- parent = textControl; |
- element = textControl->innerEditorElement(); |
- if (!element) |
- return; |
- isTextField = isHTMLInputElement(*textControl) && toHTMLInputElement(*textControl).isTextField(); |
- } |
+ if (!isContinuousSpellCheckingEnabled()) |
+ return; |
- if (isTextField || !parent->isAlreadySpellChecked()) { |
- if (EditingStrategy::editingIgnoresContent(element)) |
- return; |
- // We always recheck textfields because markers are removed from them on blur. |
- VisibleSelection selection = VisibleSelection::selectionFromContentsOfNode(element); |
- markMisspellingsAndBadGrammar(selection); |
- if (!isTextField) |
- parent->setAlreadySpellChecked(true); |
- } |
+ bool isTextField = false; |
+ HTMLTextFormControlElement* enclosingHTMLTextFormControlElement = 0; |
+ if (!isHTMLTextFormControlElement(*element)) |
+ enclosingHTMLTextFormControlElement = enclosingTextFormControl(Position::firstPositionInNode(element)); |
+ element = enclosingHTMLTextFormControlElement ? enclosingHTMLTextFormControlElement : element; |
+ Element* parent = element; |
+ if (isHTMLTextFormControlElement(*element)) { |
+ HTMLTextFormControlElement* textControl = toHTMLTextFormControlElement(element); |
+ parent = textControl; |
+ element = textControl->innerEditorElement(); |
+ if (!element) |
+ return; |
+ isTextField = isHTMLInputElement(*textControl) && toHTMLInputElement(*textControl).isTextField(); |
+ } |
+ |
+ if (isTextField || !parent->isAlreadySpellChecked()) { |
+ if (EditingStrategy::editingIgnoresContent(element)) |
+ return; |
+ // We always recheck textfields because markers are removed from them on blur. |
+ VisibleSelection selection = VisibleSelection::selectionFromContentsOfNode(element); |
+ markMisspellingsAndBadGrammar(selection); |
+ if (!isTextField) |
+ parent->setAlreadySpellChecked(true); |
} |
} |
@@ -226,13 +227,7 @@ void SpellChecker::advanceToNextMisspelling(bool startBeforeSelection) |
int searchEndOffsetAfterWrap = spellingSearchEnd.offsetInContainerNode(); |
int misspellingOffset = 0; |
- String misspelledWord; |
- |
- if (unifiedTextCheckerEnabled()) { |
- misspelledWord = TextCheckingHelper(spellCheckerClient(), spellingSearchStart, spellingSearchEnd).findFirstMisspellingOrBadGrammar(misspellingOffset); |
- } else { |
- misspelledWord = TextCheckingHelper(spellCheckerClient(), spellingSearchStart, spellingSearchEnd).findFirstMisspelling(misspellingOffset, false); |
- } |
+ String misspelledWord = TextCheckingHelper(spellCheckerClient(), spellingSearchStart, spellingSearchEnd).findFirstMisspellingOrBadGrammar(misspellingOffset); |
// If we did not find a misspelled word, wrap and try again (but don't bother if we started at the beginning of the |
// block rather than at a selection). |
@@ -240,12 +235,7 @@ void SpellChecker::advanceToNextMisspelling(bool startBeforeSelection) |
spellingSearchStart = Position::editingPositionOf(topNode, 0); |
// going until the end of the very first chunk we tested is far enough |
spellingSearchEnd = Position::editingPositionOf(searchEndNodeAfterWrap, searchEndOffsetAfterWrap); |
- |
- if (unifiedTextCheckerEnabled()) { |
- misspelledWord = TextCheckingHelper(spellCheckerClient(), spellingSearchStart, spellingSearchEnd).findFirstMisspellingOrBadGrammar(misspellingOffset); |
- } else { |
- misspelledWord = TextCheckingHelper(spellCheckerClient(), spellingSearchStart, spellingSearchEnd).findFirstMisspelling(misspellingOffset, false); |
- } |
+ misspelledWord = TextCheckingHelper(spellCheckerClient(), spellingSearchStart, spellingSearchEnd).findFirstMisspellingOrBadGrammar(misspellingOffset); |
} |
if (!misspelledWord.isEmpty()) { |
@@ -278,26 +268,21 @@ void SpellChecker::clearMisspellingsAndBadGrammar(const VisibleSelection &moving |
void SpellChecker::markMisspellingsAndBadGrammar(const VisibleSelection &movingSelection) |
{ |
- markMisspellingsAndBadGrammar(movingSelection, movingSelection); |
+ markAllMisspellingsAndBadGrammar(movingSelection, movingSelection); |
} |
void SpellChecker::markMisspellingsAfterLineBreak(const VisibleSelection& wordSelection) |
{ |
- TRACE_EVENT0("blink", "SpellChecker::markMisspellingsAfterLineBreak"); |
- |
- if (!unifiedTextCheckerEnabled()) { |
- markMisspellings(wordSelection); |
- return; |
- } |
- |
if (!isContinuousSpellCheckingEnabled()) |
return; |
+ TRACE_EVENT0("blink", "SpellChecker::markMisspellingsAfterLineBreak"); |
+ |
VisibleSelection wholeParagraph( |
startOfParagraph(wordSelection.visibleStart()), |
endOfParagraph(wordSelection.visibleEnd())); |
- markAllMisspellingsAndBadGrammarInRanges(wordSelection.toNormalizedEphemeralRange(), wholeParagraph.toNormalizedEphemeralRange()); |
+ markAllMisspellingsAndBadGrammar(wordSelection, wholeParagraph); |
} |
void SpellChecker::markMisspellingsAfterTypingToWord(const VisiblePosition &wordStart, const VisibleSelection& selectionAfterTyping) |
@@ -307,52 +292,9 @@ void SpellChecker::markMisspellingsAfterTypingToWord(const VisiblePosition &word |
TRACE_EVENT0("blink", "SpellChecker::markMisspellingsAfterTypingToWord"); |
- if (unifiedTextCheckerEnabled()) { |
- VisibleSelection adjacentWords = VisibleSelection(startOfWord(wordStart, LeftWordIfOnBoundary), endOfWord(wordStart, RightWordIfOnBoundary)); |
- VisibleSelection selectedSentence = VisibleSelection(startOfSentence(wordStart), endOfSentence(wordStart)); |
- markAllMisspellingsAndBadGrammarInRanges(adjacentWords.toNormalizedEphemeralRange(), selectedSentence.toNormalizedEphemeralRange()); |
- return; |
- } |
- |
- // Check spelling of one word |
- bool result = markMisspellings(VisibleSelection(startOfWord(wordStart, LeftWordIfOnBoundary), endOfWord(wordStart, RightWordIfOnBoundary))); |
- |
- if (!result) |
- return; |
- |
- // Check grammar of entire sentence |
- markBadGrammar(VisibleSelection(startOfSentence(wordStart), endOfSentence(wordStart))); |
-} |
- |
-bool SpellChecker::markMisspellingsOrBadGrammar(const VisibleSelection& selection, bool checkSpelling) |
-{ |
- // This function is called with a selection already expanded to word boundaries. |
- // Might be nice to assert that here. |
- |
- // This function is used only for as-you-type checking, so if that's off we do nothing. Note that |
- // grammar checking can only be on if spell checking is also on. |
- if (!isContinuousSpellCheckingEnabled()) |
- return false; |
- |
- TRACE_EVENT0("blink", "SpellChecker::markMisspellingsOrBadGrammar"); |
- |
- const EphemeralRange range = selection.toNormalizedEphemeralRange(); |
- if (range.isNull()) |
- return false; |
- |
- // If we're not in an editable node, bail. |
- Node* editableNode = range.startPosition().computeContainerNode(); |
- if (!editableNode || !hasEditableStyle(*editableNode)) |
- return false; |
- |
- if (!isSpellCheckingEnabledFor(editableNode)) |
- return false; |
- |
- TextCheckingHelper checker(spellCheckerClient(), range.startPosition(), range.endPosition()); |
- if (checkSpelling) |
- return checker.markAllMisspellings(); |
- |
- return false; |
+ VisibleSelection adjacentWords = VisibleSelection(startOfWord(wordStart, LeftWordIfOnBoundary), endOfWord(wordStart, RightWordIfOnBoundary)); |
+ VisibleSelection selectedSentence = VisibleSelection(startOfSentence(wordStart), endOfSentence(wordStart)); |
+ markAllMisspellingsAndBadGrammar(adjacentWords, selectedSentence); |
} |
bool SpellChecker::isSpellCheckingEnabledFor(Node* node) const |
@@ -387,21 +329,17 @@ bool SpellChecker::isSpellCheckingEnabledFor(const VisibleSelection& selection) |
return false; |
} |
-bool SpellChecker::markMisspellings(const VisibleSelection& selection) |
-{ |
- return markMisspellingsOrBadGrammar(selection, true); |
-} |
- |
-void SpellChecker::markBadGrammar(const VisibleSelection& selection) |
+void SpellChecker::markAllMisspellingsAndBadGrammar(const VisibleSelection& spellingSelection, const VisibleSelection& grammarSelection) |
{ |
- markMisspellingsOrBadGrammar(selection, false); |
-} |
- |
-void SpellChecker::markAllMisspellingsAndBadGrammarInRanges(const EphemeralRange& spellingRange, const EphemeralRange& grammarRange) |
-{ |
- DCHECK(unifiedTextCheckerEnabled()); |
+ if (!isContinuousSpellCheckingEnabled()) |
+ return; |
// This function is called with selections already expanded to word boundaries. |
+ // This function is triggered by selection change, in which case we check |
+ // spelling and grammar, but don't autocorrect misspellings. |
+ |
+ const EphemeralRange& spellingRange = spellingSelection.toNormalizedEphemeralRange(); |
+ const EphemeralRange& grammarRange = grammarSelection.toNormalizedEphemeralRange(); |
if (spellingRange.isNull() || grammarRange.isNull()) |
return; |
@@ -580,22 +518,6 @@ void SpellChecker::markAndReplaceFor(SpellCheckRequest* request, const Vector<Te |
} |
} |
-void SpellChecker::markMisspellingsAndBadGrammar(const VisibleSelection& spellingSelection, const VisibleSelection& grammarSelection) |
-{ |
- if (unifiedTextCheckerEnabled()) { |
- if (!isContinuousSpellCheckingEnabled()) |
- return; |
- |
- // markMisspellingsAndBadGrammar() is triggered by selection change, in which case we check spelling and grammar, but don't autocorrect misspellings. |
- markAllMisspellingsAndBadGrammarInRanges(spellingSelection.toNormalizedEphemeralRange(), grammarSelection.toNormalizedEphemeralRange()); |
- return; |
- } |
- |
- markMisspellings(spellingSelection); |
- if (isContinuousSpellCheckingEnabled()) |
- markBadGrammar(grammarSelection); |
-} |
- |
void SpellChecker::updateMarkersForWordsAffectedByEditing(bool doNotRemoveIfSelectionAtWordBoundary) |
{ |
DCHECK(frame().selection().isAvailable()); |
@@ -688,8 +610,7 @@ void SpellChecker::didEndEditingOnTextField(Element* e) |
HTMLTextFormControlElement* textFormControlElement = toHTMLTextFormControlElement(e); |
HTMLElement* innerEditor = textFormControlElement->innerEditorElement(); |
DocumentMarker::MarkerTypes markerTypes(DocumentMarker::Spelling); |
- if (unifiedTextCheckerEnabled()) |
- markerTypes.add(DocumentMarker::Grammar); |
+ markerTypes.add(DocumentMarker::Grammar); |
for (Node& node : NodeTraversal::inclusiveDescendantsOf(*innerEditor)) |
frame().document()->markers().removeMarkers(&node, markerTypes); |
} |
@@ -791,18 +712,17 @@ void SpellChecker::spellCheckAfterBlur() |
void SpellChecker::spellCheckOldSelection(const VisibleSelection& oldSelection, const VisibleSelection& newAdjacentWords) |
{ |
+ if (!isContinuousSpellCheckingEnabled()) |
+ return; |
+ |
TRACE_EVENT0("blink", "SpellChecker::spellCheckOldSelection"); |
VisiblePosition oldStart(oldSelection.visibleStart()); |
VisibleSelection oldAdjacentWords = VisibleSelection(startOfWord(oldStart, LeftWordIfOnBoundary), endOfWord(oldStart, RightWordIfOnBoundary)); |
if (oldAdjacentWords == newAdjacentWords) |
return; |
- if (isContinuousSpellCheckingEnabled()) { |
- VisibleSelection selectedSentence = VisibleSelection(startOfSentence(oldStart), endOfSentence(oldStart)); |
- markMisspellingsAndBadGrammar(oldAdjacentWords, selectedSentence); |
- return; |
- } |
- markMisspellingsAndBadGrammar(oldAdjacentWords, oldAdjacentWords); |
+ VisibleSelection selectedSentence = VisibleSelection(startOfSentence(oldStart), endOfSentence(oldStart)); |
+ markAllMisspellingsAndBadGrammar(oldAdjacentWords, selectedSentence); |
} |
static Node* findFirstMarkable(Node* node) |
@@ -854,11 +774,6 @@ void SpellChecker::removeMarkers(const VisibleSelection& selection, DocumentMark |
frame().document()->markers().removeMarkers(range, markerTypes); |
} |
-bool SpellChecker::unifiedTextCheckerEnabled() const |
-{ |
- return blink::unifiedTextCheckerEnabled(m_frame); |
-} |
- |
void SpellChecker::cancelCheck() |
{ |
m_spellCheckRequester->cancelCheck(); |