| Index: Source/web/tests/WebViewTest.cpp
|
| diff --git a/Source/web/tests/WebViewTest.cpp b/Source/web/tests/WebViewTest.cpp
|
| index c70283c5ae59f16a0926d1388b1063fc65b5294c..ae1c43a0d980f2c9d2ea1fc826fa1d70814b42db 100644
|
| --- a/Source/web/tests/WebViewTest.cpp
|
| +++ b/Source/web/tests/WebViewTest.cpp
|
| @@ -1282,6 +1282,20 @@ TEST_F(WebViewTest, ClientTapHandling)
|
| m_webViewHelper.reset(); // Explicitly reset to break dependency on locally scoped client.
|
| }
|
|
|
| +static void simulateKeyPress(WebView* webView, int windowsKeyCode)
|
| +{
|
| + WebKeyboardEvent keyEvent;
|
| + if (windowsKeyCode != VK_UNKNOWN) {
|
| + keyEvent.windowsKeyCode = windowsKeyCode;
|
| + keyEvent.setKeyIdentifierFromWindowsKeyCode();
|
| + }
|
| + keyEvent.type = WebInputEvent::RawKeyDown;
|
| + webView->handleInputEvent(keyEvent);
|
| +
|
| + keyEvent.type = WebInputEvent::KeyUp;
|
| + webView->handleInputEvent(keyEvent);
|
| +}
|
| +
|
| #if OS(ANDROID)
|
| TEST_F(WebViewTest, LongPressSelection)
|
| {
|
| @@ -1317,11 +1331,7 @@ TEST_F(WebViewTest, BlinkCaretOnTypingAfterLongPress)
|
| EXPECT_TRUE(tapElementById(webView, WebInputEvent::GestureLongPress, target));
|
| EXPECT_TRUE(mainFrame->frame()->selection().isCaretBlinkingSuspended());
|
|
|
| - WebKeyboardEvent keyEvent;
|
| - keyEvent.type = WebInputEvent::RawKeyDown;
|
| - webView->handleInputEvent(keyEvent);
|
| - keyEvent.type = WebInputEvent::KeyUp;
|
| - webView->handleInputEvent(keyEvent);
|
| + simulateKeyPress(webView, VK_UNKNOWN);
|
| EXPECT_FALSE(mainFrame->frame()->selection().isCaretBlinkingSuspended());
|
| }
|
| #endif
|
| @@ -1412,6 +1422,18 @@ private:
|
| };
|
|
|
|
|
| +static void verifySelectionAndComposition(WebView* webView, const char* value, int selectionStart, int selectionEnd, int compositionStart, int compositionEnd, const char* failMessage)
|
| +{
|
| + WebTextInputInfo info = webView->textInputInfo();
|
| + if (value) {
|
| + EXPECT_EQ(std::string(value), std::string(info.value.utf8().data())) << failMessage;
|
| + }
|
| + EXPECT_EQ(selectionStart, info.selectionStart) << failMessage;
|
| + EXPECT_EQ(selectionEnd, info.selectionEnd) << failMessage;
|
| + EXPECT_EQ(compositionStart, info.compositionStart) << failMessage;
|
| + EXPECT_EQ(compositionEnd, info.compositionEnd) << failMessage;
|
| +}
|
| +
|
| TEST_F(WebViewTest, LosingFocusDoesNotTriggerAutofillTextChange)
|
| {
|
| URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("input_field_populated.html"));
|
| @@ -1425,11 +1447,7 @@ TEST_F(WebViewTest, LosingFocusDoesNotTriggerAutofillTextChange)
|
| WebVector<WebCompositionUnderline> emptyUnderlines;
|
| frame->setEditableSelectionOffsets(4, 10);
|
| frame->setCompositionFromExistingText(8, 12, emptyUnderlines);
|
| - WebTextInputInfo info = webView->textInputInfo();
|
| - EXPECT_EQ(4, info.selectionStart);
|
| - EXPECT_EQ(10, info.selectionEnd);
|
| - EXPECT_EQ(8, info.compositionStart);
|
| - EXPECT_EQ(12, info.compositionEnd);
|
| + verifySelectionAndComposition(webView, nullptr, 4, 10, 8, 12, "base case");
|
|
|
| // Clear the focus and track that the subsequent composition commit does not trigger a
|
| // text changed notification for autofill.
|
| @@ -1441,6 +1459,35 @@ TEST_F(WebViewTest, LosingFocusDoesNotTriggerAutofillTextChange)
|
| frame->setAutofillClient(0);
|
| }
|
|
|
| +TEST_F(WebViewTest, CompositionChangeWithKeyEvents)
|
| +{
|
| + URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("composition_with_key_events.html"));
|
| + MockAutofillClient client;
|
| + WebView* webView = m_webViewHelper.initializeAndLoad(m_baseURL + "composition_with_key_events.html");
|
| + WebLocalFrameImpl* frame = toWebLocalFrameImpl(webView->mainFrame());
|
| + frame->setAutofillClient(&client);
|
| + webView->setInitialFocus(false);
|
| +
|
| + // Test both input elements.
|
| + for (int i = 0; i < 2; ++i) {
|
| + // Select composition and do sanity check.
|
| + WebVector<WebCompositionUnderline> emptyUnderlines;
|
| + frame->setEditableSelectionOffsets(2, 15);
|
| + frame->setCompositionFromExistingText(6, 11, emptyUnderlines);
|
| + verifySelectionAndComposition(webView, nullptr, 2, 15, 6, 11, "initial case");
|
| +
|
| + // Press 'A' and verify that the composition grew.
|
| + simulateKeyPress(webView, VKEY_A);
|
| + verifySelectionAndComposition(webView, nullptr, 2, 16, 6, 12, "after pressing 'A'");
|
| +
|
| + // Press Backspace and verify that the composition shrunk (and is not cancelled).
|
| + simulateKeyPress(webView, VKEY_BACK);
|
| + verifySelectionAndComposition(webView, nullptr, 2, 15, 6, 11, "after pressing Backspace");
|
| +
|
| + webView->advanceFocus(false);
|
| + }
|
| +}
|
| +
|
| TEST_F(WebViewTest, ConfirmCompositionTriggersAutofillTextChange)
|
| {
|
| URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("input_field_populated.html"));
|
| @@ -1602,15 +1649,7 @@ TEST_F(WebViewTest, DispatchesDomFocusOutDomFocusInOnViewToggleFocus)
|
| static void openDateTimeChooser(WebView* webView, HTMLInputElement* inputElement)
|
| {
|
| inputElement->focus();
|
| -
|
| - WebKeyboardEvent keyEvent;
|
| - keyEvent.windowsKeyCode = VKEY_SPACE;
|
| - keyEvent.type = WebInputEvent::RawKeyDown;
|
| - keyEvent.setKeyIdentifierFromWindowsKeyCode();
|
| - webView->handleInputEvent(keyEvent);
|
| -
|
| - keyEvent.type = WebInputEvent::KeyUp;
|
| - webView->handleInputEvent(keyEvent);
|
| + simulateKeyPress(webView, VKEY_SPACE);
|
| }
|
|
|
| TEST_F(WebViewTest, ChooseValueFromDateTimeChooser)
|
| @@ -2200,13 +2239,7 @@ TEST_F(WebViewTest, FirstUserGestureObservedKeyEvent)
|
|
|
| EXPECT_EQ(0, client.getUserGestureNotificationsCount());
|
|
|
| - WebKeyboardEvent keyEvent;
|
| - keyEvent.windowsKeyCode = VKEY_SPACE;
|
| - keyEvent.type = WebInputEvent::RawKeyDown;
|
| - keyEvent.setKeyIdentifierFromWindowsKeyCode();
|
| - webView->handleInputEvent(keyEvent);
|
| - keyEvent.type = WebInputEvent::KeyUp;
|
| - webView->handleInputEvent(keyEvent);
|
| + simulateKeyPress(webView, VKEY_SPACE);
|
|
|
| EXPECT_EQ(1, client.getUserGestureNotificationsCount());
|
| frame->setAutofillClient(0);
|
|
|