| 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 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 VisibleSelection selection; | 115 VisibleSelection selection; |
| 116 selection.setWithoutValidation(range.startPosition(), range.endPosition()); | 116 selection.setWithoutValidation(range.startPosition(), range.endPosition()); |
| 117 frame().selection().setSelection(selection, 0); | 117 frame().selection().setSelection(selection, 0); |
| 118 } | 118 } |
| 119 | 119 |
| 120 bool InputMethodController::confirmComposition() | 120 bool InputMethodController::confirmComposition() |
| 121 { | 121 { |
| 122 return confirmComposition(composingText()); | 122 return confirmComposition(composingText()); |
| 123 } | 123 } |
| 124 | 124 |
| 125 static void dispatchCompositionEndEvent(LocalFrame& frame, const String& text) | 125 static void dispatchCompositionEvent(LocalFrame& frame, const AtomicString& type
, const String& text) |
| 126 { | 126 { |
| 127 // We should send this event before sending a TextEvent as written in | 127 // We should send this event before sending a TextEvent as written in |
| 128 // Section 6.2.2 and 6.2.3 of the DOM Event specification. | 128 // Section 6.2.2 and 6.2.3 of the DOM Event specification. |
| 129 Element* target = frame.document()->focusedElement(); | 129 Element* target = frame.document()->focusedElement(); |
| 130 if (!target) | 130 if (!target) |
| 131 return; | 131 return; |
| 132 | 132 |
| 133 RefPtrWillBeRawPtr<CompositionEvent> event = | 133 RefPtrWillBeRawPtr<CompositionEvent> event = |
| 134 CompositionEvent::create(EventTypeNames::compositionend, frame.domWindow
(), text); | 134 CompositionEvent::create(type, frame.domWindow(), text); |
| 135 target->dispatchEvent(event); | 135 target->dispatchEvent(event); |
| 136 } | 136 } |
| 137 | 137 |
| 138 bool InputMethodController::confirmComposition(const String& text) | 138 bool InputMethodController::confirmComposition(const String& text) |
| 139 { | 139 { |
| 140 if (!hasComposition()) | 140 if (!hasComposition()) |
| 141 return false; | 141 return false; |
| 142 | 142 |
| 143 Editor::RevealSelectionScope revealSelectionScope(&editor()); | 143 Editor::RevealSelectionScope revealSelectionScope(&editor()); |
| 144 | 144 |
| 145 // If the composition was set from existing text and didn't change, then | 145 // If the composition was set from existing text and didn't change, then |
| 146 // there's nothing to do here (and we should avoid doing anything as that | 146 // there's nothing to do here (and we should avoid doing anything as that |
| 147 // may clobber multi-node styled text). | 147 // may clobber multi-node styled text). |
| 148 if (!m_isDirty && composingText() == text) { | 148 if (!m_isDirty && composingText() == text) { |
| 149 clear(); | 149 clear(); |
| 150 return true; | 150 return true; |
| 151 } | 151 } |
| 152 | 152 |
| 153 // Select the text that will be deleted or replaced. | 153 // Select the text that will be deleted or replaced. |
| 154 selectComposition(); | 154 selectComposition(); |
| 155 | 155 |
| 156 if (frame().selection().isNone()) | 156 if (frame().selection().isNone()) |
| 157 return false; | 157 return false; |
| 158 | 158 |
| 159 dispatchCompositionEndEvent(frame(), text); | 159 dispatchCompositionEvent(frame(), EventTypeNames::compositionend, text); |
| 160 | 160 |
| 161 if (!frame().document()) | 161 if (!frame().document()) |
| 162 return false; | 162 return false; |
| 163 | 163 |
| 164 // If text is empty, then delete the old composition here. If text is | 164 // If text is empty, then delete the old composition here. If text is |
| 165 // non-empty, InsertTextCommand::input will delete the old composition with | 165 // non-empty, InsertTextCommand::input will delete the old composition with |
| 166 // an optimized replace operation. | 166 // an optimized replace operation. |
| 167 if (text.isEmpty()) | 167 if (text.isEmpty()) |
| 168 TypingCommand::deleteSelection(*frame().document(), 0); | 168 TypingCommand::deleteSelection(*frame().document(), 0); |
| 169 | 169 |
| 170 clear(); | 170 clear(); |
| 171 | 171 |
| 172 insertTextForConfirmedComposition(text); | 172 insertTextForConfirmedComposition(text); |
| 173 | 173 |
| 174 return true; | 174 return true; |
| 175 } | 175 } |
| 176 | 176 |
| 177 bool InputMethodController::confirmCompositionOrInsertText(const String& text, C
onfirmCompositionBehavior confirmBehavior) | 177 bool InputMethodController::confirmCompositionOrInsertText(const String& text, C
onfirmCompositionBehavior confirmBehavior) |
| 178 { | 178 { |
| 179 if (!hasComposition()) { | 179 if (!hasComposition()) { |
| 180 if (!text.length()) | 180 if (!text.length()) |
| 181 return false; | 181 return false; |
| 182 dispatchCompositionEvent(frame(), EventTypeNames::compositionstart, fram
e().selectedText()); |
| 183 dispatchCompositionEvent(frame(), EventTypeNames::compositionend, text); |
| 182 editor().insertText(text, 0); | 184 editor().insertText(text, 0); |
| 183 return true; | 185 return true; |
| 184 } | 186 } |
| 185 | 187 |
| 186 if (text.length()) { | 188 if (text.length()) { |
| 187 confirmComposition(text); | 189 confirmComposition(text); |
| 188 return true; | 190 return true; |
| 189 } | 191 } |
| 190 | 192 |
| 191 if (confirmBehavior != KeepSelection) | 193 if (confirmBehavior != KeepSelection) |
| 192 return confirmComposition(); | 194 return confirmComposition(); |
| 193 | 195 |
| 194 SelectionOffsetsScope selectionOffsetsScope(this); | 196 SelectionOffsetsScope selectionOffsetsScope(this); |
| 195 return confirmComposition(); | 197 return confirmComposition(); |
| 196 } | 198 } |
| 197 | 199 |
| 198 void InputMethodController::cancelComposition() | 200 void InputMethodController::cancelComposition() |
| 199 { | 201 { |
| 200 if (!hasComposition()) | 202 if (!hasComposition()) |
| 201 return; | 203 return; |
| 202 | 204 |
| 203 Editor::RevealSelectionScope revealSelectionScope(&editor()); | 205 Editor::RevealSelectionScope revealSelectionScope(&editor()); |
| 204 | 206 |
| 205 if (frame().selection().isNone()) | 207 if (frame().selection().isNone()) |
| 206 return; | 208 return; |
| 207 | 209 |
| 208 dispatchCompositionEndEvent(frame(), emptyString()); | 210 dispatchCompositionEvent(frame(), EventTypeNames::compositionend, emptyStrin
g()); |
| 209 clear(); | 211 clear(); |
| 210 insertTextForConfirmedComposition(emptyString()); | 212 insertTextForConfirmedComposition(emptyString()); |
| 211 | 213 |
| 212 // An open typing command that disagrees about current selection would cause | 214 // An open typing command that disagrees about current selection would cause |
| 213 // issues with typing later on. | 215 // issues with typing later on. |
| 214 TypingCommand::closeTyping(m_frame); | 216 TypingCommand::closeTyping(m_frame); |
| 215 } | 217 } |
| 216 | 218 |
| 217 void InputMethodController::cancelCompositionIfSelectionIsInvalid() | 219 void InputMethodController::cancelCompositionIfSelectionIsInvalid() |
| 218 { | 220 { |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 453 TypingCommand::deleteSelection(*frame().document()); | 455 TypingCommand::deleteSelection(*frame().document()); |
| 454 } | 456 } |
| 455 | 457 |
| 456 DEFINE_TRACE(InputMethodController) | 458 DEFINE_TRACE(InputMethodController) |
| 457 { | 459 { |
| 458 visitor->trace(m_frame); | 460 visitor->trace(m_frame); |
| 459 visitor->trace(m_compositionRange); | 461 visitor->trace(m_compositionRange); |
| 460 } | 462 } |
| 461 | 463 |
| 462 } // namespace blink | 464 } // namespace blink |
| OLD | NEW |