Chromium Code Reviews| 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); |