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.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
index 3893397cd..83f65f9d0 100644
--- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
+++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
@@ -50,6 +50,7 @@ private Q_SLOTS:
void reusePage();
void microFocusCoordinates();
void focusInputTypes();
+ void unhandledKeyEventPropagation();
void horizontalScrollbarTest();
void crashTests();
@@ -321,6 +322,49 @@ void tst_QWebEngineView::focusInputTypes()
#endif
}
+class KeyEventRecordingWidget : public QWidget {
+public:
+ QList<QKeyEvent> pressEvents;
+ QList<QKeyEvent> releaseEvents;
+ void keyPressEvent(QKeyEvent *e) Q_DECL_OVERRIDE { pressEvents << *e; }
+ void keyReleaseEvent(QKeyEvent *e) Q_DECL_OVERRIDE { releaseEvents << *e; }
+};
+
+void tst_QWebEngineView::unhandledKeyEventPropagation()
+{
+ KeyEventRecordingWidget parentWidget;
+ QWebEngineView webView(&parentWidget);
+ parentWidget.show();
+ QTest::qWaitForWindowExposed(&webView);
+
+ QSignalSpy loadSpy(&webView, SIGNAL(loadFinished(bool)));
+ webView.setHtml("<input type='text'/>");
+ QTRY_COMPARE(loadSpy.count(), 1);
+
+ evaluateJavaScriptSync(webView.page(), "document.body.firstChild.focus()");
+
+ QTest::sendKeyEvent(QTest::Press, parentWidget.windowHandle(), Qt::Key_A, 'a', Qt::NoModifier);
+ QTest::sendKeyEvent(QTest::Release, parentWidget.windowHandle(), Qt::Key_A, 'a', Qt::NoModifier);
+ QTest::sendKeyEvent(QTest::Press, parentWidget.windowHandle(), Qt::Key_Left, QString(), Qt::NoModifier);
+ QTest::sendKeyEvent(QTest::Release, parentWidget.windowHandle(), Qt::Key_Left, QString(), Qt::NoModifier);
+ QTest::sendKeyEvent(QTest::Press, parentWidget.windowHandle(), Qt::Key_Left, QString(), Qt::NoModifier);
+ QTest::sendKeyEvent(QTest::Release, parentWidget.windowHandle(), Qt::Key_Left, QString(), Qt::NoModifier);
+
+ // All this happens asychronously, wait for the last release event to know when we're done.
+ for (int i = 0; i < 20 && parentWidget.releaseEvents.size() < 3; ++i)
+ QTest::qWait(100);
+
+ // The page will consume the 'a' and the first left key presses, the second left won't be
+ // used since the cursor will already be at the left end of the text input.
+ // Key releases will all come back unconsumed.
+ QCOMPARE(parentWidget.pressEvents.size(), 1);
+ QCOMPARE(parentWidget.pressEvents[0].key(), (int)Qt::Key_Left);
+ QCOMPARE(parentWidget.releaseEvents.size(), 3);
+ QCOMPARE(parentWidget.releaseEvents[0].key(), (int)Qt::Key_A);
+ QCOMPARE(parentWidget.releaseEvents[1].key(), (int)Qt::Key_Left);
+ QCOMPARE(parentWidget.releaseEvents[2].key(), (int)Qt::Key_Left);
+}
+
void tst_QWebEngineView::horizontalScrollbarTest()
{
#if !defined(QWEBENGINEPAGE_SCROLL)