summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/quick/qmltests/data/tst_unhandledKeyEventPropagation.qml95
-rw-r--r--tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp44
2 files changed, 139 insertions, 0 deletions
diff --git a/tests/auto/quick/qmltests/data/tst_unhandledKeyEventPropagation.qml b/tests/auto/quick/qmltests/data/tst_unhandledKeyEventPropagation.qml
new file mode 100644
index 000000000..8d5fd5375
--- /dev/null
+++ b/tests/auto/quick/qmltests/data/tst_unhandledKeyEventPropagation.qml
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtTest 1.0
+import QtWebEngine 1.0
+
+Item {
+ id: parentItem
+ width: 400
+ height: 300
+
+ property var pressEvents: []
+ property var releaseEvents: []
+ Keys.onPressed: pressEvents.push(event.key)
+ Keys.onReleased: releaseEvents.push(event.key)
+
+ TestWebEngineView {
+ id: webEngineView
+ anchors.fill: parent
+ focus: true
+ }
+ TestCase {
+ name: "WebEngineViewUnhandledKeyEventPropagation"
+
+ when: false
+ Timer {
+ running: parent.windowShown
+ repeat: false
+ interval: 1
+ onTriggered: parent.when = true
+ }
+
+ function test_keyboardModifierMapping() {
+ webEngineView.loadHtml("<input type='text'/>")
+ webEngineView.waitForLoadSucceeded()
+ webEngineView.runJavaScript("document.body.firstChild.focus()")
+
+ keyPress(Qt.Key_A)
+ keyRelease(Qt.Key_A)
+ keyPress(Qt.Key_Left)
+ keyRelease(Qt.Key_Left)
+ keyPress(Qt.Key_Left)
+ keyRelease(Qt.Key_Left)
+
+ for (var i = 0; i < 20 && parentItem.releaseEvents.length < 3; i++)
+ wait(100)
+
+ compare(parentItem.pressEvents.length, 1)
+ compare(parentItem.pressEvents[0], Qt.Key_Left)
+ compare(parentItem.releaseEvents.length, 3)
+ compare(parentItem.releaseEvents[0], Qt.Key_A)
+ compare(parentItem.releaseEvents[1], Qt.Key_Left)
+ compare(parentItem.releaseEvents[2], Qt.Key_Left)
+ }
+ }
+}
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)