summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp')
-rw-r--r--tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp189
1 files changed, 189 insertions, 0 deletions
diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
index a6487d19a..eb340b6f5 100644
--- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
+++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
@@ -167,6 +167,7 @@ private Q_SLOTS:
void inputFieldOverridesShortcuts();
void softwareInputPanel();
+ void inputContextQueryInput();
void inputMethods();
void textSelectionInInputField();
void textSelectionOutOfInputField();
@@ -1689,6 +1690,24 @@ void tst_QWebEngineView::inputFieldOverridesShortcuts()
QTRY_VERIFY(actionTriggered);
}
+struct InputMethodInfo
+{
+ InputMethodInfo(const int cursorPosition,
+ const int anchorPosition,
+ QString surroundingText,
+ QString selectedText)
+ : cursorPosition(cursorPosition)
+ , anchorPosition(anchorPosition)
+ , surroundingText(surroundingText)
+ , selectedText(selectedText)
+ {}
+
+ const int cursorPosition;
+ const int anchorPosition;
+ QString surroundingText;
+ QString selectedText;
+};
+
class TestInputContext : public QPlatformInputContext
{
public:
@@ -1718,7 +1737,27 @@ public:
return m_visible;
}
+ virtual void update(Qt::InputMethodQueries queries)
+ {
+ if (!qApp->focusObject())
+ return;
+
+ if (!(queries & Qt::ImQueryInput))
+ return;
+
+ QInputMethodQueryEvent imQueryEvent(Qt::ImQueryInput);
+ QApplication::sendEvent(qApp->focusObject(), &imQueryEvent);
+
+ const int cursorPosition = imQueryEvent.value(Qt::ImCursorPosition).toInt();
+ const int anchorPosition = imQueryEvent.value(Qt::ImAnchorPosition).toInt();
+ QString surroundingText = imQueryEvent.value(Qt::ImSurroundingText).toString();
+ QString selectedText = imQueryEvent.value(Qt::ImCurrentSelection).toString();
+
+ infos.append(InputMethodInfo(cursorPosition, anchorPosition, surroundingText, selectedText));
+ }
+
bool m_visible;
+ QList<InputMethodInfo> infos;
};
void tst_QWebEngineView::softwareInputPanel()
@@ -1779,6 +1818,156 @@ void tst_QWebEngineView::softwareInputPanel()
QVERIFY(!testContext.isInputPanelVisible());
}
+void tst_QWebEngineView::inputContextQueryInput()
+{
+ TestInputContext testContext;
+ QWebEngineView view;
+ view.resize(640, 480);
+ view.show();
+
+ QSignalSpy selectionChangedSpy(&view, SIGNAL(selectionChanged()));
+ QSignalSpy loadFinishedSpy(&view, SIGNAL(loadFinished(bool)));
+ view.setHtml("<html><body>"
+ " <input type='text' id='input1' value='' size='50'/>"
+ "</body></html>");
+ QTRY_COMPARE(loadFinishedSpy.count(), 1);
+ QCOMPARE(testContext.infos.count(), 0);
+
+ // Set focus on an input field.
+ QPoint textInputCenter = elementCenter(view.page(), "input1");
+ QTest::mouseClick(view.focusProxy(), Qt::LeftButton, 0, textInputCenter);
+ QTRY_COMPARE(testContext.infos.count(), 2);
+ QCOMPARE(evaluateJavaScriptSync(view.page(), "document.activeElement.id").toString(), QStringLiteral("input1"));
+ foreach (const InputMethodInfo &info, testContext.infos) {
+ QCOMPARE(info.cursorPosition, 0);
+ QCOMPARE(info.anchorPosition, 0);
+ QCOMPARE(info.surroundingText, QStringLiteral(""));
+ QCOMPARE(info.selectedText, QStringLiteral(""));
+ }
+ testContext.infos.clear();
+
+ // Change content of an input field from JavaScript.
+ evaluateJavaScriptSync(view.page(), "document.getElementById('input1').value='QtWebEngine';");
+ QTRY_COMPARE(testContext.infos.count(), 1);
+ QCOMPARE(testContext.infos[0].cursorPosition, 11);
+ QCOMPARE(testContext.infos[0].anchorPosition, 11);
+ QCOMPARE(testContext.infos[0].surroundingText, QStringLiteral("QtWebEngine"));
+ QCOMPARE(testContext.infos[0].selectedText, QStringLiteral(""));
+ testContext.infos.clear();
+
+ // Change content of an input field by key press.
+ QTest::keyClick(view.focusProxy(), Qt::Key_Exclam);
+ QTRY_COMPARE(testContext.infos.count(), 1);
+ QCOMPARE(testContext.infos[0].cursorPosition, 12);
+ QCOMPARE(testContext.infos[0].anchorPosition, 12);
+ QCOMPARE(testContext.infos[0].surroundingText, QStringLiteral("QtWebEngine!"));
+ QCOMPARE(testContext.infos[0].selectedText, QStringLiteral(""));
+ testContext.infos.clear();
+
+ // Change cursor position.
+ QTest::keyClick(view.focusProxy(), Qt::Key_Left);
+ QTRY_COMPARE(testContext.infos.count(), 1);
+ QCOMPARE(testContext.infos[0].cursorPosition, 11);
+ QCOMPARE(testContext.infos[0].anchorPosition, 11);
+ QCOMPARE(testContext.infos[0].surroundingText, QStringLiteral("QtWebEngine!"));
+ QCOMPARE(testContext.infos[0].selectedText, QStringLiteral(""));
+ testContext.infos.clear();
+
+ // Selection by IME.
+ {
+ QList<QInputMethodEvent::Attribute> attributes;
+ QInputMethodEvent::Attribute newSelection(QInputMethodEvent::Selection, 2, 12, QVariant());
+ attributes.append(newSelection);
+ QInputMethodEvent event("", attributes);
+ QApplication::sendEvent(view.focusProxy(), &event);
+ }
+ QTRY_COMPARE(testContext.infos.count(), 2);
+ QCOMPARE(selectionChangedSpy.count(), 1);
+
+ // As a first step, Chromium moves the cursor to the start of the selection.
+ // We don't filter this in QtWebEngine because we don't know yet if this is part of a selection.
+ QCOMPARE(testContext.infos[0].cursorPosition, 2);
+ QCOMPARE(testContext.infos[0].anchorPosition, 2);
+ QCOMPARE(testContext.infos[0].surroundingText, QStringLiteral("QtWebEngine!"));
+ QCOMPARE(testContext.infos[0].selectedText, QStringLiteral(""));
+
+ // The update of the selection.
+ QCOMPARE(testContext.infos[1].cursorPosition, 12);
+ QCOMPARE(testContext.infos[1].anchorPosition, 2);
+ QCOMPARE(testContext.infos[1].surroundingText, QStringLiteral("QtWebEngine!"));
+ QCOMPARE(testContext.infos[1].selectedText, QStringLiteral("WebEngine!"));
+ testContext.infos.clear();
+ selectionChangedSpy.clear();
+
+ // Clear selection by IME.
+ {
+ QList<QInputMethodEvent::Attribute> attributes;
+ QInputMethodEvent::Attribute newSelection(QInputMethodEvent::Selection, 0, 0, QVariant());
+ attributes.append(newSelection);
+ QInputMethodEvent event("", attributes);
+ QApplication::sendEvent(view.focusProxy(), &event);
+ }
+ QTRY_COMPARE(testContext.infos.count(), 1);
+ QCOMPARE(selectionChangedSpy.count(), 1);
+ QCOMPARE(testContext.infos[0].cursorPosition, 0);
+ QCOMPARE(testContext.infos[0].anchorPosition, 0);
+ QCOMPARE(testContext.infos[0].surroundingText, QStringLiteral("QtWebEngine!"));
+ QCOMPARE(testContext.infos[0].selectedText, QStringLiteral(""));
+ testContext.infos.clear();
+ selectionChangedSpy.clear();
+
+ // Compose text.
+ {
+ QList<QInputMethodEvent::Attribute> attributes;
+ QInputMethodEvent event("123", attributes);
+ QApplication::sendEvent(view.focusProxy(), &event);
+ }
+ QTRY_COMPARE(testContext.infos.count(), 1);
+ QCOMPARE(testContext.infos[0].cursorPosition, 3);
+ QCOMPARE(testContext.infos[0].anchorPosition, 3);
+ QCOMPARE(testContext.infos[0].surroundingText, QStringLiteral("QtWebEngine!"));
+ QCOMPARE(testContext.infos[0].selectedText, QStringLiteral(""));
+ QCOMPARE(evaluateJavaScriptSync(view.page(), "document.getElementById('input1').value").toString(), QStringLiteral("123QtWebEngine!"));
+ testContext.infos.clear();
+
+ // Cancel composition.
+ {
+ QList<QInputMethodEvent::Attribute> attributes;
+ QInputMethodEvent event("", attributes);
+ QApplication::sendEvent(view.focusProxy(), &event);
+ }
+ QTRY_COMPARE(testContext.infos.count(), 2);
+ foreach (const InputMethodInfo &info, testContext.infos) {
+ QCOMPARE(info.cursorPosition, 0);
+ QCOMPARE(info.anchorPosition, 0);
+ QCOMPARE(info.surroundingText, QStringLiteral("QtWebEngine!"));
+ QCOMPARE(info.selectedText, QStringLiteral(""));
+ }
+ QCOMPARE(evaluateJavaScriptSync(view.page(), "document.getElementById('input1').value").toString(), QStringLiteral("QtWebEngine!"));
+ testContext.infos.clear();
+
+ // Commit text.
+ {
+ QList<QInputMethodEvent::Attribute> attributes;
+ QInputMethodEvent event("", attributes);
+ event.setCommitString(QStringLiteral("123"), 0, 0);
+ QApplication::sendEvent(view.focusProxy(), &event);
+ }
+ QTRY_COMPARE(testContext.infos.count(), 1);
+ QCOMPARE(testContext.infos[0].cursorPosition, 3);
+ QCOMPARE(testContext.infos[0].anchorPosition, 3);
+ QCOMPARE(testContext.infos[0].surroundingText, QStringLiteral("123QtWebEngine!"));
+ QCOMPARE(testContext.infos[0].selectedText, QStringLiteral(""));
+ QCOMPARE(evaluateJavaScriptSync(view.page(), "document.getElementById('input1').value").toString(), QStringLiteral("123QtWebEngine!"));
+ testContext.infos.clear();
+
+ // Focus out.
+ QTest::keyPress(view.focusProxy(), Qt::Key_Tab);
+ QTRY_COMPARE(testContext.infos.count(), 1);
+ QTRY_COMPARE(evaluateJavaScriptSync(view.page(), "document.activeElement.id").toString(), QStringLiteral(""));
+ testContext.infos.clear();
+}
+
void tst_QWebEngineView::inputMethods()
{
QWebEngineView view;