| 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).
|
| + 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);
|
| + }
|
| + }
|
| +}
|
| +
|
| +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)
|
|
|