Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 12 matching lines...) Expand all Loading... | |
| 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 25 */ | 25 */ |
| 26 | 26 |
| 27 #include "core/editing/InputMethodController.h" | 27 #include "core/editing/InputMethodController.h" |
| 28 | 28 |
| 29 #include "core/InputModeNames.h" | 29 #include "core/InputModeNames.h" |
| 30 #include "core/InputTypeNames.h" | 30 #include "core/InputTypeNames.h" |
| 31 #include "core/dom/Document.h" | 31 #include "core/dom/Document.h" |
| 32 #include "core/dom/Element.h" | 32 #include "core/dom/Element.h" |
| 33 #include "core/dom/ElementTraversal.h" | |
| 33 #include "core/dom/Text.h" | 34 #include "core/dom/Text.h" |
| 34 #include "core/editing/EditingUtilities.h" | 35 #include "core/editing/EditingUtilities.h" |
| 35 #include "core/editing/Editor.h" | 36 #include "core/editing/Editor.h" |
| 36 #include "core/editing/commands/TypingCommand.h" | 37 #include "core/editing/commands/TypingCommand.h" |
| 37 #include "core/editing/markers/DocumentMarkerController.h" | 38 #include "core/editing/markers/DocumentMarkerController.h" |
| 38 #include "core/editing/state_machines/BackwardCodePointStateMachine.h" | 39 #include "core/editing/state_machines/BackwardCodePointStateMachine.h" |
| 39 #include "core/editing/state_machines/ForwardCodePointStateMachine.h" | 40 #include "core/editing/state_machines/ForwardCodePointStateMachine.h" |
| 40 #include "core/events/CompositionEvent.h" | 41 #include "core/events/CompositionEvent.h" |
| 41 #include "core/frame/LocalFrame.h" | 42 #include "core/frame/LocalFrame.h" |
| 43 #include "core/html/HTMLFormElement.h" | |
| 42 #include "core/html/HTMLInputElement.h" | 44 #include "core/html/HTMLInputElement.h" |
| 43 #include "core/html/HTMLTextAreaElement.h" | 45 #include "core/html/HTMLTextAreaElement.h" |
| 44 #include "core/input/EventHandler.h" | 46 #include "core/input/EventHandler.h" |
| 45 #include "core/layout/LayoutObject.h" | 47 #include "core/layout/LayoutObject.h" |
| 46 #include "core/layout/LayoutTheme.h" | 48 #include "core/layout/LayoutTheme.h" |
| 47 #include "core/page/ChromeClient.h" | 49 #include "core/page/ChromeClient.h" |
| 50 #include "core/page/FocusController.h" | |
| 51 #include "core/page/Page.h" | |
| 48 | 52 |
| 49 namespace blink { | 53 namespace blink { |
| 50 | 54 |
| 51 namespace { | 55 namespace { |
| 52 | 56 |
| 53 void DispatchCompositionUpdateEvent(LocalFrame& frame, const String& text) { | 57 void DispatchCompositionUpdateEvent(LocalFrame& frame, const String& text) { |
| 54 Element* target = frame.GetDocument()->FocusedElement(); | 58 Element* target = frame.GetDocument()->FocusedElement(); |
| 55 if (!target) | 59 if (!target) |
| 56 return; | 60 return; |
| 57 | 61 |
| (...skipping 1078 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1136 flags |= kWebTextInputFlagAutocapitalizeCharacters; | 1140 flags |= kWebTextInputFlagAutocapitalizeCharacters; |
| 1137 else if (autocapitalize == words) | 1141 else if (autocapitalize == words) |
| 1138 flags |= kWebTextInputFlagAutocapitalizeWords; | 1142 flags |= kWebTextInputFlagAutocapitalizeWords; |
| 1139 else if (autocapitalize == sentences) | 1143 else if (autocapitalize == sentences) |
| 1140 flags |= kWebTextInputFlagAutocapitalizeSentences; | 1144 flags |= kWebTextInputFlagAutocapitalizeSentences; |
| 1141 else | 1145 else |
| 1142 NOTREACHED(); | 1146 NOTREACHED(); |
| 1143 } | 1147 } |
| 1144 } | 1148 } |
| 1145 | 1149 |
| 1150 if (IsListeningToKeyboardEvents(element)) | |
| 1151 flags |= kWebTextInputFlagListeningToKeyboardEvents; | |
| 1152 | |
| 1153 if (NextFocusableElementInForm(element, kWebFocusTypeForward)) | |
| 1154 flags |= kWebTextInputFlagHaveNextFocusableElement; | |
| 1155 | |
| 1156 if (NextFocusableElementInForm(element, kWebFocusTypeBackward)) | |
| 1157 flags |= kWebTextInputFlagHavePreviousFocusableElement; | |
| 1158 | |
| 1146 return flags; | 1159 return flags; |
| 1147 } | 1160 } |
| 1148 | 1161 |
| 1162 bool InputMethodController::IsListeningToKeyboardEvents( | |
|
Changwan Ryu
2017/04/27 16:34:54
I'm not sure if this makes much sense... There are
yosin_UTC9
2017/04/28 03:32:11
Agree with changewan@. This is too specific and co
AKVT
2017/05/03 14:35:12
Yes I am convinced here, as it has a very narrow c
| |
| 1163 Element* element) const { | |
| 1164 if (!element->IsFormControlElement() && | |
| 1165 !ToHTMLElement(element)->isContentEditableForBinding()) | |
| 1166 return false; | |
| 1167 for (Node* node = element; node; node = node->parentNode()) { | |
| 1168 if (node->HasEventListeners(EventTypeNames::keydown) || | |
| 1169 node->HasEventListeners(EventTypeNames::keypress) || | |
| 1170 node->HasEventListeners(EventTypeNames::keyup)) | |
| 1171 return true; | |
| 1172 } | |
| 1173 return false; | |
| 1174 } | |
| 1175 | |
| 1176 Element* InputMethodController::NextFocusableElementInForm( | |
|
yosin_UTC9
2017/04/28 01:07:28
This function should be in FocusController instead
yosin_UTC9
2017/04/28 03:32:11
I think this function should be implemented on top
AKVT
2017/05/03 14:35:12
Done.
AKVT
2017/05/03 14:35:12
Done.
| |
| 1177 Element* element, | |
| 1178 WebFocusType focusType) const { | |
| 1179 if (!element->IsFormControlElement() && | |
| 1180 !ToHTMLElement(element)->isContentEditableForBinding()) | |
| 1181 return nullptr; | |
| 1182 | |
| 1183 HTMLFormElement* formOwner = nullptr; | |
| 1184 if (ToHTMLElement(element)->isContentEditableForBinding()) | |
| 1185 formOwner = Traversal<HTMLFormElement>::FirstAncestor(*element); | |
| 1186 else | |
| 1187 formOwner = ToHTMLFormControlElement(element)->formOwner(); | |
| 1188 | |
| 1189 if (!formOwner) | |
| 1190 return nullptr; | |
| 1191 | |
| 1192 Element* nextElement = element; | |
| 1193 for (nextElement = | |
| 1194 GetDocument().GetPage()->GetFocusController().FindFocusableElement( | |
| 1195 focusType, *nextElement); | |
| 1196 nextElement; | |
| 1197 nextElement = | |
| 1198 GetDocument().GetPage()->GetFocusController().FindFocusableElement( | |
| 1199 focusType, *nextElement)) { | |
| 1200 if (ToHTMLElement(nextElement)->isContentEditableForBinding() && | |
| 1201 nextElement->IsDescendantOf(formOwner)) | |
| 1202 return nextElement; | |
| 1203 if (!nextElement->IsFormControlElement()) | |
| 1204 continue; | |
| 1205 HTMLFormControlElement* formElement = ToHTMLFormControlElement(nextElement); | |
| 1206 if (formElement->formOwner() != formOwner) | |
| 1207 continue; | |
| 1208 // Skip disabled or readonly editable elements. | |
| 1209 if (formElement->IsDisabledOrReadOnly()) | |
| 1210 continue; | |
| 1211 LayoutObject* layout = nextElement->GetLayoutObject(); | |
| 1212 if (layout && layout->IsTextControl()) { | |
| 1213 // TODO(ajith.v) Extend it for Select element, Radio button and Check | |
| 1214 // boxes | |
| 1215 return nextElement; | |
| 1216 } | |
| 1217 } | |
| 1218 return nullptr; | |
| 1219 } | |
| 1220 | |
| 1149 WebTextInputMode InputMethodController::InputModeOfFocusedElement() const { | 1221 WebTextInputMode InputMethodController::InputModeOfFocusedElement() const { |
| 1150 if (!RuntimeEnabledFeatures::inputModeAttributeEnabled()) | 1222 if (!RuntimeEnabledFeatures::inputModeAttributeEnabled()) |
| 1151 return kWebTextInputModeDefault; | 1223 return kWebTextInputModeDefault; |
| 1152 | 1224 |
| 1153 AtomicString mode = GetInputModeAttribute(GetDocument().FocusedElement()); | 1225 AtomicString mode = GetInputModeAttribute(GetDocument().FocusedElement()); |
| 1154 | 1226 |
| 1155 if (mode.IsEmpty()) | 1227 if (mode.IsEmpty()) |
| 1156 return kWebTextInputModeDefault; | 1228 return kWebTextInputModeDefault; |
| 1157 if (mode == InputModeNames::verbatim) | 1229 if (mode == InputModeNames::verbatim) |
| 1158 return kWebTextInputModeVerbatim; | 1230 return kWebTextInputModeVerbatim; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1247 FinishComposingText(kKeepSelection); | 1319 FinishComposingText(kKeepSelection); |
| 1248 } | 1320 } |
| 1249 | 1321 |
| 1250 DEFINE_TRACE(InputMethodController) { | 1322 DEFINE_TRACE(InputMethodController) { |
| 1251 visitor->Trace(frame_); | 1323 visitor->Trace(frame_); |
| 1252 visitor->Trace(composition_range_); | 1324 visitor->Trace(composition_range_); |
| 1253 SynchronousMutationObserver::Trace(visitor); | 1325 SynchronousMutationObserver::Trace(visitor); |
| 1254 } | 1326 } |
| 1255 | 1327 |
| 1256 } // namespace blink | 1328 } // namespace blink |
| OLD | NEW |