diff options
author | Jocelyn Turcotte <jocelyn.turcotte@digia.com> | 2015-01-29 12:06:28 +0100 |
---|---|---|
committer | Andras Becsi <andras.becsi@theqtcompany.com> | 2015-02-05 13:10:41 +0000 |
commit | faec509a21b4700dbf271c4dcbb3a993f1c4042f (patch) | |
tree | dd16a33ab7070ab52e34843f666f1e6c87fdc5bf /tests/auto/widgets/qwebengineview | |
parent | 0622e02b9da5b93c6824367732970af0214601fb (diff) |
Propagate unhandled key events to the QtWebEngine view's parent
This allows applications to receive unhandled key events from the page
by setting an event handler on the view's parent widget/item, like
it was possible with QtWebKit.
This is different in that events first have to asynchronously go
through the QtWebEngineProcess. If the WebEngine view has the
keyboard focus, the events will be consumed inconditionally by the
RenderWidgetHostViewQtDelegates, and a copy will be resent to the
view's parent if it wasn't consumed.
This sends it to the parent instead of the QWebEngineView directly
since those are only unhandled events, unlike with other widgets
where you can first intercept events. It is done that way also in
cases where the QWebEngineView would be be the focus widget directly
in the future, instead of the RWHV.
If applications want to intercept key events before they reach the
page, they need to use an event filter on the QWebEngineView's
children or globally on the application.
Change-Id: I3b48f5212d3f238a1c0497cec1db6ae3badbad26
Reviewed-by: Andras Becsi <andras.becsi@theqtcompany.com>
Diffstat (limited to 'tests/auto/widgets/qwebengineview')
-rw-r--r-- | tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp | 44 |
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) |