| 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 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 return false; | 165 return false; |
| 166 | 166 |
| 167 // If text is empty, then delete the old composition here. If text is | 167 // If text is empty, then delete the old composition here. If text is |
| 168 // non-empty, InsertTextCommand::input will delete the old composition with | 168 // non-empty, InsertTextCommand::input will delete the old composition with |
| 169 // an optimized replace operation. | 169 // an optimized replace operation. |
| 170 if (text.isEmpty()) | 170 if (text.isEmpty()) |
| 171 TypingCommand::deleteSelection(*frame().document(), 0); | 171 TypingCommand::deleteSelection(*frame().document(), 0); |
| 172 | 172 |
| 173 clear(); | 173 clear(); |
| 174 | 174 |
| 175 // TODO(chongz): DOM update should happen before 'compositionend' and along
with 'compositionupdate'. |
| 176 // https://crbug.com/575294 |
| 177 if (dispatchBeforeInputInsertText(frame().document()->focusedElement(), text
) != DispatchEventResult::NotCanceled) |
| 178 return false; |
| 179 |
| 175 insertTextForConfirmedComposition(text); | 180 insertTextForConfirmedComposition(text); |
| 176 | 181 |
| 177 return true; | 182 return true; |
| 178 } | 183 } |
| 179 | 184 |
| 180 bool InputMethodController::confirmCompositionOrInsertText(const String& text, C
onfirmCompositionBehavior confirmBehavior) | 185 bool InputMethodController::confirmCompositionOrInsertText(const String& text, C
onfirmCompositionBehavior confirmBehavior) |
| 181 { | 186 { |
| 182 if (!hasComposition()) { | 187 if (!hasComposition()) { |
| 183 if (!text.length()) | 188 if (!text.length()) |
| 184 return false; | 189 return false; |
| 190 |
| 191 if (dispatchBeforeInputInsertText(frame().document()->focusedElement(),
text) != DispatchEventResult::NotCanceled) |
| 192 return false; |
| 193 |
| 185 editor().insertText(text, 0); | 194 editor().insertText(text, 0); |
| 186 return true; | 195 return true; |
| 187 } | 196 } |
| 188 | 197 |
| 189 if (text.length()) { | 198 if (text.length()) { |
| 190 confirmComposition(text); | 199 confirmComposition(text); |
| 191 return true; | 200 return true; |
| 192 } | 201 } |
| 193 | 202 |
| 194 if (confirmBehavior == DoNotKeepSelection) | 203 if (confirmBehavior == DoNotKeepSelection) |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 if (!text.isEmpty()) { | 280 if (!text.isEmpty()) { |
| 272 target->dispatchEvent(CompositionEvent::create(EventTypeNames::c
ompositionstart, frame().domWindow(), frame().selectedText())); | 281 target->dispatchEvent(CompositionEvent::create(EventTypeNames::c
ompositionstart, frame().domWindow(), frame().selectedText())); |
| 273 event = CompositionEvent::create(EventTypeNames::compositionupda
te, frame().domWindow(), text); | 282 event = CompositionEvent::create(EventTypeNames::compositionupda
te, frame().domWindow(), text); |
| 274 } | 283 } |
| 275 } else { | 284 } else { |
| 276 if (!text.isEmpty()) | 285 if (!text.isEmpty()) |
| 277 event = CompositionEvent::create(EventTypeNames::compositionupda
te, frame().domWindow(), text); | 286 event = CompositionEvent::create(EventTypeNames::compositionupda
te, frame().domWindow(), text); |
| 278 else | 287 else |
| 279 event = CompositionEvent::create(EventTypeNames::compositionend,
frame().domWindow(), text); | 288 event = CompositionEvent::create(EventTypeNames::compositionend,
frame().domWindow(), text); |
| 280 } | 289 } |
| 281 if (event) | 290 if (event) { |
| 291 // TODO(chongz): Support canceling IME composition. |
| 292 // TODO(chongz): Should fire InsertText or DeleteComposedCharacter b
ased on action. |
| 293 if (event->type() == EventTypeNames::compositionupdate) |
| 294 dispatchBeforeInputFromComposition(target, InputEvent::InputType
::InsertText, text); |
| 282 target->dispatchEvent(event); | 295 target->dispatchEvent(event); |
| 296 } |
| 283 } | 297 } |
| 284 | 298 |
| 285 // If text is empty, then delete the old composition here. If text is non-em
pty, InsertTextCommand::input | 299 // If text is empty, then delete the old composition here. If text is non-em
pty, InsertTextCommand::input |
| 286 // will delete the old composition with an optimized replace operation. | 300 // will delete the old composition with an optimized replace operation. |
| 287 if (text.isEmpty()) { | 301 if (text.isEmpty()) { |
| 288 DCHECK(frame().document()); | 302 DCHECK(frame().document()); |
| 289 TypingCommand::deleteSelection(*frame().document(), TypingCommand::Preve
ntSpellChecking); | 303 TypingCommand::deleteSelection(*frame().document(), TypingCommand::Preve
ntSpellChecking); |
| 290 } | 304 } |
| 291 | 305 |
| 292 clear(); | 306 clear(); |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 446 // only the last code-point so that it's possible for a user to correct | 460 // only the last code-point so that it's possible for a user to correct |
| 447 // a composition without starting it from the beginning. | 461 // a composition without starting it from the beginning. |
| 448 // http://crbug.com/37993 | 462 // http://crbug.com/37993 |
| 449 do { | 463 do { |
| 450 if (!setSelectionOffsets(PlainTextRange(std::max(static_cast<int>(select
ionOffsets.start()) - before, 0), selectionOffsets.end() + after))) | 464 if (!setSelectionOffsets(PlainTextRange(std::max(static_cast<int>(select
ionOffsets.start()) - before, 0), selectionOffsets.end() + after))) |
| 451 return; | 465 return; |
| 452 if (before == 0) | 466 if (before == 0) |
| 453 break; | 467 break; |
| 454 ++before; | 468 ++before; |
| 455 } while (frame().selection().start() == frame().selection().end() && before
<= static_cast<int>(selectionOffsets.start())); | 469 } while (frame().selection().start() == frame().selection().end() && before
<= static_cast<int>(selectionOffsets.start())); |
| 470 // TODO(chongz): According to spec |data| should be "forward" or "backward". |
| 471 dispatchBeforeInputEditorCommand(frame().document()->focusedElement(), Input
Event::InputType::DeleteContent); |
| 456 TypingCommand::deleteSelection(*frame().document()); | 472 TypingCommand::deleteSelection(*frame().document()); |
| 457 } | 473 } |
| 458 | 474 |
| 459 DEFINE_TRACE(InputMethodController) | 475 DEFINE_TRACE(InputMethodController) |
| 460 { | 476 { |
| 461 visitor->trace(m_frame); | 477 visitor->trace(m_frame); |
| 462 visitor->trace(m_compositionRange); | 478 visitor->trace(m_compositionRange); |
| 463 } | 479 } |
| 464 | 480 |
| 465 } // namespace blink | 481 } // namespace blink |
| OLD | NEW |