Index: third_party/WebKit/Source/core/editing/InputMethodController.cpp |
diff --git a/third_party/WebKit/Source/core/editing/InputMethodController.cpp b/third_party/WebKit/Source/core/editing/InputMethodController.cpp |
index ca051a0c662ea21fe8e1dd82ca3db819b1c1d4e9..c8630caf54f642c69bcb1ae38354f93452b2ab69 100644 |
--- a/third_party/WebKit/Source/core/editing/InputMethodController.cpp |
+++ b/third_party/WebKit/Source/core/editing/InputMethodController.cpp |
@@ -472,6 +472,46 @@ void InputMethodController::extendSelectionAndDelete(int before, int after) |
TypingCommand::deleteSelection(*frame().document()); |
} |
+void InputMethodController::deleteSurroundingText(size_t before, size_t after) |
yosin_UTC9
2016/04/26 08:18:54
Can you guarantee |before| is at end of grapheme a
|
+{ |
+ if (!editor().canEdit()) |
+ return; |
+ PlainTextRange selectionOffsets(getSelectionOffsets()); |
+ if (selectionOffsets.isNull()) |
+ return; |
+ |
+ size_t selectionStart = selectionOffsets.start(); |
+ size_t selectionEnd = selectionOffsets.end(); |
+ |
+ if (before > 0u) { |
+ before = std::min(selectionStart, before); |
aelias_OOO_until_Jul13
2016/04/26 07:29:32
What is this line for? I don't understand it.
yabinh
2016/04/26 08:05:15
It's for boundary checking. In case that "before"
yosin_UTC9
2016/04/27 08:21:16
When |selectionStart|=0 and |before|=2, |before| g
|
+ |
+ // Select the text to be deleted before selectionStart. |
+ // For multi-code text, we can select it successfully if we only select |
+ // the left half of it, but we can't select it if we only select the |
+ // right half of it. For the latter case, we need to adjust the start |
+ // of selection. |
+ Position basePosition(frame().selection().start().anchorNode(), selectionStart - before + 1); |
aelias_OOO_until_Jul13
2016/04/26 07:29:32
Why + 1?
yabinh
2016/04/26 08:05:16
Because previousPositionOf(basePosition, PositionM
|
+ Position adjustedPosition = previousPositionOf(basePosition, PositionMoveType::GraphemeCluster); |
+ int adjustedStart = adjustedPosition.computeOffsetInContainerNode(); |
+ |
+ if (!setSelectionOffsets(PlainTextRange(adjustedStart, static_cast<int>(selectionStart)))) |
+ return; |
+ TypingCommand::deleteSelection(*frame().document()); |
aelias_OOO_until_Jul13
2016/04/26 07:29:32
Hmm, I still don't like the two deletion calls too
yabinh
2016/04/26 08:05:16
I've verified that this patch doesn't trigger any
yosin_UTC9
2016/04/26 08:18:54
Better way is using Range::delteContent(). It disp
yosin_UTC9
2016/04/26 09:12:29
How did you check these events? Did you check with
|
+ |
+ selectionEnd = selectionEnd - (selectionStart - adjustedStart); |
+ selectionStart = adjustedStart; |
+ } |
+ |
+ if (after > 0u) { |
+ if (!setSelectionOffsets(PlainTextRange(static_cast<int>(selectionEnd), static_cast<int>(selectionEnd + after)))) |
yosin_UTC9
2016/04/26 09:12:29
We may want to |selectionEnd + after| is at end of
|
+ return; |
+ TypingCommand::deleteSelection(*frame().document()); |
+ } |
+ |
+ setSelectionOffsets(PlainTextRange(selectionStart, selectionEnd)); |
+} |
+ |
DEFINE_TRACE(InputMethodController) |
{ |
visitor->trace(m_frame); |