From 3902b27ee40400db6cf596ca0db31b6497f0421b Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Mon, 10 Apr 2017 13:47:20 +0200 Subject: 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 Reviewed-by: Alexandru Croitor --- .../widgets/qwebengineview/tst_qwebengineview.cpp | 58 ++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'tests') 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 #include #include +#include #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("" + "" + "" + "")); + 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: -- cgit v1.2.3