summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets/qwebengineview
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/widgets/qwebengineview')
-rw-r--r--tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp173
1 files changed, 117 insertions, 56 deletions
diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
index b9a8b6a09..7bf1b5c42 100644
--- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
+++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
@@ -186,6 +186,9 @@ private Q_SLOTS:
void contextMenu();
void webUIURLs_data();
void webUIURLs();
+ void visibilityState();
+ void jsKeyboardEvent();
+ void deletePage();
};
// This will be called before the first test function is executed.
@@ -306,11 +309,13 @@ class WebViewCrashTest : public QObject {
QWebEngineView* m_view;
public:
bool m_invokedStop;
+ bool m_stopBypassed;
WebViewCrashTest(QWebEngineView* view)
: m_view(view)
, m_invokedStop(false)
+ , m_stopBypassed(false)
{
view->connect(view, SIGNAL(loadProgress(int)), this, SLOT(loading(int)));
}
@@ -323,6 +328,8 @@ private Q_SLOTS:
QVERIFY(!m_invokedStop);
m_view->stop();
m_invokedStop = true;
+ } else if (!m_invokedStop && progress == 100) {
+ m_stopBypassed = true;
}
}
};
@@ -340,7 +347,10 @@ void tst_QWebEngineView::crashTests()
// If the verification fails, it means that either stopping doesn't work, or the hardware is
// too slow to load the page and thus to slow to issue the first loadProgress > 0 signal.
- QTRY_VERIFY_WITH_TIMEOUT(tester.m_invokedStop, 10000);
+ QTRY_VERIFY_WITH_TIMEOUT(tester.m_invokedStop || tester.m_stopBypassed, 10000);
+ if (tester.m_stopBypassed)
+ QEXPECT_FAIL("", "Loading was too fast to stop", Continue);
+ QVERIFY(tester.m_invokedStop);
}
void tst_QWebEngineView::microFocusCoordinates()
@@ -1069,7 +1079,7 @@ void tst_QWebEngineView::changeLocale()
QWebEngineView viewDE;
QSignalSpy loadFinishedSpyDE(&viewDE, SIGNAL(loadFinished(bool)));
viewDE.load(url);
- QTRY_COMPARE_WITH_TIMEOUT(loadFinishedSpyDE.count(), 1, 12000);
+ QTRY_COMPARE_WITH_TIMEOUT(loadFinishedSpyDE.count(), 1, 20000);
QTRY_VERIFY(!toPlainTextSync(viewDE.page()).isEmpty());
errorLines = toPlainTextSync(viewDE.page()).split(QRegExp("[\r\n]"), QString::SkipEmptyParts);
@@ -1079,7 +1089,7 @@ void tst_QWebEngineView::changeLocale()
QWebEngineView viewEN;
QSignalSpy loadFinishedSpyEN(&viewEN, SIGNAL(loadFinished(bool)));
viewEN.load(url);
- QTRY_COMPARE_WITH_TIMEOUT(loadFinishedSpyEN.count(), 1, 12000);
+ QTRY_COMPARE_WITH_TIMEOUT(loadFinishedSpyEN.count(), 1, 20000);
QTRY_VERIFY(!toPlainTextSync(viewEN.page()).isEmpty());
errorLines = toPlainTextSync(viewEN.page()).split(QRegExp("[\r\n]"), QString::SkipEmptyParts);
@@ -1092,7 +1102,7 @@ void tst_QWebEngineView::changeLocale()
// Check whether an existing QWebEngineView keeps the language settings after changing the default locale
viewDE.load(url);
- QTRY_COMPARE_WITH_TIMEOUT(loadFinishedSpyDE.count(), 1, 12000);
+ QTRY_COMPARE_WITH_TIMEOUT(loadFinishedSpyDE.count(), 1, 20000);
QTRY_VERIFY(!toPlainTextSync(viewDE.page()).isEmpty());
errorLines = toPlainTextSync(viewDE.page()).split(QRegExp("[\r\n]"), QString::SkipEmptyParts);
@@ -1258,60 +1268,55 @@ void tst_QWebEngineView::keyboardEvents()
QVERIFY(loadFinishedSpy.wait());
}
-void tst_QWebEngineView::keyboardFocusAfterPopup()
-{
- QScopedPointer<QWidget> containerWidget(new QWidget);
-
- QLineEdit *urlLine = new QLineEdit(containerWidget.data());
- QStringList urlList;
- urlList << "test";
- QCompleter *completer = new QCompleter(urlList, urlLine);
- completer->setCompletionMode(QCompleter::PopupCompletion);
- urlLine->setCompleter(completer);
- urlLine->setFocus();
-
- QWebEngineView *webView = new QWebEngineView(containerWidget.data());
- webView->settings()->setAttribute(QWebEngineSettings::FocusOnNavigationEnabled, true);
- QSignalSpy loadFinishedSpy(webView, SIGNAL(loadFinished(bool)));
-
- connect(urlLine, &QLineEdit::editingFinished, [=] {
- webView->setHtml("<html><body onload=\"document.getElementById('input1').focus()\">"
- " <input type='text' id='input1' />"
- "</body></html>");
-
- // Check whether the RenderWidgetHostView has the keyboard focus
- QQuickWidget *rwhv = qobject_cast<QQuickWidget *>(webView->focusProxy());
- QVERIFY(rwhv);
- QVERIFY(rwhv->hasFocus());
- QVERIFY(rwhv->rootObject()->hasFocus());
- QVERIFY(rwhv->window()->windowHandle()->isActive());
- QVERIFY(rwhv->rootObject()->hasActiveFocus());
- });
-
+class WebViewWithUrlBar : public QWidget {
+public:
+ QLineEdit *lineEdit = new QLineEdit;
+ QCompleter *urlCompleter = new QCompleter({ QStringLiteral("test") }, lineEdit);
+ QWebEngineView *webView = new QWebEngineView;
QVBoxLayout *layout = new QVBoxLayout;
- layout->addWidget(urlLine);
- layout->addWidget(webView);
- containerWidget->setLayout(layout);
- containerWidget->show();
- QVERIFY(QTest::qWaitForWindowExposed(containerWidget.data()));
-
- // Trigger completer's popup and select the first suggestion
- QTest::keyClick(urlLine, Qt::Key_T);
- qApp->processEvents();
- QTRY_VERIFY(qApp->activePopupWidget());
- QTest::keyClick(qApp->activePopupWidget(), Qt::Key_Down);
- qApp->processEvents();
- QTest::keyClick(qApp->activePopupWidget(), Qt::Key_Enter);
- qApp->processEvents();
+ WebViewWithUrlBar()
+ {
+ resize(500, 500);
+ setLayout(layout);
+ layout->addWidget(lineEdit);
+ layout->addWidget(webView);
+ lineEdit->setCompleter(urlCompleter);
+ lineEdit->setFocus();
+ }
+};
- // After the load the focused window should forward the keyboard events to the webView
- QVERIFY(loadFinishedSpy.wait());
- // Wait for active focus on the input field
- QTRY_COMPARE(evaluateJavaScriptSync(webView->page(), "document.activeElement.id").toString(), QStringLiteral("input1"));
- QTest::keyClick(qApp->focusWindow(), Qt::Key_X);
- qApp->processEvents();
- QTRY_COMPARE(evaluateJavaScriptSync(webView->page(), "document.getElementById('input1').value").toString(), QStringLiteral("x"));
+void tst_QWebEngineView::keyboardFocusAfterPopup()
+{
+ const QString html = QStringLiteral(
+ "<html>"
+ " <body onload=\"document.getElementById('input1').focus()\">"
+ " <input id=input1 type=text/>"
+ " </body>"
+ "</html>");
+ WebViewWithUrlBar window;
+ QSignalSpy loadFinishedSpy(window.webView, &QWebEngineView::loadFinished);
+ connect(window.lineEdit, &QLineEdit::editingFinished, [&] { window.webView->setHtml(html); });
+ window.webView->settings()->setAttribute(QWebEngineSettings::FocusOnNavigationEnabled, true);
+ window.show();
+
+ // Focus will initially go to the QLineEdit.
+ QTRY_COMPARE(QApplication::focusWidget(), window.lineEdit);
+
+ // Trigger QCompleter's popup and select the first suggestion.
+ QTest::keyClick(QApplication::focusWindow(), Qt::Key_T);
+ QTRY_VERIFY(QApplication::activePopupWidget());
+ QTest::keyClick(QApplication::focusWindow(), Qt::Key_Down);
+ QTest::keyClick(QApplication::focusWindow(), Qt::Key_Enter);
+
+ // Due to FocusOnNavigationEnabled, focus should now move to the webView.
+ QTRY_COMPARE(QApplication::focusWidget(), window.webView->focusProxy());
+
+ // Keyboard events sent to the window should go to the <input> element.
+ QVERIFY(loadFinishedSpy.count() || loadFinishedSpy.wait());
+ QTest::keyClick(QApplication::focusWindow(), Qt::Key_X);
+ QTRY_COMPARE(evaluateJavaScriptSync(window.webView->page(), "document.getElementById('input1').value").toString(),
+ QStringLiteral("x"));
}
void tst_QWebEngineView::mouseClick()
@@ -1680,6 +1685,7 @@ void tst_QWebEngineView::softwareInputPanel()
void tst_QWebEngineView::inputMethods()
{
QWebEngineView view;
+ view.settings()->setAttribute(QWebEngineSettings::FocusOnNavigationEnabled, true);
view.resize(640, 480);
view.show();
@@ -1777,6 +1783,7 @@ void tst_QWebEngineView::inputMethods()
void tst_QWebEngineView::textSelectionInInputField()
{
QWebEngineView view;
+ view.settings()->setAttribute(QWebEngineSettings::FocusOnNavigationEnabled, true);
view.resize(640, 480);
view.show();
@@ -1969,6 +1976,7 @@ void tst_QWebEngineView::hiddenText()
void tst_QWebEngineView::emptyInputMethodEvent()
{
QWebEngineView view;
+ view.settings()->setAttribute(QWebEngineSettings::FocusOnNavigationEnabled, true);
view.resize(640, 480);
view.show();
@@ -2016,6 +2024,7 @@ void tst_QWebEngineView::emptyInputMethodEvent()
void tst_QWebEngineView::imeComposition()
{
QWebEngineView view;
+ view.settings()->setAttribute(QWebEngineSettings::FocusOnNavigationEnabled, true);
view.resize(640, 480);
view.show();
@@ -2191,6 +2200,7 @@ void tst_QWebEngineView::imeComposition()
void tst_QWebEngineView::newlineInTextarea()
{
QWebEngineView view;
+ view.settings()->setAttribute(QWebEngineSettings::FocusOnNavigationEnabled, true);
view.resize(640, 480);
view.show();
@@ -2729,7 +2739,6 @@ void tst_QWebEngineView::webUIURLs_data()
QTest::newRow("usb-internals") << QUrl("chrome://usb-internals") << false;
QTest::newRow("user-actions") << QUrl("chrome://user-actions") << false;
QTest::newRow("version") << QUrl("chrome://version") << false;
- QTest::newRow("view-http-cache") << QUrl("chrome://view-http-cache") << true;
QTest::newRow("webrtc-internals") << QUrl("chrome://webrtc-internals") << true;
QTest::newRow("webrtc-logs") << QUrl("chrome://webrtc-logs") << false;
}
@@ -2747,5 +2756,57 @@ void tst_QWebEngineView::webUIURLs()
QCOMPARE(loadFinishedSpy.takeFirst().at(0).toBool(), supported);
}
+void tst_QWebEngineView::visibilityState()
+{
+ QWebEngineView view;
+ QSignalSpy spy(&view, &QWebEngineView::loadFinished);
+ view.load(QStringLiteral("about:blank"));
+ QVERIFY(spy.count() || spy.wait());
+ QVERIFY(spy.takeFirst().takeFirst().toBool());
+ QCOMPARE(evaluateJavaScriptSync(view.page(), "document.visibilityState").toString(), QStringLiteral("hidden"));
+ view.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&view));
+ QCOMPARE(evaluateJavaScriptSync(view.page(), "document.visibilityState").toString(), QStringLiteral("visible"));
+}
+
+void tst_QWebEngineView::jsKeyboardEvent()
+{
+ QWebEngineView view;
+ evaluateJavaScriptSync(
+ view.page(),
+ "var log = '';"
+ "addEventListener('keydown', (ev) => {"
+ " log += [ev.keyCode, ev.code, ev.key, ev.ctrlKey, ev.shiftKey, ev.altKey].join(',') + ';';"
+ "});");
+ // Note that this only tests the fallback code path where native scan codes are not used.
+#if defined(Q_OS_MACOS)
+ // See Qt::AA_MacDontSwapCtrlAndMeta
+ QTest::keyClick(view.focusProxy(), 'A', Qt::MetaModifier | Qt::ShiftModifier);
+#else
+ QTest::keyClick(view.focusProxy(), 'A', Qt::ControlModifier | Qt::ShiftModifier);
+#endif
+ QString expected = QStringLiteral(
+ "16,ShiftLeft,Shift,false,true,false;"
+ "17,ControlLeft,Control,true,true,false;"
+ "65,KeyA,A,true,true,false;"
+ );
+ QTRY_VERIFY(evaluateJavaScriptSync(view.page(), "log") != QVariant(QString()));
+ QCOMPARE(evaluateJavaScriptSync(view.page(), "log"), expected);
+}
+
+void tst_QWebEngineView::deletePage()
+{
+ QWebEngineView view;
+ QWebEnginePage *page = view.page();
+ QVERIFY(page);
+ QCOMPARE(page->parent(), &view);
+ delete page;
+ // Test that a new page is created and that it is useful:
+ QVERIFY(view.page());
+ QSignalSpy spy(view.page(), &QWebEnginePage::loadFinished);
+ view.page()->load(QStringLiteral("about:blank"));
+ QTRY_VERIFY(spy.count());
+}
+
QTEST_MAIN(tst_QWebEngineView)
#include "tst_qwebengineview.moc"