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 e36cea49358ce24b90a500afbec5b97eb29f8242..ec71e2aa4bfa78c27d564891d18ccf876133cdc0 100644 |
--- a/third_party/WebKit/Source/core/editing/InputMethodController.cpp |
+++ b/third_party/WebKit/Source/core/editing/InputMethodController.cpp |
@@ -233,8 +233,35 @@ bool InputMethodController::confirmComposition(const String& text, ConfirmCompos |
return true; |
} |
-bool InputMethodController::confirmCompositionOrInsertText(const String& text, ConfirmCompositionBehavior confirmBehavior) |
+bool InputMethodController::confirmCompositionOrInsertText(const String& text, ConfirmCompositionBehavior confirmBehavior, int newCursorPosition) |
{ |
+ if (confirmBehavior == DoNotKeepSelection) { |
+ // If newCursorPosition > 0, it's relative to the end of the text - 1; |
+ // if newCursorPosition <= 0, it is relative to the start of the text. |
+ if (newCursorPosition > 0) |
+ newCursorPosition = newCursorPosition + text.length() - 1; |
Changwan Ryu
2016/08/03 07:37:30
newCursorPosition += text.length() - 1;
yabinh
2016/08/08 07:33:43
Done.
|
+ |
+ // According to Android documentation, the new cursor position is |
+ // relative to the composing text if any, or relative to the selection |
+ // if no composing text. |
+ if (hasComposition()) { |
+ Element* rootEditableElement = frame().selection().rootEditableElement(); |
+ if (!rootEditableElement) |
+ return false; |
yabinh
2016/08/03 05:12:09
Note that |m_compositionRange->startOffset()| is r
|
+ PlainTextRange compositionRange = PlainTextRange::create(*rootEditableElement, *m_compositionRange); |
+ |
+ if (text.length() == 0) |
+ newCursorPosition += compositionRange.end(); |
Changwan Ryu
2016/08/03 07:37:30
Why should this differ from the else line?
yabinh
2016/08/08 07:33:44
There are 2 cases when hasCompositio() == true:
aelias_OOO_until_Jul13
2016/08/24 08:13:07
Acknowledged, but checking "text.length() == 0" is
aelias_OOO_until_Jul13
2016/08/24 08:16:01
Sorry, please disregard this particular comment, i
|
+ else |
+ newCursorPosition += compositionRange.start(); |
+ } else { |
+ PlainTextRange selectionRange = getSelectionOffsets(); |
+ if (selectionRange.isNull()) |
+ return false; |
+ newCursorPosition += getSelectionOffsets().start(); |
+ } |
+ } |
+ |
if (!hasComposition()) { |
if (!text.length()) |
return false; |
@@ -243,19 +270,23 @@ bool InputMethodController::confirmCompositionOrInsertText(const String& text, C |
return false; |
editor().insertText(text, 0); |
- return true; |
- } |
- |
- if (text.length()) { |
+ } else if (text.length()) { |
confirmComposition(text); |
- return true; |
+ } else if (confirmBehavior == DoNotKeepSelection) { |
+ if (!confirmComposition(composingText(), DoNotKeepSelection)) |
+ return false; |
+ } else { |
+ SelectionOffsetsScope selectionOffsetsScope(this); |
+ return confirmComposition(); |
} |
- if (confirmBehavior == DoNotKeepSelection) |
- return confirmComposition(composingText(), DoNotKeepSelection); |
+ if (confirmBehavior == KeepSelection) |
+ return true; |
- SelectionOffsetsScope selectionOffsetsScope(this); |
- return confirmComposition(); |
+ PlainTextRange selectedRange = createRangeForSelection(newCursorPosition, newCursorPosition, 0); |
+ if (selectedRange.isNull()) |
+ return false; |
+ return setEditableSelectionOffsets(selectedRange); |
} |
void InputMethodController::cancelComposition() |
@@ -524,6 +555,9 @@ PlainTextRange InputMethodController::createRangeForSelection(int start, int end |
if (range.isNull()) |
return PlainTextRange(); |
yabinh
2016/08/03 05:12:09
There is a DCHECK in the constructor of TextIterat
|
+ if (frame().document()->needsLayoutTreeUpdate()) |
Changwan Ryu
2016/08/03 07:37:30
You probably need to call updateStyleAndLayoutTree
yabinh
2016/08/08 07:33:44
I tried to call it in InputMethodController#confir
|
+ return PlainTextRange(); |
+ |
const TextIteratorBehaviorFlags behaviorFlags = TextIteratorEmitsObjectReplacementCharacter | TextIteratorEmitsCharactersBetweenAllVisiblePositions; |
TextIterator it(range.startPosition(), range.endPosition(), behaviorFlags); |