summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@theqtcompany.com>2016-05-31 11:40:56 +0000
committerThe Qt Project <gerrit-noreply@qt-project.org>2016-05-31 13:10:16 +0000
commitb987250dc87bc64c735e9936e8cf847cde341f40 (patch)
tree66d0d6dc8d918336eac93565cc2de3643062c3af /tests
parent3af17048cbd64fff17eedc340571e7555ea9790a (diff)
parentd2d5d24f86f12a2d1b0a6bc46c0d48306d7d2130 (diff)
Merge "Merge remote-tracking branch 'origin/5.6' into 5.7" into refs/staging/5.7
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/quick/qquickwebengineview/qquickwebengineview.pro2
-rw-r--r--tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp138
-rw-r--r--tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp45
-rw-r--r--tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp152
4 files changed, 291 insertions, 46 deletions
diff --git a/tests/auto/quick/qquickwebengineview/qquickwebengineview.pro b/tests/auto/quick/qquickwebengineview/qquickwebengineview.pro
index 826b47de7..36e74a2a8 100644
--- a/tests/auto/quick/qquickwebengineview/qquickwebengineview.pro
+++ b/tests/auto/quick/qquickwebengineview/qquickwebengineview.pro
@@ -1,6 +1,6 @@
include(../tests.pri)
exists($${TARGET}.qrc):RESOURCES += $${TARGET}.qrc
-QT_PRIVATE += webengine-private
+QT_PRIVATE += webengine-private gui-private
HEADERS += ../shared/util.h
diff --git a/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp b/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp
index 0def76d6f..1c5461fa7 100644
--- a/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp
+++ b/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp
@@ -31,6 +31,7 @@
#include <QScopedPointer>
#include <QtCore/qelapsedtimer.h>
+#include <QtGui/qpa/qwindowsysteminterface.h>
#include <QtQml/QQmlEngine>
#include <QtTest/QtTest>
#include <private/qquickwebengineview_p.h>
@@ -71,6 +72,9 @@ private Q_SLOTS:
void basicRenderingSanity();
void setZoomFactor();
void printToPdf();
+ void stopSettingFocusWhenDisabled();
+ void stopSettingFocusWhenDisabled_data();
+ void inputEventForwardingDisabledWhenActiveFocusOnPressDisabled();
private:
inline QQuickWebEngineView *newWebEngineView();
@@ -514,5 +518,139 @@ void tst_QQuickWebEngineView::printToPdf()
QVERIFY(!QFile::exists(path));
}
+void tst_QQuickWebEngineView::stopSettingFocusWhenDisabled()
+{
+ QFETCH(bool, viewEnabled);
+ QFETCH(bool, activeFocusResult);
+
+ QQuickWebEngineView *view = webEngineView();
+ m_window->show();
+ view->setSize(QSizeF(640, 480));
+ view->setEnabled(viewEnabled);
+ view->loadHtml("<html><head><title>Title</title></head><body>Hello"
+ "<input id=\"input\" type=\"text\"></body></html>");
+ QVERIFY(waitForLoadSucceeded(view));
+
+ // When enabled, the view should get active focus after the page is loaded.
+ QTRY_COMPARE_WITH_TIMEOUT(view->hasActiveFocus(), activeFocusResult, 1000);
+ view->runJavaScript("document.getElementById(\"input\").focus()");
+ QTRY_COMPARE_WITH_TIMEOUT(view->hasActiveFocus(), activeFocusResult, 1000);
+}
+
+void tst_QQuickWebEngineView::stopSettingFocusWhenDisabled_data()
+{
+ QTest::addColumn<bool>("viewEnabled");
+ QTest::addColumn<bool>("activeFocusResult");
+
+ QTest::newRow("enabled view gets active focus") << true << true;
+ QTest::newRow("disabled view does not get active focus") << false << false;
+}
+
+class MouseTouchEventRecordingItem : public QQuickItem {
+public:
+ explicit MouseTouchEventRecordingItem(QQuickItem *parent = 0) :
+ QQuickItem(parent), m_eventCounter(0) {
+ setFlag(ItemHasContents);
+ setAcceptedMouseButtons(Qt::AllButtons);
+ setAcceptHoverEvents(true);
+ }
+
+ bool event(QEvent *event) Q_DECL_OVERRIDE
+ {
+ switch (event->type()) {
+ case QEvent::TabletPress:
+ case QEvent::TabletRelease:
+ case QEvent::TabletMove:
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseButtonRelease:
+ case QEvent::MouseButtonDblClick:
+ case QEvent::MouseMove:
+ case QEvent::TouchBegin:
+ case QEvent::TouchUpdate:
+ case QEvent::TouchEnd:
+ case QEvent::TouchCancel:
+ case QEvent::HoverEnter:
+ case QEvent::HoverMove:
+ case QEvent::HoverLeave:
+ ++m_eventCounter;
+ event->accept();
+ return true;
+ default:
+ break;
+ }
+ return QQuickItem::event(event);
+ }
+
+ void clearEventCount()
+ {
+ m_eventCounter = 0;
+ }
+
+ int eventCount()
+ {
+ return m_eventCounter;
+ }
+
+private:
+ int m_eventCounter;
+};
+
+void tst_QQuickWebEngineView::inputEventForwardingDisabledWhenActiveFocusOnPressDisabled()
+{
+ QQuickWebEngineView *view = webEngineView();
+ MouseTouchEventRecordingItem item;
+ item.setParentItem(m_window->contentItem());
+ item.setSize(QSizeF(640, 480));
+ view->setParentItem(&item);
+ view->setSize(QSizeF(640, 480));
+ m_window->show();
+
+ // Simulate click and move of mouse, so that last known position in the application
+ // is updated, thus a mouse move event is not generated when we don't expect it.
+ QTest::mouseClick(view->window(), Qt::LeftButton);
+ item.clearEventCount();
+
+ // First disable view, so it does not receive focus on page load.
+ view->setEnabled(false);
+ view->setActiveFocusOnPress(false);
+ view->loadHtml("<html><head>"
+ "<script>"
+ "window.onload = function() { document.getElementById(\"input\").focus(); }"
+ "</script>"
+ "<title>Title</title></head><body>Hello"
+ "<input id=\"input\" type=\"text\"></body></html>");
+ QVERIFY(waitForLoadSucceeded(view));
+ QTRY_COMPARE_WITH_TIMEOUT(view->hasActiveFocus(), false, 1000);
+
+ // Enable the view back so we can try to interact with it.
+ view->setEnabled(true);
+
+ // Click on the view, to try and set focus.
+ QTest::mouseClick(view->window(), Qt::LeftButton);
+
+ // View should not have focus after click, because setActiveFocusOnPress is false.
+ QTRY_COMPARE_WITH_TIMEOUT(view->hasActiveFocus(), false, 1000);
+
+ // Now test sending various input events, to check that indeed all the input events are not
+ // forwarded to Chromium, but rather processed and accepted by the view's parent item.
+ QTest::mousePress(view->window(), Qt::LeftButton);
+ QTest::mouseRelease(view->window(), Qt::LeftButton);
+
+ QTouchDevice *device = new QTouchDevice;
+ device->setType(QTouchDevice::TouchScreen);
+ QWindowSystemInterface::registerTouchDevice(device);
+
+ QTest::touchEvent(view->window(), device).press(0, QPoint(0,0), view->window());
+ QTest::touchEvent(view->window(), device).move(0, QPoint(1, 1), view->window());
+ QTest::touchEvent(view->window(), device).release(0, QPoint(1, 1), view->window());
+
+ // We expect to catch 7 events - click = 2, press + release = 2, touches = 3.
+ QCOMPARE(item.eventCount(), 7);
+
+ // Manually forcing focus should still be possible.
+ view->forceActiveFocus();
+ QTRY_COMPARE_WITH_TIMEOUT(view->hasActiveFocus(), true, 1000);
+}
+
QTEST_MAIN(tst_QQuickWebEngineView)
#include "tst_qquickwebengineview.moc"
diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
index 622a77ef3..ff1c9e72e 100644
--- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
+++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
@@ -203,9 +203,6 @@ private Q_SLOTS:
void progressSignal();
void urlChange();
void requestedUrlAfterSetAndLoadFailures();
- void javaScriptWindowObjectCleared_data();
- void javaScriptWindowObjectCleared();
- void javaScriptWindowObjectClearedOnEvaluate();
void asyncAndDelete();
void earlyToHtml();
void setHtml();
@@ -3926,48 +3923,6 @@ void tst_QWebEnginePage::requestedUrlAfterSetAndLoadFailures()
QVERIFY(!spy.at(1).first().toBool());
}
-void tst_QWebEnginePage::javaScriptWindowObjectCleared_data()
-{
- QTest::addColumn<QString>("html");
- QTest::addColumn<int>("signalCount");
- QTest::newRow("with <script>") << "<html><body><script>i=0</script><p>hello world</p></body></html>" << 1;
- // NOTE: Empty scripts no longer cause this signal to be emitted.
- QTest::newRow("with empty <script>") << "<html><body><script></script><p>hello world</p></body></html>" << 0;
- QTest::newRow("without <script>") << "<html><body><p>hello world</p></body></html>" << 0;
-}
-
-void tst_QWebEnginePage::javaScriptWindowObjectCleared()
-{
-#if !defined(QWEBENGINEPAGE_JAVASCRIPTWINDOWOBJECTCLEARED)
- QSKIP("QWEBENGINEPAGE_JAVASCRIPTWINDOWOBJECTCLEARED");
-#else
- QWebEnginePage page;
- QSignalSpy spy(&page, SIGNAL(javaScriptWindowObjectCleared()));
- QFETCH(QString, html);
- page.setHtml(html);
-
- QFETCH(int, signalCount);
- QCOMPARE(spy.count(), signalCount);
-#endif
-}
-
-void tst_QWebEnginePage::javaScriptWindowObjectClearedOnEvaluate()
-{
-#if !defined(QWEBENGINEPAGE_EVALUATEJAVASCRIPT)
- QSKIP("QWEBENGINEPAGE_EVALUATEJAVASCRIPT");
-#else
- QWebEnginePage page;
- QSignalSpy spy(&page, SIGNAL(javaScriptWindowObjectCleared()));
- page.setHtml("<html></html>");
- QCOMPARE(spy.count(), 0);
- page.evaluateJavaScript("var a = 'a';");
- QCOMPARE(spy.count(), 1);
- // no new clear for a new script:
- page.evaluateJavaScript("var a = 1;");
- QCOMPARE(spy.count(), 1);
-#endif
-}
-
void tst_QWebEnginePage::asyncAndDelete()
{
QWebEnginePage *page = new QWebEnginePage;
diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
index 8aaf9ccc3..afb53ba20 100644
--- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
+++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
@@ -29,11 +29,20 @@
#include <qwebenginesettings.h>
#include <qnetworkrequest.h>
#include <qdiriterator.h>
+#include <qstackedlayout.h>
#include <qtemporarydir.h>
#define VERIFY_INPUTMETHOD_HINTS(actual, expect) \
QVERIFY(actual == expect);
+#define QTRY_COMPARE_WITH_TIMEOUT_FAIL_BLOCK(__expr, __expected, __timeout, __fail_block) \
+do { \
+ QTRY_IMPL(((__expr) == (__expected)), __timeout);\
+ if (__expr != __expected)\
+ __fail_block\
+ QCOMPARE((__expr), __expected); \
+} while (0)
+
class tst_QWebEngineView : public QObject
{
Q_OBJECT
@@ -61,6 +70,10 @@ private Q_SLOTS:
void setPalette_data();
void setPalette();
#endif
+ void doNotSendMouseKeyboardEventsWhenDisabled();
+ void doNotSendMouseKeyboardEventsWhenDisabled_data();
+ void stopSettingFocusWhenDisabled();
+ void stopSettingFocusWhenDisabled_data();
};
// This will be called before the first test function is executed.
@@ -591,5 +604,144 @@ void tst_QWebEngineView::renderingAfterMaxAndBack()
#endif
}
+class KeyboardAndMouseEventRecordingWidget : public QWidget {
+public:
+ explicit KeyboardAndMouseEventRecordingWidget(QWidget *parent = 0) :
+ QWidget(parent), m_eventCounter(0) {}
+
+ bool event(QEvent *event) Q_DECL_OVERRIDE
+ {
+ QString eventString;
+ switch (event->type()) {
+ case QEvent::TabletPress:
+ case QEvent::TabletRelease:
+ case QEvent::TabletMove:
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseButtonRelease:
+ case QEvent::MouseButtonDblClick:
+ case QEvent::MouseMove:
+ case QEvent::TouchBegin:
+ case QEvent::TouchUpdate:
+ case QEvent::TouchEnd:
+ case QEvent::TouchCancel:
+ case QEvent::ContextMenu:
+ case QEvent::KeyPress:
+ case QEvent::KeyRelease:
+#ifndef QT_NO_WHEELEVENT
+ case QEvent::Wheel:
+#endif
+ ++m_eventCounter;
+ event->setAccepted(true);
+ QDebug(&eventString) << event;
+ m_eventHistory.append(eventString);
+ return true;
+ default:
+ break;
+ }
+ return QWidget::event(event);
+ }
+
+ void clearEventCount()
+ {
+ m_eventCounter = 0;
+ }
+
+ int eventCount()
+ {
+ return m_eventCounter;
+ }
+
+ void printEventHistory()
+ {
+ qDebug() << "Received events are:";
+ for (int i = 0; i < m_eventHistory.size(); ++i) {
+ qDebug() << m_eventHistory[i];
+ }
+ }
+
+private:
+ int m_eventCounter;
+ QVector<QString> m_eventHistory;
+};
+
+void tst_QWebEngineView::doNotSendMouseKeyboardEventsWhenDisabled()
+{
+ QFETCH(bool, viewEnabled);
+ QFETCH(int, resultEventCount);
+
+ KeyboardAndMouseEventRecordingWidget parentWidget;
+ QWebEngineView webView(&parentWidget);
+ webView.setEnabled(viewEnabled);
+ parentWidget.setLayout(new QStackedLayout);
+ parentWidget.layout()->addWidget(&webView);
+ webView.resize(640, 480);
+ parentWidget.show();
+ QTest::qWaitForWindowExposed(&webView);
+
+ QSignalSpy loadSpy(&webView, SIGNAL(loadFinished(bool)));
+ webView.setHtml("<html><head><title>Title</title></head><body>Hello"
+ "<input id=\"input\" type=\"text\"></body></html>");
+ QTRY_COMPARE(loadSpy.count(), 1);
+
+ // When the webView is enabled, the events are swallowed by it, and the parent widget
+ // does not receive any events, otherwise all events are processed by the parent widget.
+ parentWidget.clearEventCount();
+ QTest::mousePress(parentWidget.windowHandle(), Qt::LeftButton);
+ QTest::mouseMove(parentWidget.windowHandle(), QPoint(100, 100));
+ QTest::mouseRelease(parentWidget.windowHandle(), Qt::LeftButton,
+ Qt::KeyboardModifiers(), QPoint(100, 100));
+
+ // Wait a bit for the mouse events to be processed, so they don't interfere with the js focus
+ // below.
+ QTest::qWait(100);
+ evaluateJavaScriptSync(webView.page(), "document.getElementById(\"input\").focus()");
+ QTest::keyPress(parentWidget.windowHandle(), Qt::Key_H);
+
+ // Wait a bit for the key press to be handled. We have to do it, because the compare
+ // below could immediately finish successfully, without alloing for the events to be handled.
+ QTest::qWait(100);
+ QTRY_COMPARE_WITH_TIMEOUT_FAIL_BLOCK(parentWidget.eventCount(), resultEventCount,
+ 1000, parentWidget.printEventHistory(););
+}
+
+void tst_QWebEngineView::doNotSendMouseKeyboardEventsWhenDisabled_data()
+{
+ QTest::addColumn<bool>("viewEnabled");
+ QTest::addColumn<int>("resultEventCount");
+
+ QTest::newRow("enabled view receives events") << true << 0;
+ QTest::newRow("disabled view does not receive events") << false << 4;
+}
+
+void tst_QWebEngineView::stopSettingFocusWhenDisabled()
+{
+ QFETCH(bool, viewEnabled);
+ QFETCH(bool, focusResult);
+
+ QWebEngineView webView;
+ webView.resize(640, 480);
+ webView.show();
+ webView.setEnabled(viewEnabled);
+ QTest::qWaitForWindowExposed(&webView);
+
+ QSignalSpy loadSpy(&webView, SIGNAL(loadFinished(bool)));
+ webView.setHtml("<html><head><title>Title</title></head><body>Hello"
+ "<input id=\"input\" type=\"text\"></body></html>");
+ QTRY_COMPARE(loadSpy.count(), 1);
+
+ QTRY_COMPARE_WITH_TIMEOUT(webView.hasFocus(), focusResult, 1000);
+ evaluateJavaScriptSync(webView.page(), "document.getElementById(\"input\").focus()");
+ QTRY_COMPARE_WITH_TIMEOUT(webView.hasFocus(), focusResult, 1000);
+}
+
+void tst_QWebEngineView::stopSettingFocusWhenDisabled_data()
+{
+ QTest::addColumn<bool>("viewEnabled");
+ QTest::addColumn<bool>("focusResult");
+
+ QTest::newRow("enabled view gets focus") << true << true;
+ QTest::newRow("disabled view does not get focus") << false << false;
+}
+
QTEST_MAIN(tst_QWebEngineView)
#include "tst_qwebengineview.moc"