Chromium Code Reviews| Index: Source/core/editing/Editor.cpp |
| diff --git a/Source/core/editing/Editor.cpp b/Source/core/editing/Editor.cpp |
| index ed04fdbd82b534fa325a303580e490b50fd336af..50d59502400c19322801dadd76414cedecc04ffc 100644 |
| --- a/Source/core/editing/Editor.cpp |
| +++ b/Source/core/editing/Editor.cpp |
| @@ -1017,6 +1017,8 @@ bool Editor::isContinuousSpellCheckingEnabled() const |
| void Editor::toggleContinuousSpellChecking() |
| { |
| client().toggleContinuousSpellChecking(); |
| + if (!isContinuousSpellCheckingEnabled()) |
| + m_editablesSpellCheckedOnFocus.clear(); |
| } |
| bool Editor::isGrammarCheckingEnabled() |
| @@ -1059,12 +1061,45 @@ void Editor::redo() |
| client().redo(); |
| } |
| -void Editor::didBeginEditing() |
| +void Editor::elementDidBeginEditing(Element* element) |
| +{ |
| + if (isContinuousSpellCheckingEnabled() && unifiedTextCheckerEnabled()) { |
| + // This could be called for textareas, text fields and contenteditables. |
| + // Markers from text fields are cleared on blur so text fields have to be spell cheked on each focus as opposed |
| + // to textareas and contenteditables which should be spell checked on the first focus only. |
| + // This is also why text fields are not put into m_editablesSpellCheckedOnFocus. |
| + // For textareas HTMLTextFormControlElement is put into m_editablesSpellCheckedOnFocus but spell checking |
| + // is performed on its inner text element (the latter also applies to text fields). For contenteditables |
| + // the passed in element is put into m_editablesSpellCheckedOnFocus (it's the root editable element). |
|
tony
2013/08/20 22:10:39
This style of comment that describes behavior is b
|
| + bool isTextField = false; |
| + HTMLTextFormControlElement* enclosingHTMLTextFormControlElement = 0; |
| + if (!isHTMLTextFormControlElement(element)) |
| + enclosingHTMLTextFormControlElement = enclosingTextFormControl(firstPositionInNode(element)); |
| + element = enclosingHTMLTextFormControlElement ? enclosingHTMLTextFormControlElement : element; |
| + Element* parent = element; |
| + if (isHTMLTextFormControlElement(element)) { |
| + HTMLTextFormControlElement* textControl = toHTMLTextFormControlElement(element); |
| + parent = textControl; |
| + element = textControl->innerTextElement(); |
| + isTextField = textControl->hasTagName(inputTag) && toHTMLInputElement(textControl)->isTextField(); |
| + } |
| + |
| + if (isTextField || !m_editablesSpellCheckedOnFocus.contains(parent)) { |
| + VisibleSelection selection = VisibleSelection::selectionFromContentsOfNode(element); |
| + markMisspellingsAndBadGrammar(selection); |
| + if (!isTextField) |
| + m_editablesSpellCheckedOnFocus.append(parent); |
|
tony
2013/08/20 22:10:39
You could put a 'why' comment here: We always rech
|
| + } |
| + } |
| +} |
| + |
| +void Editor::didBeginEditing(Element* rootEditableElement) |
| { |
| + elementDidBeginEditing(rootEditableElement); |
| client().didBeginEditing(); |
| } |
| -void Editor::didEndEditing() |
| +void Editor::didEndEditing(Element*) |
| { |
| client().didEndEditing(); |
| } |
| @@ -1867,14 +1902,9 @@ void Editor::computeAndSetTypingStyle(StylePropertySet* style, EditAction editin |
| m_frame->selection()->setTypingStyle(typingStyle); |
| } |
| - |
| -void Editor::textFieldDidBeginEditing(Element* e) |
| +void Editor::textAreaOrTextFieldDidBeginEditing(Element* e) |
| { |
| - if (isContinuousSpellCheckingEnabled()) { |
| - Element* element = toHTMLTextFormControlElement(e)->innerTextElement(); |
| - VisibleSelection selection = VisibleSelection::selectionFromContentsOfNode(element); |
| - markMisspellingsAndBadGrammar(selection); |
| - } |
| + elementDidBeginEditing(e); |
| } |
| void Editor::textFieldDidEndEditing(Element* e) |