| 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 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 } | 260 } |
| 261 | 261 |
| 262 bool InputMethodController::finishComposingText( | 262 bool InputMethodController::finishComposingText( |
| 263 ConfirmCompositionBehavior confirmBehavior) { | 263 ConfirmCompositionBehavior confirmBehavior) { |
| 264 if (!hasComposition()) | 264 if (!hasComposition()) |
| 265 return false; | 265 return false; |
| 266 | 266 |
| 267 const String& composing = composingText(); | 267 const String& composing = composingText(); |
| 268 | 268 |
| 269 if (confirmBehavior == KeepSelection) { | 269 if (confirmBehavior == KeepSelection) { |
| 270 PlainTextRange oldOffsets = getSelectionOffsets(); | 270 // Do not dismiss handles even if we are moving selection, because we will |
| 271 // eventually move back to the old selection offsets. |
| 272 const bool isHandleVisible = frame().selection().isHandleVisible(); |
| 273 |
| 274 const PlainTextRange& oldOffsets = getSelectionOffsets(); |
| 271 Editor::RevealSelectionScope revealSelectionScope(&editor()); | 275 Editor::RevealSelectionScope revealSelectionScope(&editor()); |
| 272 | 276 |
| 273 clear(); | 277 clear(); |
| 274 dispatchCompositionEndEvent(frame(), composing); | 278 dispatchCompositionEndEvent(frame(), composing); |
| 275 | 279 |
| 276 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets | 280 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets |
| 277 // needs to be audited. see http://crbug.com/590369 for more details. | 281 // needs to be audited. see http://crbug.com/590369 for more details. |
| 278 document().updateStyleAndLayoutIgnorePendingStylesheets(); | 282 document().updateStyleAndLayoutIgnorePendingStylesheets(); |
| 279 setSelectionOffsets(oldOffsets); | 283 |
| 284 const EphemeralRange& oldSelectionRange = |
| 285 ephemeralRangeForOffsets(oldOffsets); |
| 286 if (oldSelectionRange.isNull()) |
| 287 return false; |
| 288 const SelectionInDOMTree& selection = |
| 289 SelectionInDOMTree::Builder() |
| 290 .setBaseAndExtent(oldSelectionRange) |
| 291 .setIsHandleVisible(isHandleVisible) |
| 292 .build(); |
| 293 frame().selection().setSelection(selection, FrameSelection::CloseTyping); |
| 280 return true; | 294 return true; |
| 281 } | 295 } |
| 282 | 296 |
| 283 Element* rootEditableElement = frame().selection().rootEditableElement(); | 297 Element* rootEditableElement = frame().selection().rootEditableElement(); |
| 284 if (!rootEditableElement) | 298 if (!rootEditableElement) |
| 285 return false; | 299 return false; |
| 286 PlainTextRange compositionRange = | 300 PlainTextRange compositionRange = |
| 287 PlainTextRange::create(*rootEditableElement, *m_compositionRange); | 301 PlainTextRange::create(*rootEditableElement, *m_compositionRange); |
| 288 if (compositionRange.isNull()) | 302 if (compositionRange.isNull()) |
| 289 return false; | 303 return false; |
| (...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 706 PlainTextRange InputMethodController::getSelectionOffsets() const { | 720 PlainTextRange InputMethodController::getSelectionOffsets() const { |
| 707 EphemeralRange range = firstEphemeralRangeOf(frame().selection().selection()); | 721 EphemeralRange range = firstEphemeralRangeOf(frame().selection().selection()); |
| 708 if (range.isNull()) | 722 if (range.isNull()) |
| 709 return PlainTextRange(); | 723 return PlainTextRange(); |
| 710 ContainerNode* editable = | 724 ContainerNode* editable = |
| 711 frame().selection().rootEditableElementOrTreeScopeRootNode(); | 725 frame().selection().rootEditableElementOrTreeScopeRootNode(); |
| 712 DCHECK(editable); | 726 DCHECK(editable); |
| 713 return PlainTextRange::create(*editable, range); | 727 return PlainTextRange::create(*editable, range); |
| 714 } | 728 } |
| 715 | 729 |
| 730 EphemeralRange InputMethodController::ephemeralRangeForOffsets( |
| 731 const PlainTextRange& offsets) const { |
| 732 if (offsets.isNull()) |
| 733 return EphemeralRange(); |
| 734 Element* rootEditableElement = frame().selection().rootEditableElement(); |
| 735 if (!rootEditableElement) |
| 736 return EphemeralRange(); |
| 737 |
| 738 DCHECK(!document().needsLayoutTreeUpdate()); |
| 739 |
| 740 return offsets.createRange(*rootEditableElement); |
| 741 } |
| 742 |
| 716 bool InputMethodController::setSelectionOffsets( | 743 bool InputMethodController::setSelectionOffsets( |
| 717 const PlainTextRange& selectionOffsets, | 744 const PlainTextRange& selectionOffsets, |
| 718 FrameSelection::SetSelectionOptions options) { | 745 FrameSelection::SetSelectionOptions options) { |
| 719 if (selectionOffsets.isNull()) | 746 const EphemeralRange range = ephemeralRangeForOffsets(selectionOffsets); |
| 720 return false; | |
| 721 Element* rootEditableElement = frame().selection().rootEditableElement(); | |
| 722 if (!rootEditableElement) | |
| 723 return false; | |
| 724 | |
| 725 DCHECK(!document().needsLayoutTreeUpdate()); | |
| 726 | |
| 727 const EphemeralRange range = | |
| 728 selectionOffsets.createRange(*rootEditableElement); | |
| 729 if (range.isNull()) | 747 if (range.isNull()) |
| 730 return false; | 748 return false; |
| 731 | 749 |
| 732 return frame().selection().setSelectedRange( | 750 return frame().selection().setSelectedRange( |
| 733 range, VP_DEFAULT_AFFINITY, SelectionDirectionalMode::NonDirectional, | 751 range, VP_DEFAULT_AFFINITY, SelectionDirectionalMode::NonDirectional, |
| 734 options); | 752 options); |
| 735 } | 753 } |
| 736 | 754 |
| 737 bool InputMethodController::setEditableSelectionOffsets( | 755 bool InputMethodController::setEditableSelectionOffsets( |
| 738 const PlainTextRange& selectionOffsets, | 756 const PlainTextRange& selectionOffsets, |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1106 frame().chromeClient().resetInputMethod(); | 1124 frame().chromeClient().resetInputMethod(); |
| 1107 } | 1125 } |
| 1108 | 1126 |
| 1109 DEFINE_TRACE(InputMethodController) { | 1127 DEFINE_TRACE(InputMethodController) { |
| 1110 visitor->trace(m_frame); | 1128 visitor->trace(m_frame); |
| 1111 visitor->trace(m_compositionRange); | 1129 visitor->trace(m_compositionRange); |
| 1112 SynchronousMutationObserver::trace(visitor); | 1130 SynchronousMutationObserver::trace(visitor); |
| 1113 } | 1131 } |
| 1114 | 1132 |
| 1115 } // namespace blink | 1133 } // namespace blink |
| OLD | NEW |