Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(319)

Side by Side Diff: third_party/WebKit/Source/core/editing/InputMethodController.cpp

Issue 1889053003: Fix InputConnection.deleteSurroundingText() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 667 matching lines...) Expand 10 before | Expand all | Expand 10 after
678 } while (frame().selection().start() == frame().selection().end() && 678 } while (frame().selection().start() == frame().selection().end() &&
679 before <= static_cast<int>(selectionOffsets.start())); 679 before <= static_cast<int>(selectionOffsets.start()));
680 // TODO(chongz): Find a way to distinguish Forward and Backward. 680 // TODO(chongz): Find a way to distinguish Forward and Backward.
681 dispatchBeforeInputEditorCommand( 681 dispatchBeforeInputEditorCommand(
682 m_frame->document()->focusedElement(), 682 m_frame->document()->focusedElement(),
683 InputEvent::InputType::DeleteContentBackward, 683 InputEvent::InputType::DeleteContentBackward,
684 new RangeVector(1, m_frame->selection().firstRange())); 684 new RangeVector(1, m_frame->selection().firstRange()));
685 TypingCommand::deleteSelection(*frame().document()); 685 TypingCommand::deleteSelection(*frame().document());
686 } 686 }
687 687
688 // TODO(yabinh): We should reduce the number of selectionchange events.
689 void InputMethodController::deleteSurroundingText(int before, int after) {
690 if (!editor().canEdit())
691 return;
692 PlainTextRange selectionOffsets(getSelectionOffsets());
693 if (selectionOffsets.isNull())
694 return;
695 Element* rootEditableElement = frame().selection().rootEditableElement();
696 if (!rootEditableElement)
697 return;
698
699 int selectionStart = static_cast<int>(selectionOffsets.start());
700 int selectionEnd = static_cast<int>(selectionOffsets.end());
701
702 if (before > 0 && selectionStart > 0) {
703 // In case of exceeding the left boundary.
704 int start = std::max(selectionStart - before, 0);
705
706 // Select the text to be deleted before selectionStart.
707 // We should adjust the start of selection for multi-code text(a grapheme
708 // cluster contains more than one code point).
709 const EphemeralRange& range =
710 PlainTextRange(0, start).createRange(*rootEditableElement);
711 if (range.isNull())
712 return;
713 const Position& position = range.endPosition();
714 // TODO(yabinh): Deletion should be based on code point instead of grapheme
715 // cluster.
716 const Position& adjustedPosition = previousPositionOf(
yosin_UTC9 2016/10/12 08:34:17 I saw this pattern in another CL. Can we have func
yabinh 2016/10/13 01:44:33 Done.
717 nextPositionOf(position, PositionMoveType::GraphemeCluster),
718 PositionMoveType::GraphemeCluster);
719 DCHECK_EQ(position.anchorNode(), adjustedPosition.anchorNode());
720 DCHECK_LE(adjustedPosition.computeOffsetInContainerNode(),
721 position.computeOffsetInContainerNode());
722 const int diff = adjustedPosition.computeOffsetInContainerNode() -
723 position.computeOffsetInContainerNode();
724 start = start + diff;
yosin_UTC9 2016/10/12 08:34:17 Let's introduce new variable, e.g. |adjustedStart|
yabinh 2016/10/13 01:44:33 Done.
725
726 if (!setSelectionOffsets(PlainTextRange(start, selectionStart)))
727 return;
728 TypingCommand::deleteSelection(*frame().document());
729
730 selectionEnd = selectionEnd - (selectionStart - start);
731 selectionStart = start;
732 }
733
734 if (after > 0) {
735 // Adjust the deleted range in case of exceeding the right boundary.
736 PlainTextRange range(0, selectionEnd + after);
737 if (range.isNull())
738 return;
739 const EphemeralRange& validRange = range.createRange(*rootEditableElement);
740 if (validRange.isNull())
741 return;
742 int end = PlainTextRange::create(*rootEditableElement, validRange).end();
743
744 // We also need to adjust the end of selection for multi-code text.
745 const Position& position = validRange.endPosition();
746 const Position& adjustedPosition = nextPositionOf(
747 previousPositionOf(position, PositionMoveType::GraphemeCluster),
748 PositionMoveType::GraphemeCluster);
749 DCHECK_EQ(position.anchorNode(), adjustedPosition.anchorNode());
750 DCHECK_GE(adjustedPosition.computeOffsetInContainerNode(),
751 position.computeOffsetInContainerNode());
752 const int diff = adjustedPosition.computeOffsetInContainerNode() -
753 position.computeOffsetInContainerNode();
754 end = end + diff;
yosin_UTC9 2016/10/12 08:34:17 Let's introduce new variable, e.g. |adjustedEnd|.
yabinh 2016/10/13 01:44:33 Done.
755
756 if (!setSelectionOffsets(PlainTextRange(selectionEnd, end)))
757 return;
758 TypingCommand::deleteSelection(*frame().document());
759 }
760
761 setSelectionOffsets(PlainTextRange(selectionStart, selectionEnd));
762 }
763
688 DEFINE_TRACE(InputMethodController) { 764 DEFINE_TRACE(InputMethodController) {
689 visitor->trace(m_frame); 765 visitor->trace(m_frame);
690 visitor->trace(m_compositionRange); 766 visitor->trace(m_compositionRange);
691 } 767 }
692 768
693 } // namespace blink 769 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698