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 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 // According to spec 'beforeinput' should not be sent along with Compositio nEnd, so | |
| 173 // dispatch after CompositionEnd if there is any update. | |
| 174 // https://w3c.github.io/uievents/#h-events-composition-event-input-events | |
| 175 if (dispatchBeforeInputInsertText(frame().document()->focusedElement(), text ) != DispatchEventResult::NotCanceled) | |
| 176 return false; | |
| 177 | |
| 172 insertTextForConfirmedComposition(text); | 178 insertTextForConfirmedComposition(text); |
| 173 | 179 |
| 174 return true; | 180 return true; |
| 175 } | 181 } |
| 176 | 182 |
| 177 bool InputMethodController::confirmCompositionOrInsertText(const String& text, C onfirmCompositionBehavior confirmBehavior) | 183 bool InputMethodController::confirmCompositionOrInsertText(const String& text, C onfirmCompositionBehavior confirmBehavior) |
| 178 { | 184 { |
| 179 if (!hasComposition()) { | 185 if (!hasComposition()) { |
| 180 if (!text.length()) | 186 if (!text.length()) |
| 181 return false; | 187 return false; |
| 188 | |
| 189 if (dispatchBeforeInputInsertText(frame().document()->focusedElement(), text) != DispatchEventResult::NotCanceled) | |
| 190 return false; | |
| 191 | |
| 182 editor().insertText(text, 0); | 192 editor().insertText(text, 0); |
| 183 return true; | 193 return true; |
| 184 } | 194 } |
| 185 | 195 |
| 186 if (text.length()) { | 196 if (text.length()) { |
| 187 confirmComposition(text); | 197 confirmComposition(text); |
| 188 return true; | 198 return true; |
| 189 } | 199 } |
| 190 | 200 |
| 191 if (confirmBehavior != KeepSelection) | 201 if (confirmBehavior != KeepSelection) |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 268 if (!text.isEmpty()) { | 278 if (!text.isEmpty()) { |
| 269 target->dispatchEvent(CompositionEvent::create(EventTypeNames::c ompositionstart, frame().domWindow(), frame().selectedText())); | 279 target->dispatchEvent(CompositionEvent::create(EventTypeNames::c ompositionstart, frame().domWindow(), frame().selectedText())); |
| 270 event = CompositionEvent::create(EventTypeNames::compositionupda te, frame().domWindow(), text); | 280 event = CompositionEvent::create(EventTypeNames::compositionupda te, frame().domWindow(), text); |
| 271 } | 281 } |
| 272 } else { | 282 } else { |
| 273 if (!text.isEmpty()) | 283 if (!text.isEmpty()) |
| 274 event = CompositionEvent::create(EventTypeNames::compositionupda te, frame().domWindow(), text); | 284 event = CompositionEvent::create(EventTypeNames::compositionupda te, frame().domWindow(), text); |
| 275 else | 285 else |
| 276 event = CompositionEvent::create(EventTypeNames::compositionend, frame().domWindow(), text); | 286 event = CompositionEvent::create(EventTypeNames::compositionend, frame().domWindow(), text); |
| 277 } | 287 } |
| 278 if (event.get()) | 288 if (event.get()) { |
| 289 // TODO(chongz): Support canceling IME composition. | |
| 290 if (event->type() == EventTypeNames::compositionupdate) | |
| 291 dispatchBeforeInputCompositionUpdate(target, text); | |
| 279 target->dispatchEvent(event); | 292 target->dispatchEvent(event); |
| 293 } | |
| 280 } | 294 } |
| 281 | 295 |
| 282 // If text is empty, then delete the old composition here. If text is non-em pty, InsertTextCommand::input | 296 // If text is empty, then delete the old composition here. If text is non-em pty, InsertTextCommand::input |
|
yosin_UTC9
2016/03/16 01:46:51
We also dispatch "beforeInput" with "deleteCompose
chongz
2016/03/16 21:51:44
Acknowledged.
chongz
2016/04/13 00:34:28
Done. But I tried several keyboard layouts and Chi
| |
| 283 // will delete the old composition with an optimized replace operation. | 297 // will delete the old composition with an optimized replace operation. |
| 284 if (text.isEmpty()) { | 298 if (text.isEmpty()) { |
| 285 ASSERT(frame().document()); | 299 ASSERT(frame().document()); |
| 286 TypingCommand::deleteSelection(*frame().document(), TypingCommand::Preve ntSpellChecking); | 300 TypingCommand::deleteSelection(*frame().document(), TypingCommand::Preve ntSpellChecking); |
| 287 } | 301 } |
| 288 | 302 |
| 289 clear(); | 303 clear(); |
| 290 | 304 |
| 291 if (text.isEmpty()) | 305 if (text.isEmpty()) |
| 292 return; | 306 return; |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 453 TypingCommand::deleteSelection(*frame().document()); | 467 TypingCommand::deleteSelection(*frame().document()); |
| 454 } | 468 } |
| 455 | 469 |
| 456 DEFINE_TRACE(InputMethodController) | 470 DEFINE_TRACE(InputMethodController) |
| 457 { | 471 { |
| 458 visitor->trace(m_frame); | 472 visitor->trace(m_frame); |
| 459 visitor->trace(m_compositionRange); | 473 visitor->trace(m_compositionRange); |
| 460 } | 474 } |
| 461 | 475 |
| 462 } // namespace blink | 476 } // namespace blink |
| OLD | NEW |