diff options
author | Joerg Bornemann <joerg.bornemann@qt.io> | 2017-04-10 13:47:20 +0200 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@qt.io> | 2017-04-25 18:18:30 +0000 |
commit | 3902b27ee40400db6cf596ca0db31b6497f0421b (patch) | |
tree | 774bb6e244482dd308b7488e91cfdba4a3eee665 /tests | |
parent | 3e7aab785a22e0bdf96d22e2ed03689c37554baa (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')
-rw-r--r-- | tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp | 58 |
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: |