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 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 // According to spec 'beforeinput' should not be sent along with Compositio nEnd, so | |
| 176 // dispatch after CompositionEnd if there is any update. | |
| 177 // https://w3c.github.io/uievents/#h-events-composition-event-input-events | |
| 178 if (dispatchBeforeInputInsertText(frame().document()->focusedElement(), text ) != DispatchEventResult::NotCanceled) | |
| 179 return false; | |
| 180 | |
| 175 insertTextForConfirmedComposition(text); | 181 insertTextForConfirmedComposition(text); |
| 176 | 182 |
| 177 return true; | 183 return true; |
| 178 } | 184 } |
| 179 | 185 |
| 180 bool InputMethodController::confirmCompositionOrInsertText(const String& text, C onfirmCompositionBehavior confirmBehavior) | 186 bool InputMethodController::confirmCompositionOrInsertText(const String& text, C onfirmCompositionBehavior confirmBehavior) |
| 181 { | 187 { |
| 182 if (!hasComposition()) { | 188 if (!hasComposition()) { |
| 183 if (!text.length()) | 189 if (!text.length()) |
| 184 return false; | 190 return false; |
| 191 | |
| 192 if (dispatchBeforeInputInsertText(frame().document()->focusedElement(), text) != DispatchEventResult::NotCanceled) | |
| 193 return false; | |
| 194 | |
| 185 editor().insertText(text, 0); | 195 editor().insertText(text, 0); |
| 186 return true; | 196 return true; |
| 187 } | 197 } |
| 188 | 198 |
| 189 if (text.length()) { | 199 if (text.length()) { |
| 190 confirmComposition(text); | 200 confirmComposition(text); |
| 191 return true; | 201 return true; |
| 192 } | 202 } |
| 193 | 203 |
| 194 if (confirmBehavior == DoNotKeepSelection) | 204 if (confirmBehavior == DoNotKeepSelection) |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 271 if (!text.isEmpty()) { | 281 if (!text.isEmpty()) { |
| 272 target->dispatchEvent(CompositionEvent::create(EventTypeNames::c ompositionstart, frame().domWindow(), frame().selectedText())); | 282 target->dispatchEvent(CompositionEvent::create(EventTypeNames::c ompositionstart, frame().domWindow(), frame().selectedText())); |
| 273 event = CompositionEvent::create(EventTypeNames::compositionupda te, frame().domWindow(), text); | 283 event = CompositionEvent::create(EventTypeNames::compositionupda te, frame().domWindow(), text); |
| 274 } | 284 } |
| 275 } else { | 285 } else { |
| 276 if (!text.isEmpty()) | 286 if (!text.isEmpty()) |
| 277 event = CompositionEvent::create(EventTypeNames::compositionupda te, frame().domWindow(), text); | 287 event = CompositionEvent::create(EventTypeNames::compositionupda te, frame().domWindow(), text); |
| 278 else | 288 else |
| 279 event = CompositionEvent::create(EventTypeNames::compositionend, frame().domWindow(), text); | 289 event = CompositionEvent::create(EventTypeNames::compositionend, frame().domWindow(), text); |
| 280 } | 290 } |
| 281 if (event) | 291 if (event) { |
| 292 // TODO(chongz): Support canceling IME composition. | |
| 293 if (event->type() == EventTypeNames::compositionupdate) | |
| 294 dispatchBeforeInputFromComposition(target, InputEvent::InputType ::ReplaceContent, 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 ASSERT(frame().document()); | 302 ASSERT(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 dispatchBeforeInputFromComposition(frame().document()->focusedElement(), Inp utEvent::InputType::DeleteComposedCharacter, "backward"); | |
|
chongz
2016/04/13 00:34:28
Not sure when will this code path get called...?
yosin_UTC9
2016/04/13 06:13:09
Backspace emulation? Or, Thai keyboard?
I remember
chongz
2016/04/13 23:53:08
Actually it will always go into here by pressing b
| |
| 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 |