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

Unified Diff: third_party/WebKit/Source/web/tests/WebViewTest.cpp

Issue 1995333002: Handle newCursorPosition correctly for Android's commitText() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move caret within composing text. Created 4 years, 4 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/tests/WebViewTest.cpp
diff --git a/third_party/WebKit/Source/web/tests/WebViewTest.cpp b/third_party/WebKit/Source/web/tests/WebViewTest.cpp
index c07d091f234cbf64543d83224afcdc608a41684a..36b70a8f4f25550400ef2402c0aecd4379daef45 100644
--- a/third_party/WebKit/Source/web/tests/WebViewTest.cpp
+++ b/third_party/WebKit/Source/web/tests/WebViewTest.cpp
@@ -862,6 +862,287 @@ TEST_F(WebViewTest, ConfirmCompositionCursorPositionChange)
EXPECT_EQ(-1, info.compositionEnd);
}
+TEST_F(WebViewTest, SetCompositionForNewCaretPositions)
+{
+ URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("input_field_populated.html"));
+ WebView* webView = m_webViewHelper.initializeAndLoad(m_baseURL + "input_field_populated.html");
+ webView->setInitialFocus(false);
+
+ webView->confirmComposition("hello", 0);
+ webView->confirmComposition("world", -5);
+ WebTextInputInfo info = webView->textInputInfo();
+ EXPECT_EQ("helloworld", std::string(info.value.utf8().data()));
+ EXPECT_EQ(5, info.selectionStart);
+ EXPECT_EQ(5, info.selectionEnd);
+ EXPECT_EQ(-1, info.compositionStart);
+ EXPECT_EQ(-1, info.compositionEnd);
+
+ WebVector<WebCompositionUnderline> emptyUnderlines;
+ // Set up a composition that needs to be committed.
+ std::string compositionText("ABC");
+
+ // Caret is on the left of composing text.
+ webView->setComposition(WebString::fromUTF8(compositionText.c_str()), emptyUnderlines, 0, 0);
+ info = webView->textInputInfo();
+ EXPECT_EQ("helloABCworld", std::string(info.value.utf8().data()));
+ EXPECT_EQ(5, info.selectionStart);
+ EXPECT_EQ(5, info.selectionEnd);
+ EXPECT_EQ(5, info.compositionStart);
+ EXPECT_EQ(8, info.compositionEnd);
+
+ // Caret is on the right of composing text.
+ webView->setComposition(WebString::fromUTF8(compositionText.c_str()), emptyUnderlines, 3, 3);
+ info = webView->textInputInfo();
+ EXPECT_EQ("helloABCworld", std::string(info.value.utf8().data()));
+ EXPECT_EQ(8, info.selectionStart);
+ EXPECT_EQ(8, info.selectionEnd);
+ EXPECT_EQ(5, info.compositionStart);
+ EXPECT_EQ(8, info.compositionEnd);
+
+ // Caret is between composing text and left boundary.
+ webView->setComposition(WebString::fromUTF8(compositionText.c_str()), emptyUnderlines, -2, -2);
+ info = webView->textInputInfo();
+ EXPECT_EQ("helloABCworld", std::string(info.value.utf8().data()));
+ EXPECT_EQ(3, info.selectionStart);
+ EXPECT_EQ(3, info.selectionEnd);
+ EXPECT_EQ(5, info.compositionStart);
+ EXPECT_EQ(8, info.compositionEnd);
+
+ // Caret is between composing text and right boundary.
+ webView->setComposition(WebString::fromUTF8(compositionText.c_str()), emptyUnderlines, 5, 5);
+ info = webView->textInputInfo();
+ EXPECT_EQ("helloABCworld", std::string(info.value.utf8().data()));
+ EXPECT_EQ(10, info.selectionStart);
+ EXPECT_EQ(10, info.selectionEnd);
+ EXPECT_EQ(5, info.compositionStart);
+ EXPECT_EQ(8, info.compositionEnd);
+
+ // Caret is on the left boundary.
+ webView->setComposition(WebString::fromUTF8(compositionText.c_str()), emptyUnderlines, -5, -5);
+ info = webView->textInputInfo();
+ EXPECT_EQ("helloABCworld", std::string(info.value.utf8().data()));
+ EXPECT_EQ(0, info.selectionStart);
+ EXPECT_EQ(0, info.selectionEnd);
+ EXPECT_EQ(5, info.compositionStart);
+ EXPECT_EQ(8, info.compositionEnd);
+
+ // Caret is on the right boundary.
+ webView->setComposition(WebString::fromUTF8(compositionText.c_str()), emptyUnderlines, 8, 8);
+ info = webView->textInputInfo();
+ EXPECT_EQ("helloABCworld", std::string(info.value.utf8().data()));
+ EXPECT_EQ(13, info.selectionStart);
+ EXPECT_EQ(13, info.selectionEnd);
+ EXPECT_EQ(5, info.compositionStart);
+ EXPECT_EQ(8, info.compositionEnd);
+
+ // Caret exceeds the left boundary.
+ webView->setComposition(WebString::fromUTF8(compositionText.c_str()), emptyUnderlines, -100, -100);
+ info = webView->textInputInfo();
+ EXPECT_EQ("helloABCworld", std::string(info.value.utf8().data()));
+ EXPECT_EQ(0, info.selectionStart);
+ EXPECT_EQ(0, info.selectionEnd);
+ EXPECT_EQ(5, info.compositionStart);
+ EXPECT_EQ(8, info.compositionEnd);
+
+ // Caret exceeds the right boundary.
+ webView->setComposition(WebString::fromUTF8(compositionText.c_str()), emptyUnderlines, 100, 100);
+ info = webView->textInputInfo();
+ EXPECT_EQ("helloABCworld", std::string(info.value.utf8().data()));
+ EXPECT_EQ(13, info.selectionStart);
+ EXPECT_EQ(13, info.selectionEnd);
+ EXPECT_EQ(5, info.compositionStart);
+ EXPECT_EQ(8, info.compositionEnd);
+}
+
+TEST_F(WebViewTest, SetCompositionWithEmptyText)
+{
+ URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("input_field_populated.html"));
+ WebView* webView = m_webViewHelper.initializeAndLoad(m_baseURL + "input_field_populated.html");
+ webView->setInitialFocus(false);
+
+ webView->confirmComposition("hello", 0);
+ WebTextInputInfo info = webView->textInputInfo();
+ EXPECT_EQ("hello", std::string(info.value.utf8().data()));
+ EXPECT_EQ(5, info.selectionStart);
+ EXPECT_EQ(5, info.selectionEnd);
+ EXPECT_EQ(-1, info.compositionStart);
+ EXPECT_EQ(-1, info.compositionEnd);
+
+ WebVector<WebCompositionUnderline> emptyUnderlines;
+
+ webView->setComposition(WebString::fromUTF8(""), emptyUnderlines, 0, 0);
+ info = webView->textInputInfo();
+ EXPECT_EQ("hello", std::string(info.value.utf8().data()));
+ EXPECT_EQ(5, info.selectionStart);
+ EXPECT_EQ(5, info.selectionEnd);
+ EXPECT_EQ(-1, info.compositionStart);
+ EXPECT_EQ(-1, info.compositionEnd);
+
+ webView->setComposition(WebString::fromUTF8(""), emptyUnderlines, -2, -2);
+ info = webView->textInputInfo();
+ EXPECT_EQ("hello", std::string(info.value.utf8().data()));
+ EXPECT_EQ(3, info.selectionStart);
+ EXPECT_EQ(3, info.selectionEnd);
+ EXPECT_EQ(-1, info.compositionStart);
+ EXPECT_EQ(-1, info.compositionEnd);
+}
+
+TEST_F(WebViewTest, ConfirmCompositionForNewCaretPositions)
+{
+ URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("input_field_populated.html"));
+ WebView* webView = m_webViewHelper.initializeAndLoad(m_baseURL + "input_field_populated.html");
+ webView->setInitialFocus(false);
+
+ // Caret is on the left of composing text.
+ webView->confirmComposition("ab", -2);
+ WebTextInputInfo info = webView->textInputInfo();
+ EXPECT_EQ("ab", std::string(info.value.utf8().data()));
+ EXPECT_EQ(0, info.selectionStart);
+ EXPECT_EQ(0, info.selectionEnd);
+ EXPECT_EQ(-1, info.compositionStart);
+ EXPECT_EQ(-1, info.compositionEnd);
+
+ // Caret is on the right of composing text.
+ webView->confirmComposition("c", 1);
+ info = webView->textInputInfo();
+ EXPECT_EQ("cab", std::string(info.value.utf8().data()));
+ EXPECT_EQ(2, info.selectionStart);
+ EXPECT_EQ(2, info.selectionEnd);
+ EXPECT_EQ(-1, info.compositionStart);
+ EXPECT_EQ(-1, info.compositionEnd);
+
+ // Caret is on the left boundary.
+ webView->confirmComposition("def", -5);
+ info = webView->textInputInfo();
+ EXPECT_EQ("cadefb", std::string(info.value.utf8().data()));
+ EXPECT_EQ(0, info.selectionStart);
+ EXPECT_EQ(0, info.selectionEnd);
+ EXPECT_EQ(-1, info.compositionStart);
+ EXPECT_EQ(-1, info.compositionEnd);
+
+ // Caret is on the right boundary.
+ webView->confirmComposition("g", 6);
+ info = webView->textInputInfo();
+ EXPECT_EQ("gcadefb", std::string(info.value.utf8().data()));
+ EXPECT_EQ(7, info.selectionStart);
+ EXPECT_EQ(7, info.selectionEnd);
+ EXPECT_EQ(-1, info.compositionStart);
+ EXPECT_EQ(-1, info.compositionEnd);
+
+ // Caret exceeds the left boundary.
+ webView->confirmComposition("hi", -100);
+ info = webView->textInputInfo();
+ EXPECT_EQ("gcadefbhi", std::string(info.value.utf8().data()));
+ EXPECT_EQ(0, info.selectionStart);
+ EXPECT_EQ(0, info.selectionEnd);
+ EXPECT_EQ(-1, info.compositionStart);
+ EXPECT_EQ(-1, info.compositionEnd);
+
+ // Caret exceeds the right boundary.
+ webView->confirmComposition("jk", 100);
+ info = webView->textInputInfo();
+ EXPECT_EQ("jkgcadefbhi", std::string(info.value.utf8().data()));
+ EXPECT_EQ(11, info.selectionStart);
+ EXPECT_EQ(11, info.selectionEnd);
+ EXPECT_EQ(-1, info.compositionStart);
+ EXPECT_EQ(-1, info.compositionEnd);
+}
+
+TEST_F(WebViewTest, ConfirmCompositionOrInsertText)
+{
+ URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("input_field_populated.html"));
+ WebView* webView = m_webViewHelper.initializeAndLoad(m_baseURL + "input_field_populated.html");
+ webView->setInitialFocus(false);
+
+ webView->confirmComposition("abc", 0);
+ WebTextInputInfo info = webView->textInputInfo();
+ EXPECT_EQ("abc", std::string(info.value.utf8().data()));
+ EXPECT_EQ(3, info.selectionStart);
+ EXPECT_EQ(3, info.selectionEnd);
+ EXPECT_EQ(-1, info.compositionStart);
+ EXPECT_EQ(-1, info.compositionEnd);
+
+ WebVector<WebCompositionUnderline> emptyUnderlines;
+
+ webView->setComposition(WebString::fromUTF8("123"), emptyUnderlines, -3, -3);
+ info = webView->textInputInfo();
+ EXPECT_EQ("abc123", std::string(info.value.utf8().data()));
+ EXPECT_EQ(0, info.selectionStart);
+ EXPECT_EQ(0, info.selectionEnd);
+ EXPECT_EQ(3, info.compositionStart);
+ EXPECT_EQ(6, info.compositionEnd);
+
+ // Confirms composing text and moves the caret.
+ webView->confirmComposition("", -3);
+ info = webView->textInputInfo();
+ EXPECT_EQ("abc123", std::string(info.value.utf8().data()));
+ EXPECT_EQ(3, info.selectionStart);
+ EXPECT_EQ(3, info.selectionEnd);
+ EXPECT_EQ(-1, info.compositionStart);
+ EXPECT_EQ(-1, info.compositionEnd);
+
+ webView->setComposition(WebString::fromUTF8("ABC"), emptyUnderlines, -3, -3);
+ info = webView->textInputInfo();
+ EXPECT_EQ("abcABC123", std::string(info.value.utf8().data()));
+ EXPECT_EQ(0, info.selectionStart);
+ EXPECT_EQ(0, info.selectionEnd);
+ EXPECT_EQ(3, info.compositionStart);
+ EXPECT_EQ(6, info.compositionEnd);
+
+ // Replaces composing text with new text and moves the caret.
+ webView->confirmComposition("456", 3);
+ info = webView->textInputInfo();
+ EXPECT_EQ("abc456123", std::string(info.value.utf8().data()));
+ EXPECT_EQ(9, info.selectionStart);
+ EXPECT_EQ(9, info.selectionEnd);
+ EXPECT_EQ(-1, info.compositionStart);
+ EXPECT_EQ(-1, info.compositionEnd);
+
+ // Inserts non-empty text and moves the caret.
+ webView->confirmComposition("789", -9);
+ info = webView->textInputInfo();
+ EXPECT_EQ("abc456123789", std::string(info.value.utf8().data()));
+ EXPECT_EQ(3, info.selectionStart);
+ EXPECT_EQ(3, info.selectionEnd);
+ EXPECT_EQ(-1, info.compositionStart);
+ EXPECT_EQ(-1, info.compositionEnd);
+
+ // Inserts empty text and moves the caret.
+ webView->confirmComposition("", 3);
+ info = webView->textInputInfo();
+ EXPECT_EQ("abc456123789", std::string(info.value.utf8().data()));
+ EXPECT_EQ(6, info.selectionStart);
+ EXPECT_EQ(6, info.selectionEnd);
+ EXPECT_EQ(-1, info.compositionStart);
+ EXPECT_EQ(-1, info.compositionEnd);
+
+ // Inserts empty text and doesn't move the caret.
+ webView->confirmComposition("", 0);
+ info = webView->textInputInfo();
+ EXPECT_EQ("abc456123789", std::string(info.value.utf8().data()));
+ EXPECT_EQ(6, info.selectionStart);
+ EXPECT_EQ(6, info.selectionEnd);
+ EXPECT_EQ(-1, info.compositionStart);
+ EXPECT_EQ(-1, info.compositionEnd);
+
+ webView->setComposition(WebString::fromUTF8("ABC"), emptyUnderlines, 0, 0);
+ info = webView->textInputInfo();
+ EXPECT_EQ("abc456ABC123789", std::string(info.value.utf8().data()));
+ EXPECT_EQ(6, info.selectionStart);
+ EXPECT_EQ(6, info.selectionEnd);
+ EXPECT_EQ(6, info.compositionStart);
+ EXPECT_EQ(9, info.compositionEnd);
+
yabinh 2016/08/31 11:23:27 We are able to move caret with composing text.
yabinh 2016/08/31 11:26:21 Typo. Should be "within composing text".
aelias_OOO_until_Jul13 2016/09/01 05:21:58 OK, I think we don't need to worry about that, tke
+ // Confirms composing text and moves the caret within the composing text.
+ webView->confirmComposition("", -1);
+ info = webView->textInputInfo();
+ EXPECT_EQ("abc456ABC123789", std::string(info.value.utf8().data()));
+ EXPECT_EQ(8, info.selectionStart);
+ EXPECT_EQ(8, info.selectionEnd);
+ EXPECT_EQ(-1, info.compositionStart);
+ EXPECT_EQ(-1, info.compositionEnd);
+}
+
TEST_F(WebViewTest, FinishCompositionDoesNotRevealSelection)
{
URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("form_with_input.html"));
@@ -919,7 +1200,7 @@ TEST_F(WebViewTest, InsertNewLinePlacementAfterConfirmComposition)
EXPECT_EQ(-1, info.compositionEnd);
std::string compositionText("\n");
- webView->confirmComposition(WebString::fromUTF8(compositionText.c_str()));
+ webView->confirmComposition(WebString::fromUTF8(compositionText.c_str()), 0);
info = webView->textInputInfo();
EXPECT_EQ(5, info.selectionStart);
EXPECT_EQ(5, info.selectionEnd);
@@ -979,7 +1260,7 @@ TEST_F(WebViewTest, SetCompositionFromExistingTextInTextArea)
WebLocalFrameImpl* frame = webView->mainFrameImpl();
frame->setEditableSelectionOffsets(27, 27);
std::string newLineText("\n");
- webView->confirmComposition(WebString::fromUTF8(newLineText.c_str()));
+ webView->confirmComposition(WebString::fromUTF8(newLineText.c_str()), 0);
WebTextInputInfo info = webView->textInputInfo();
EXPECT_EQ("0123456789abcdefghijklmnopq\nrstuvwxyz", std::string(info.value.utf8().data()));
@@ -993,7 +1274,7 @@ TEST_F(WebViewTest, SetCompositionFromExistingTextInTextArea)
EXPECT_EQ(34, info.compositionEnd);
std::string compositionText("yolo");
- webView->confirmComposition(WebString::fromUTF8(compositionText.c_str()));
+ webView->confirmComposition(WebString::fromUTF8(compositionText.c_str()), 0);
info = webView->textInputInfo();
EXPECT_EQ("0123456789abcdefghijklmnopq\nrsyoloxyz", std::string(info.value.utf8().data()));
EXPECT_EQ(34, info.selectionStart);
@@ -1027,7 +1308,7 @@ TEST_F(WebViewTest, SetEditableSelectionOffsetsKeepsComposition)
std::string compositionTextSecond("world");
WebVector<WebCompositionUnderline> emptyUnderlines;
- webView->confirmComposition(WebString::fromUTF8(compositionTextFirst.c_str()));
+ webView->confirmComposition(WebString::fromUTF8(compositionTextFirst.c_str()), 0);
webView->setComposition(WebString::fromUTF8(compositionTextSecond.c_str()), emptyUnderlines, 5, 5);
WebTextInputInfo info = webView->textInputInfo();
@@ -3271,7 +3552,7 @@ TEST_F(WebViewTest, PasswordFieldEditingIsUserGesture)
frame->setAutofillClient(&client);
webView->setInitialFocus(false);
- EXPECT_TRUE(webView->confirmComposition(WebString::fromUTF8(std::string("hello").c_str())));
+ EXPECT_TRUE(webView->confirmComposition(WebString::fromUTF8(std::string("hello").c_str()), 0));
EXPECT_EQ(1, client.textChangesFromUserGesture());
EXPECT_FALSE(UserGestureIndicator::processingUserGesture());
frame->setAutofillClient(0);

Powered by Google App Engine
This is Rietveld 408576698