Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Side by Side Diff: Source/core/editing/Editor.cpp

Issue 21694005: Spell check whole content of an editable element when it gets focused. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: async test added. Sync suffixed with -sync Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 999 matching lines...) Expand 10 before | Expand all | Expand 10 after
1010 } 1010 }
1011 1011
1012 bool Editor::isContinuousSpellCheckingEnabled() const 1012 bool Editor::isContinuousSpellCheckingEnabled() const
1013 { 1013 {
1014 return client().isContinuousSpellCheckingEnabled(); 1014 return client().isContinuousSpellCheckingEnabled();
1015 } 1015 }
1016 1016
1017 void Editor::toggleContinuousSpellChecking() 1017 void Editor::toggleContinuousSpellChecking()
1018 { 1018 {
1019 client().toggleContinuousSpellChecking(); 1019 client().toggleContinuousSpellChecking();
1020 if (!isContinuousSpellCheckingEnabled())
1021 m_editablesSpellCheckedOnFocus.clear();
1020 } 1022 }
1021 1023
1022 bool Editor::isGrammarCheckingEnabled() 1024 bool Editor::isGrammarCheckingEnabled()
1023 { 1025 {
1024 return client().isGrammarCheckingEnabled(); 1026 return client().isGrammarCheckingEnabled();
1025 } 1027 }
1026 1028
1027 bool Editor::shouldEndEditing(Range* range) 1029 bool Editor::shouldEndEditing(Range* range)
1028 { 1030 {
1029 return client().shouldEndEditing(range); 1031 return client().shouldEndEditing(range);
(...skipping 22 matching lines...) Expand all
1052 bool Editor::canRedo() 1054 bool Editor::canRedo()
1053 { 1055 {
1054 return client().canRedo(); 1056 return client().canRedo();
1055 } 1057 }
1056 1058
1057 void Editor::redo() 1059 void Editor::redo()
1058 { 1060 {
1059 client().redo(); 1061 client().redo();
1060 } 1062 }
1061 1063
1062 void Editor::didBeginEditing() 1064 void Editor::elementDidBeginEditing(Element* element)
1063 { 1065 {
1066 if (isContinuousSpellCheckingEnabled() && unifiedTextCheckerEnabled()) {
1067 // This could be called for textareas, text fields and contenteditables.
1068 // Markers from text fields are cleared on blur so text fields have to b e spell cheked on each focus as opposed
1069 // to textareas and contenteditables which should be spell checked on th e first focus only.
1070 // This is also why text fields are not put into m_editablesSpellChecked OnFocus.
1071 // For textareas HTMLTextFormControlElement is put into m_editablesSpell CheckedOnFocus but spell checking
1072 // is performed on its inner text element (the latter also applies to te xt fields). For contenteditables
1073 // 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
1074 bool isTextField = false;
1075 HTMLTextFormControlElement* enclosingHTMLTextFormControlElement = 0;
1076 if (!isHTMLTextFormControlElement(element))
1077 enclosingHTMLTextFormControlElement = enclosingTextFormControl(first PositionInNode(element));
1078 element = enclosingHTMLTextFormControlElement ? enclosingHTMLTextFormCon trolElement : element;
1079 Element* parent = element;
1080 if (isHTMLTextFormControlElement(element)) {
1081 HTMLTextFormControlElement* textControl = toHTMLTextFormControlEleme nt(element);
1082 parent = textControl;
1083 element = textControl->innerTextElement();
1084 isTextField = textControl->hasTagName(inputTag) && toHTMLInputElemen t(textControl)->isTextField();
1085 }
1086
1087 if (isTextField || !m_editablesSpellCheckedOnFocus.contains(parent)) {
1088 VisibleSelection selection = VisibleSelection::selectionFromContents OfNode(element);
1089 markMisspellingsAndBadGrammar(selection);
1090 if (!isTextField)
1091 m_editablesSpellCheckedOnFocus.append(parent);
tony 2013/08/20 22:10:39 You could put a 'why' comment here: We always rech
1092 }
1093 }
1094 }
1095
1096 void Editor::didBeginEditing(Element* rootEditableElement)
1097 {
1098 elementDidBeginEditing(rootEditableElement);
1064 client().didBeginEditing(); 1099 client().didBeginEditing();
1065 } 1100 }
1066 1101
1067 void Editor::didEndEditing() 1102 void Editor::didEndEditing(Element*)
1068 { 1103 {
1069 client().didEndEditing(); 1104 client().didEndEditing();
1070 } 1105 }
1071 1106
1072 void Editor::setBaseWritingDirection(WritingDirection direction) 1107 void Editor::setBaseWritingDirection(WritingDirection direction)
1073 { 1108 {
1074 Node* focusedElement = frame()->document()->focusedElement(); 1109 Node* focusedElement = frame()->document()->focusedElement();
1075 if (focusedElement && isHTMLTextFormControlElement(focusedElement)) { 1110 if (focusedElement && isHTMLTextFormControlElement(focusedElement)) {
1076 if (direction == NaturalWritingDirection) 1111 if (direction == NaturalWritingDirection)
1077 return; 1112 return;
(...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after
1860 1895
1861 // Handle block styles, substracting these from the typing style. 1896 // Handle block styles, substracting these from the typing style.
1862 RefPtr<EditingStyle> blockStyle = typingStyle->extractAndRemoveBlockProperti es(); 1897 RefPtr<EditingStyle> blockStyle = typingStyle->extractAndRemoveBlockProperti es();
1863 if (!blockStyle->isEmpty()) 1898 if (!blockStyle->isEmpty())
1864 applyCommand(ApplyStyleCommand::create(m_frame->document(), blockStyle.g et(), editingAction)); 1899 applyCommand(ApplyStyleCommand::create(m_frame->document(), blockStyle.g et(), editingAction));
1865 1900
1866 // Set the remaining style as the typing style. 1901 // Set the remaining style as the typing style.
1867 m_frame->selection()->setTypingStyle(typingStyle); 1902 m_frame->selection()->setTypingStyle(typingStyle);
1868 } 1903 }
1869 1904
1870 1905 void Editor::textAreaOrTextFieldDidBeginEditing(Element* e)
1871 void Editor::textFieldDidBeginEditing(Element* e)
1872 { 1906 {
1873 if (isContinuousSpellCheckingEnabled()) { 1907 elementDidBeginEditing(e);
1874 Element* element = toHTMLTextFormControlElement(e)->innerTextElement();
1875 VisibleSelection selection = VisibleSelection::selectionFromContentsOfNo de(element);
1876 markMisspellingsAndBadGrammar(selection);
1877 }
1878 } 1908 }
1879 1909
1880 void Editor::textFieldDidEndEditing(Element* e) 1910 void Editor::textFieldDidEndEditing(Element* e)
1881 { 1911 {
1882 // Remove markers when deactivating a selection in an <input type="text"/>. 1912 // Remove markers when deactivating a selection in an <input type="text"/>.
1883 // Prevent new ones from appearing too. 1913 // Prevent new ones from appearing too.
1884 m_spellCheckRequester->cancelCheck(); 1914 m_spellCheckRequester->cancelCheck();
1885 HTMLTextFormControlElement* textFormControlElement = toHTMLTextFormControlEl ement(e); 1915 HTMLTextFormControlElement* textFormControlElement = toHTMLTextFormControlEl ement(e);
1886 HTMLElement* innerText = textFormControlElement->innerTextElement(); 1916 HTMLElement* innerText = textFormControlElement->innerTextElement();
1887 DocumentMarker::MarkerTypes markerTypes(DocumentMarker::Spelling); 1917 DocumentMarker::MarkerTypes markerTypes(DocumentMarker::Spelling);
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
2174 return WebCore::unifiedTextCheckerEnabled(m_frame); 2204 return WebCore::unifiedTextCheckerEnabled(m_frame);
2175 } 2205 }
2176 2206
2177 void Editor::toggleOverwriteModeEnabled() 2207 void Editor::toggleOverwriteModeEnabled()
2178 { 2208 {
2179 m_overwriteModeEnabled = !m_overwriteModeEnabled; 2209 m_overwriteModeEnabled = !m_overwriteModeEnabled;
2180 frame()->selection()->setShouldShowBlockCursor(m_overwriteModeEnabled); 2210 frame()->selection()->setShouldShowBlockCursor(m_overwriteModeEnabled);
2181 }; 2211 };
2182 2212
2183 } // namespace WebCore 2213 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698