summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@qt.io>2017-04-10 13:47:20 +0200
committerJoerg Bornemann <joerg.bornemann@qt.io>2017-04-25 18:18:30 +0000
commit3902b27ee40400db6cf596ca0db31b6497f0421b (patch)
tree774bb6e244482dd308b7488e91cfdba4a3eee665 /tests/auto/widgets
parent3e7aab785a22e0bdf96d22e2ed03689c37554baa (diff)
Override shortcuts in HTML input fields
When users defined a single-letter short cut it was not possible to type this letter in HTML input fields. Fix this by accepting ShortcutOverride events whenever the web page is editing text. Use QInputControl::isCommonTextEditShortcut for Qt 5.9 and later. For the case where QtWebEngine is built against an older Qt a duplicated code path is used. Also, ensure users do not override web action short cuts. Task-number: QTBUG-59053 Change-Id: Ic26cf2a040a72b118273c6645c00b2913b995b0b Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'tests/auto/widgets')
-rw-r--r--tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp58
1 files changed, 58 insertions, 0 deletions
diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
index 78190622c..ce88ace16 100644
--- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
+++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
@@ -42,6 +42,7 @@
#include <QTcpServer>
#include <QTcpSocket>
#include <QStyle>
+#include <QtWidgets/qaction.h>
#define VERIFY_INPUTMETHOD_HINTS(actual, expect) \
QVERIFY(actual == expect);
@@ -95,6 +96,7 @@ private Q_SLOTS:
void keyboardEvents();
void keyboardFocusAfterPopup();
void postData();
+ void inputFieldOverridesShortcuts();
void softwareInputPanel();
void inputMethods();
@@ -1302,6 +1304,62 @@ void tst_QWebEngineView::postData()
server.close();
}
+void tst_QWebEngineView::inputFieldOverridesShortcuts()
+{
+ bool actionTriggered = false;
+ QAction *action = new QAction;
+ action->setShortcut(Qt::Key_X);
+ connect(action, &QAction::triggered, [&actionTriggered] () { actionTriggered = true; });
+
+ QWebEngineView view;
+ view.addAction(action);
+
+ QSignalSpy loadFinishedSpy(&view, SIGNAL(loadFinished(bool)));
+ view.setHtml(QString("<html><body onload=\"input1=document.getElementById('input1')\">"
+ "<input id=\"dummy\" type=\"text\">"
+ "<input id=\"input1\" type=\"text\" value=\"x\">"
+ "</body></html>"));
+ QVERIFY(loadFinishedSpy.wait());
+
+ view.show();
+ QTest::qWaitForWindowActive(&view);
+
+ auto inputFieldValue = [&view] () -> QString {
+ return evaluateJavaScriptSync(view.page(),
+ "input1.value").toString();
+ };
+
+ // The input form is not focused. The action is triggered on pressing X.
+ QTest::keyClick(view.windowHandle(), Qt::Key_X);
+ QTRY_VERIFY(actionTriggered);
+ QCOMPARE(inputFieldValue(), QString("x"));
+
+ // The input form is focused. The action is not triggered, and the form's text changed.
+ evaluateJavaScriptSync(view.page(), "input1.focus();");
+ actionTriggered = false;
+ QTest::keyClick(view.windowHandle(), Qt::Key_Y);
+ QTRY_COMPARE(inputFieldValue(), QString("yx"));
+ QVERIFY(!actionTriggered);
+
+ // The input form is focused. Make sure we don't override all short cuts.
+ // A Ctrl-1 action is no default Qt key binding and should be triggerable.
+ action->setShortcut(Qt::CTRL + Qt::Key_1);
+ QTest::keyClick(view.windowHandle(), Qt::Key_1, Qt::ControlModifier);
+ QTRY_VERIFY(actionTriggered);
+ QCOMPARE(inputFieldValue(), QString("yx"));
+
+ // Remove focus from the input field. A QKeySequence::Copy action still must not be triggered.
+ evaluateJavaScriptSync(view.page(), "input1.blur();");
+ action->setShortcut(QKeySequence::Copy);
+ actionTriggered = false;
+ QTest::keyClick(view.windowHandle(), Qt::Key_C, Qt::ControlModifier);
+ // Add some text in the input field to ensure that the key event went through.
+ evaluateJavaScriptSync(view.page(), "input1.focus();");
+ QTest::keyClick(view.windowHandle(), Qt::Key_U);
+ QTRY_COMPARE(inputFieldValue(), QString("yux"));
+ QVERIFY(!actionTriggered);
+}
+
class TestInputContext : public QPlatformInputContext
{
public: