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

Unified Diff: third_party/WebKit/Source/web/WebViewImpl.cpp

Issue 2020973002: Reland: Fix setComposingText with empty text when newCursorPosition != 1 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: check the boundary in WebViewImpl instead of render_widget Created 4 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/web/WebViewImpl.cpp
diff --git a/third_party/WebKit/Source/web/WebViewImpl.cpp b/third_party/WebKit/Source/web/WebViewImpl.cpp
index 3e92e32a2f867341300bb60c550f5729a13a1c55..c44a9fa4d494b3c77d3d0a21143e712114936821 100644
--- a/third_party/WebKit/Source/web/WebViewImpl.cpp
+++ b/third_party/WebKit/Source/web/WebViewImpl.cpp
@@ -2314,6 +2314,29 @@ void WebViewImpl::setFocus(bool enable)
}
}
+std::pair<int, int> WebViewImpl::adjustSelectionForBoundary(int selectionStart, int selectionEnd, const int textLength)
+{
yabinh 2016/07/06 11:53:55 textInputInfo() is quite an expensive function, bu
Changwan Ryu 2016/07/07 09:09:33 You should avoid calling textInputInfo(). textInpu
+ WebTextInputInfo textInputInfo = this->textInputInfo();
+
+ int compositionLength = textInputInfo.compositionEnd - textInputInfo.compositionStart;
+ int beforeCompositionLength;
+ if (compositionLength != 0)
+ beforeCompositionLength = textInputInfo.compositionStart;
+ else
+ beforeCompositionLength = textInputInfo.selectionStart;
+ int afterCompositionLength = static_cast<int>(textInputInfo.value.length()) - compositionLength - beforeCompositionLength;
+
+ // In case of exceeding the left boundary.
+ selectionStart = std::max(selectionStart, -beforeCompositionLength);
+ selectionEnd = std::max(selectionEnd, selectionStart);
+
+ // In case of exceeding the right boundary.
+ selectionEnd = std::min(selectionEnd, textLength + afterCompositionLength);
+ selectionStart = std::min(selectionStart, selectionEnd);
+
+ return std::make_pair(selectionStart, selectionEnd);
+}
+
bool WebViewImpl::setComposition(
const WebString& text,
const WebVector<WebCompositionUnderline>& underlines,
@@ -2355,13 +2378,15 @@ bool WebViewImpl::setComposition(
UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture);
yabinh 2016/07/06 11:53:55 adjustSelectionForBoundary is moved here, thus it
+ std::pair<int, int> selectionPair = adjustSelectionForBoundary(selectionStart, selectionEnd, text.length());
+
// When the range of composition underlines overlap with the range between
// selectionStart and selectionEnd, WebKit somehow won't paint the selection
// at all (see InlineTextBox::paint() function in InlineTextBox.cpp).
// But the selection range actually takes effect.
inputMethodController.setComposition(String(text),
CompositionUnderlineVectorBuilder(underlines),
- selectionStart, selectionEnd);
+ selectionPair.first, selectionPair.second);
return text.isEmpty() || inputMethodController.hasComposition();
}

Powered by Google App Engine
This is Rietveld 408576698