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 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 | 137 |
138 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets | 138 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets |
139 // needs to be audited. see http://crbug.com/590369 for more details. | 139 // needs to be audited. see http://crbug.com/590369 for more details. |
140 frame.document()->updateStyleAndLayoutIgnorePendingStylesheets(); | 140 frame.document()->updateStyleAndLayoutIgnorePendingStylesheets(); |
141 | 141 |
142 const bool isIncrementalInsertion = needsIncrementalInsertion(frame, text); | 142 const bool isIncrementalInsertion = needsIncrementalInsertion(frame, text); |
143 | 143 |
144 switch (compositionType) { | 144 switch (compositionType) { |
145 case TypingCommand::TextCompositionType::TextCompositionUpdate: | 145 case TypingCommand::TextCompositionType::TextCompositionUpdate: |
146 case TypingCommand::TextCompositionType::TextCompositionConfirm: | 146 case TypingCommand::TextCompositionType::TextCompositionConfirm: |
147 TypingCommand::insertText( | 147 TypingCommand::insertText(*frame.document(), text, options, |
148 *frame.document(), EditCommandSource::kMenuOrKeyBinding, text, | 148 compositionType, isIncrementalInsertion); |
149 options, compositionType, isIncrementalInsertion); | |
150 break; | 149 break; |
151 case TypingCommand::TextCompositionType::TextCompositionCancel: | 150 case TypingCommand::TextCompositionType::TextCompositionCancel: |
152 // TODO(chongz): Use TypingCommand::insertText after TextEvent was | 151 // TODO(chongz): Use TypingCommand::insertText after TextEvent was |
153 // removed. (Removed from spec since 2012) | 152 // removed. (Removed from spec since 2012) |
154 // See TextEvent.idl. | 153 // See TextEvent.idl. |
155 frame.eventHandler().handleTextInputEvent(text, 0, | 154 frame.eventHandler().handleTextInputEvent(text, 0, |
156 TextEventInputComposition); | 155 TextEventInputComposition); |
157 break; | 156 break; |
158 default: | 157 default: |
159 NOTREACHED(); | 158 NOTREACHED(); |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 | 298 |
300 if (frame().selection().isNone()) | 299 if (frame().selection().isNone()) |
301 return false; | 300 return false; |
302 | 301 |
303 if (!isAvailable()) | 302 if (!isAvailable()) |
304 return false; | 303 return false; |
305 | 304 |
306 // If text is empty, then delete the old composition here. If text is | 305 // If text is empty, then delete the old composition here. If text is |
307 // non-empty, InsertTextCommand::input will delete the old composition with | 306 // non-empty, InsertTextCommand::input will delete the old composition with |
308 // an optimized replace operation. | 307 // an optimized replace operation. |
309 if (text.isEmpty()) { | 308 if (text.isEmpty()) |
310 TypingCommand::deleteSelection(document(), | 309 TypingCommand::deleteSelection(document(), 0); |
311 EditCommandSource::kMenuOrKeyBinding, 0); | |
312 } | |
313 | 310 |
314 clear(); | 311 clear(); |
315 | 312 |
316 insertTextDuringCompositionWithEvents( | 313 insertTextDuringCompositionWithEvents( |
317 frame(), text, 0, | 314 frame(), text, 0, |
318 TypingCommand::TextCompositionType::TextCompositionConfirm); | 315 TypingCommand::TextCompositionType::TextCompositionConfirm); |
319 // Event handler might destroy document. | 316 // Event handler might destroy document. |
320 if (!isAvailable()) | 317 if (!isAvailable()) |
321 return false; | 318 return false; |
322 | 319 |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 // composition node, i.e. !hasComposition() && test.isEmpty(). | 528 // composition node, i.e. !hasComposition() && test.isEmpty(). |
532 if (text.isEmpty()) { | 529 if (text.isEmpty()) { |
533 if (hasComposition()) { | 530 if (hasComposition()) { |
534 Editor::RevealSelectionScope revealSelectionScope(&editor()); | 531 Editor::RevealSelectionScope revealSelectionScope(&editor()); |
535 replaceComposition(emptyString()); | 532 replaceComposition(emptyString()); |
536 } else { | 533 } else { |
537 // It's weird to call |setComposition()| with empty text outside | 534 // It's weird to call |setComposition()| with empty text outside |
538 // composition, however some IME (e.g. Japanese IBus-Anthy) did this, so | 535 // composition, however some IME (e.g. Japanese IBus-Anthy) did this, so |
539 // we simply delete selection without sending extra events. | 536 // we simply delete selection without sending extra events. |
540 TypingCommand::deleteSelection(document(), | 537 TypingCommand::deleteSelection(document(), |
541 EditCommandSource::kMenuOrKeyBinding, | |
542 TypingCommand::PreventSpellChecking); | 538 TypingCommand::PreventSpellChecking); |
543 } | 539 } |
544 | 540 |
545 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets | 541 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets |
546 // needs to be audited. see http://crbug.com/590369 for more details. | 542 // needs to be audited. see http://crbug.com/590369 for more details. |
547 document().updateStyleAndLayoutIgnorePendingStylesheets(); | 543 document().updateStyleAndLayoutIgnorePendingStylesheets(); |
548 | 544 |
549 setEditableSelectionOffsets(selectedRange); | 545 setEditableSelectionOffsets(selectedRange); |
550 | 546 |
551 // No DOM update after 'compositionend'. | 547 // No DOM update after 'compositionend'. |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
790 return; | 786 return; |
791 if (before == 0) | 787 if (before == 0) |
792 break; | 788 break; |
793 ++before; | 789 ++before; |
794 } while (frame().selection().start() == frame().selection().end() && | 790 } while (frame().selection().start() == frame().selection().end() && |
795 before <= static_cast<int>(selectionOffsets.start())); | 791 before <= static_cast<int>(selectionOffsets.start())); |
796 // TODO(chongz): Find a way to distinguish Forward and Backward. | 792 // TODO(chongz): Find a way to distinguish Forward and Backward. |
797 dispatchBeforeInputEditorCommand( | 793 dispatchBeforeInputEditorCommand( |
798 document().focusedElement(), InputEvent::InputType::DeleteContentBackward, | 794 document().focusedElement(), InputEvent::InputType::DeleteContentBackward, |
799 new RangeVector(1, m_frame->selection().firstRange())); | 795 new RangeVector(1, m_frame->selection().firstRange())); |
800 TypingCommand::deleteSelection(document(), | 796 TypingCommand::deleteSelection(document()); |
801 EditCommandSource::kMenuOrKeyBinding); | |
802 } | 797 } |
803 | 798 |
804 // TODO(yabinh): We should reduce the number of selectionchange events. | 799 // TODO(yabinh): We should reduce the number of selectionchange events. |
805 void InputMethodController::deleteSurroundingText(int before, int after) { | 800 void InputMethodController::deleteSurroundingText(int before, int after) { |
806 if (!editor().canEdit()) | 801 if (!editor().canEdit()) |
807 return; | 802 return; |
808 const PlainTextRange selectionOffsets(getSelectionOffsets()); | 803 const PlainTextRange selectionOffsets(getSelectionOffsets()); |
809 if (selectionOffsets.isNull()) | 804 if (selectionOffsets.isNull()) |
810 return; | 805 return; |
811 Element* const rootEditableElement = | 806 Element* const rootEditableElement = |
(...skipping 14 matching lines...) Expand all Loading... |
826 return; | 821 return; |
827 const Position& position = range.endPosition(); | 822 const Position& position = range.endPosition(); |
828 | 823 |
829 // Adjust the start of selection for multi-code text(a grapheme cluster | 824 // Adjust the start of selection for multi-code text(a grapheme cluster |
830 // contains more than one code point). TODO(yabinh): Adjustment should be | 825 // contains more than one code point). TODO(yabinh): Adjustment should be |
831 // based on code point instead of grapheme cluster. | 826 // based on code point instead of grapheme cluster. |
832 const size_t diff = computeDistanceToLeftGraphemeBoundary(position); | 827 const size_t diff = computeDistanceToLeftGraphemeBoundary(position); |
833 const int adjustedStart = start - static_cast<int>(diff); | 828 const int adjustedStart = start - static_cast<int>(diff); |
834 if (!setSelectionOffsets(PlainTextRange(adjustedStart, selectionStart))) | 829 if (!setSelectionOffsets(PlainTextRange(adjustedStart, selectionStart))) |
835 return; | 830 return; |
836 TypingCommand::deleteSelection(document(), | 831 TypingCommand::deleteSelection(document()); |
837 EditCommandSource::kMenuOrKeyBinding); | |
838 | 832 |
839 selectionEnd = selectionEnd - (selectionStart - adjustedStart); | 833 selectionEnd = selectionEnd - (selectionStart - adjustedStart); |
840 selectionStart = adjustedStart; | 834 selectionStart = adjustedStart; |
841 } | 835 } |
842 | 836 |
843 // Select the text to be deleted after selectionEnd. | 837 // Select the text to be deleted after selectionEnd. |
844 if (after > 0) { | 838 if (after > 0) { |
845 // Adjust the deleted range in case of exceeding the right boundary. | 839 // Adjust the deleted range in case of exceeding the right boundary. |
846 const PlainTextRange range(0, selectionEnd + after); | 840 const PlainTextRange range(0, selectionEnd + after); |
847 if (range.isNull()) | 841 if (range.isNull()) |
848 return; | 842 return; |
849 const EphemeralRange& validRange = range.createRange(*rootEditableElement); | 843 const EphemeralRange& validRange = range.createRange(*rootEditableElement); |
850 if (validRange.isNull()) | 844 if (validRange.isNull()) |
851 return; | 845 return; |
852 const int end = | 846 const int end = |
853 PlainTextRange::create(*rootEditableElement, validRange).end(); | 847 PlainTextRange::create(*rootEditableElement, validRange).end(); |
854 const Position& position = validRange.endPosition(); | 848 const Position& position = validRange.endPosition(); |
855 | 849 |
856 // Adjust the end of selection for multi-code text. TODO(yabinh): Adjustment | 850 // Adjust the end of selection for multi-code text. TODO(yabinh): Adjustment |
857 // should be based on code point instead of grapheme cluster. | 851 // should be based on code point instead of grapheme cluster. |
858 const size_t diff = computeDistanceToRightGraphemeBoundary(position); | 852 const size_t diff = computeDistanceToRightGraphemeBoundary(position); |
859 const int adjustedEnd = end + static_cast<int>(diff); | 853 const int adjustedEnd = end + static_cast<int>(diff); |
860 if (!setSelectionOffsets(PlainTextRange(selectionEnd, adjustedEnd))) | 854 if (!setSelectionOffsets(PlainTextRange(selectionEnd, adjustedEnd))) |
861 return; | 855 return; |
862 TypingCommand::deleteSelection(document(), | 856 TypingCommand::deleteSelection(document()); |
863 EditCommandSource::kMenuOrKeyBinding); | |
864 } | 857 } |
865 | 858 |
866 setSelectionOffsets(PlainTextRange(selectionStart, selectionEnd)); | 859 setSelectionOffsets(PlainTextRange(selectionStart, selectionEnd)); |
867 } | 860 } |
868 | 861 |
869 WebTextInputInfo InputMethodController::textInputInfo() const { | 862 WebTextInputInfo InputMethodController::textInputInfo() const { |
870 WebTextInputInfo info; | 863 WebTextInputInfo info; |
871 if (!isAvailable()) | 864 if (!isAvailable()) |
872 return info; | 865 return info; |
873 | 866 |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1080 frame().chromeClient().resetInputMethod(); | 1073 frame().chromeClient().resetInputMethod(); |
1081 } | 1074 } |
1082 | 1075 |
1083 DEFINE_TRACE(InputMethodController) { | 1076 DEFINE_TRACE(InputMethodController) { |
1084 visitor->trace(m_frame); | 1077 visitor->trace(m_frame); |
1085 visitor->trace(m_compositionRange); | 1078 visitor->trace(m_compositionRange); |
1086 SynchronousMutationObserver::trace(visitor); | 1079 SynchronousMutationObserver::trace(visitor); |
1087 } | 1080 } |
1088 | 1081 |
1089 } // namespace blink | 1082 } // namespace blink |
OLD | NEW |