| 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(*frame.document(), text, options, | 147 TypingCommand::insertText( |
| 148 compositionType, isIncrementalInsertion); | 148 *frame.document(), EditCommandSource::kMenuOrKeyBinding, text, |
| 149 options, compositionType, isIncrementalInsertion); |
| 149 break; | 150 break; |
| 150 case TypingCommand::TextCompositionType::TextCompositionCancel: | 151 case TypingCommand::TextCompositionType::TextCompositionCancel: |
| 151 // TODO(chongz): Use TypingCommand::insertText after TextEvent was | 152 // TODO(chongz): Use TypingCommand::insertText after TextEvent was |
| 152 // removed. (Removed from spec since 2012) | 153 // removed. (Removed from spec since 2012) |
| 153 // See TextEvent.idl. | 154 // See TextEvent.idl. |
| 154 frame.eventHandler().handleTextInputEvent(text, 0, | 155 frame.eventHandler().handleTextInputEvent(text, 0, |
| 155 TextEventInputComposition); | 156 TextEventInputComposition); |
| 156 break; | 157 break; |
| 157 default: | 158 default: |
| 158 NOTREACHED(); | 159 NOTREACHED(); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 | 293 |
| 293 if (frame().selection().isNone()) | 294 if (frame().selection().isNone()) |
| 294 return false; | 295 return false; |
| 295 | 296 |
| 296 if (!isAvailable()) | 297 if (!isAvailable()) |
| 297 return false; | 298 return false; |
| 298 | 299 |
| 299 // If text is empty, then delete the old composition here. If text is | 300 // If text is empty, then delete the old composition here. If text is |
| 300 // non-empty, InsertTextCommand::input will delete the old composition with | 301 // non-empty, InsertTextCommand::input will delete the old composition with |
| 301 // an optimized replace operation. | 302 // an optimized replace operation. |
| 302 if (text.isEmpty()) | 303 if (text.isEmpty()) { |
| 303 TypingCommand::deleteSelection(document(), 0); | 304 TypingCommand::deleteSelection(document(), |
| 305 EditCommandSource::kMenuOrKeyBinding, 0); |
| 306 } |
| 304 | 307 |
| 305 clear(); | 308 clear(); |
| 306 | 309 |
| 307 insertTextDuringCompositionWithEvents( | 310 insertTextDuringCompositionWithEvents( |
| 308 frame(), text, 0, | 311 frame(), text, 0, |
| 309 TypingCommand::TextCompositionType::TextCompositionConfirm); | 312 TypingCommand::TextCompositionType::TextCompositionConfirm); |
| 310 // Event handler might destroy document. | 313 // Event handler might destroy document. |
| 311 if (!isAvailable()) | 314 if (!isAvailable()) |
| 312 return false; | 315 return false; |
| 313 | 316 |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 // composition node, i.e. !hasComposition() && test.isEmpty(). | 495 // composition node, i.e. !hasComposition() && test.isEmpty(). |
| 493 if (text.isEmpty()) { | 496 if (text.isEmpty()) { |
| 494 if (hasComposition()) { | 497 if (hasComposition()) { |
| 495 Editor::RevealSelectionScope revealSelectionScope(&editor()); | 498 Editor::RevealSelectionScope revealSelectionScope(&editor()); |
| 496 replaceComposition(emptyString()); | 499 replaceComposition(emptyString()); |
| 497 } else { | 500 } else { |
| 498 // It's weird to call |setComposition()| with empty text outside | 501 // It's weird to call |setComposition()| with empty text outside |
| 499 // composition, however some IME (e.g. Japanese IBus-Anthy) did this, so | 502 // composition, however some IME (e.g. Japanese IBus-Anthy) did this, so |
| 500 // we simply delete selection without sending extra events. | 503 // we simply delete selection without sending extra events. |
| 501 TypingCommand::deleteSelection(document(), | 504 TypingCommand::deleteSelection(document(), |
| 505 EditCommandSource::kMenuOrKeyBinding, |
| 502 TypingCommand::PreventSpellChecking); | 506 TypingCommand::PreventSpellChecking); |
| 503 } | 507 } |
| 504 | 508 |
| 505 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets | 509 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets |
| 506 // needs to be audited. see http://crbug.com/590369 for more details. | 510 // needs to be audited. see http://crbug.com/590369 for more details. |
| 507 document().updateStyleAndLayoutIgnorePendingStylesheets(); | 511 document().updateStyleAndLayoutIgnorePendingStylesheets(); |
| 508 | 512 |
| 509 setEditableSelectionOffsets(selectedRange); | 513 setEditableSelectionOffsets(selectedRange); |
| 510 | 514 |
| 511 // No DOM update after 'compositionend'. | 515 // No DOM update after 'compositionend'. |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 769 return; | 773 return; |
| 770 if (before == 0) | 774 if (before == 0) |
| 771 break; | 775 break; |
| 772 ++before; | 776 ++before; |
| 773 } while (frame().selection().start() == frame().selection().end() && | 777 } while (frame().selection().start() == frame().selection().end() && |
| 774 before <= static_cast<int>(selectionOffsets.start())); | 778 before <= static_cast<int>(selectionOffsets.start())); |
| 775 // TODO(chongz): Find a way to distinguish Forward and Backward. | 779 // TODO(chongz): Find a way to distinguish Forward and Backward. |
| 776 dispatchBeforeInputEditorCommand( | 780 dispatchBeforeInputEditorCommand( |
| 777 document().focusedElement(), InputEvent::InputType::DeleteContentBackward, | 781 document().focusedElement(), InputEvent::InputType::DeleteContentBackward, |
| 778 new RangeVector(1, m_frame->selection().firstRange())); | 782 new RangeVector(1, m_frame->selection().firstRange())); |
| 779 TypingCommand::deleteSelection(document()); | 783 TypingCommand::deleteSelection(document(), |
| 784 EditCommandSource::kMenuOrKeyBinding); |
| 780 } | 785 } |
| 781 | 786 |
| 782 // TODO(yabinh): We should reduce the number of selectionchange events. | 787 // TODO(yabinh): We should reduce the number of selectionchange events. |
| 783 void InputMethodController::deleteSurroundingText(int before, int after) { | 788 void InputMethodController::deleteSurroundingText(int before, int after) { |
| 784 if (!editor().canEdit()) | 789 if (!editor().canEdit()) |
| 785 return; | 790 return; |
| 786 const PlainTextRange selectionOffsets(getSelectionOffsets()); | 791 const PlainTextRange selectionOffsets(getSelectionOffsets()); |
| 787 if (selectionOffsets.isNull()) | 792 if (selectionOffsets.isNull()) |
| 788 return; | 793 return; |
| 789 Element* const rootEditableElement = | 794 Element* const rootEditableElement = |
| (...skipping 14 matching lines...) Expand all Loading... |
| 804 return; | 809 return; |
| 805 const Position& position = range.endPosition(); | 810 const Position& position = range.endPosition(); |
| 806 | 811 |
| 807 // Adjust the start of selection for multi-code text(a grapheme cluster | 812 // Adjust the start of selection for multi-code text(a grapheme cluster |
| 808 // contains more than one code point). TODO(yabinh): Adjustment should be | 813 // contains more than one code point). TODO(yabinh): Adjustment should be |
| 809 // based on code point instead of grapheme cluster. | 814 // based on code point instead of grapheme cluster. |
| 810 const size_t diff = computeDistanceToLeftGraphemeBoundary(position); | 815 const size_t diff = computeDistanceToLeftGraphemeBoundary(position); |
| 811 const int adjustedStart = start - static_cast<int>(diff); | 816 const int adjustedStart = start - static_cast<int>(diff); |
| 812 if (!setSelectionOffsets(PlainTextRange(adjustedStart, selectionStart))) | 817 if (!setSelectionOffsets(PlainTextRange(adjustedStart, selectionStart))) |
| 813 return; | 818 return; |
| 814 TypingCommand::deleteSelection(document()); | 819 TypingCommand::deleteSelection(document(), |
| 820 EditCommandSource::kMenuOrKeyBinding); |
| 815 | 821 |
| 816 selectionEnd = selectionEnd - (selectionStart - adjustedStart); | 822 selectionEnd = selectionEnd - (selectionStart - adjustedStart); |
| 817 selectionStart = adjustedStart; | 823 selectionStart = adjustedStart; |
| 818 } | 824 } |
| 819 | 825 |
| 820 // Select the text to be deleted after selectionEnd. | 826 // Select the text to be deleted after selectionEnd. |
| 821 if (after > 0) { | 827 if (after > 0) { |
| 822 // Adjust the deleted range in case of exceeding the right boundary. | 828 // Adjust the deleted range in case of exceeding the right boundary. |
| 823 const PlainTextRange range(0, selectionEnd + after); | 829 const PlainTextRange range(0, selectionEnd + after); |
| 824 if (range.isNull()) | 830 if (range.isNull()) |
| 825 return; | 831 return; |
| 826 const EphemeralRange& validRange = range.createRange(*rootEditableElement); | 832 const EphemeralRange& validRange = range.createRange(*rootEditableElement); |
| 827 if (validRange.isNull()) | 833 if (validRange.isNull()) |
| 828 return; | 834 return; |
| 829 const int end = | 835 const int end = |
| 830 PlainTextRange::create(*rootEditableElement, validRange).end(); | 836 PlainTextRange::create(*rootEditableElement, validRange).end(); |
| 831 const Position& position = validRange.endPosition(); | 837 const Position& position = validRange.endPosition(); |
| 832 | 838 |
| 833 // Adjust the end of selection for multi-code text. TODO(yabinh): Adjustment | 839 // Adjust the end of selection for multi-code text. TODO(yabinh): Adjustment |
| 834 // should be based on code point instead of grapheme cluster. | 840 // should be based on code point instead of grapheme cluster. |
| 835 const size_t diff = computeDistanceToRightGraphemeBoundary(position); | 841 const size_t diff = computeDistanceToRightGraphemeBoundary(position); |
| 836 const int adjustedEnd = end + static_cast<int>(diff); | 842 const int adjustedEnd = end + static_cast<int>(diff); |
| 837 if (!setSelectionOffsets(PlainTextRange(selectionEnd, adjustedEnd))) | 843 if (!setSelectionOffsets(PlainTextRange(selectionEnd, adjustedEnd))) |
| 838 return; | 844 return; |
| 839 TypingCommand::deleteSelection(document()); | 845 TypingCommand::deleteSelection(document(), |
| 846 EditCommandSource::kMenuOrKeyBinding); |
| 840 } | 847 } |
| 841 | 848 |
| 842 setSelectionOffsets(PlainTextRange(selectionStart, selectionEnd)); | 849 setSelectionOffsets(PlainTextRange(selectionStart, selectionEnd)); |
| 843 } | 850 } |
| 844 | 851 |
| 845 WebTextInputInfo InputMethodController::textInputInfo() const { | 852 WebTextInputInfo InputMethodController::textInputInfo() const { |
| 846 WebTextInputInfo info; | 853 WebTextInputInfo info; |
| 847 if (!isAvailable()) | 854 if (!isAvailable()) |
| 848 return info; | 855 return info; |
| 849 | 856 |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1056 frame().chromeClient().resetInputMethod(); | 1063 frame().chromeClient().resetInputMethod(); |
| 1057 } | 1064 } |
| 1058 | 1065 |
| 1059 DEFINE_TRACE(InputMethodController) { | 1066 DEFINE_TRACE(InputMethodController) { |
| 1060 visitor->trace(m_frame); | 1067 visitor->trace(m_frame); |
| 1061 visitor->trace(m_compositionRange); | 1068 visitor->trace(m_compositionRange); |
| 1062 SynchronousMutationObserver::trace(visitor); | 1069 SynchronousMutationObserver::trace(visitor); |
| 1063 } | 1070 } |
| 1064 | 1071 |
| 1065 } // namespace blink | 1072 } // namespace blink |
| OLD | NEW |