diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-02-19 13:27:34 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-02-19 13:27:34 +0100 |
commit | 1e204ff6e91227de3bd2f105a1efbaf47ee2b5aa (patch) | |
tree | 1609ebd46902d5c568d3df08e593ff2b5919cbbc /tests/auto | |
parent | 18b0081aeda8fcd5c2d756c47bdd63cb7f89e891 (diff) | |
parent | 8b048ef2ba4e8414f4852f791964878a6dc3f00f (diff) |
Merge remote-tracking branch 'origin/5.14' into 5.15
Blacklisted one test requiring an update of qt5.git.
Conflicts:
.qmake.conf
Change-Id: I75e55a1c5f8840cde55ddb60d632287b2affadeb
Diffstat (limited to 'tests/auto')
9 files changed, 140 insertions, 39 deletions
diff --git a/tests/auto/core/qwebenginecookiestore/tst_qwebenginecookiestore.cpp b/tests/auto/core/qwebenginecookiestore/tst_qwebenginecookiestore.cpp index 4ff33dbac..2c41aa9b1 100644 --- a/tests/auto/core/qwebenginecookiestore/tst_qwebenginecookiestore.cpp +++ b/tests/auto/core/qwebenginecookiestore/tst_qwebenginecookiestore.cpp @@ -45,17 +45,21 @@ public Q_SLOTS: void init(); void cleanup(); -private Q_SLOTS: void initTestCase(); void cleanupTestCase(); - void cookieSignals(); + +private Q_SLOTS: + // MEMO should be the first test of a testcase + // as it checks storage manipulation without navigation void setAndDeleteCookie(); + + void cookieSignals(); void batchCookieTasks(); void basicFilter(); void html5featureFilter(); private: - QWebEngineProfile m_profile; + QWebEngineProfile *m_profile; }; tst_QWebEngineCookieStore::tst_QWebEngineCookieStore() @@ -72,22 +76,24 @@ void tst_QWebEngineCookieStore::init() void tst_QWebEngineCookieStore::cleanup() { - m_profile.cookieStore()->deleteAllCookies(); + m_profile->cookieStore()->deleteAllCookies(); } void tst_QWebEngineCookieStore::initTestCase() { + m_profile = new QWebEngineProfile; } void tst_QWebEngineCookieStore::cleanupTestCase() { + delete m_profile; } void tst_QWebEngineCookieStore::cookieSignals() { - QWebEnginePage page(&m_profile); + QWebEnginePage page(m_profile); - QWebEngineCookieStore *client = m_profile.cookieStore(); + QWebEngineCookieStore *client = m_profile->cookieStore(); QSignalSpy loadSpy(&page, SIGNAL(loadFinished(bool))); QSignalSpy cookieAddedSpy(client, SIGNAL(cookieAdded(const QNetworkCookie &))); @@ -95,7 +101,7 @@ void tst_QWebEngineCookieStore::cookieSignals() page.load(QUrl("qrc:///resources/index.html")); - QTRY_COMPARE(loadSpy.count(), 1); + QTRY_COMPARE_WITH_TIMEOUT(loadSpy.count(), 1, 30000); QVariant success = loadSpy.takeFirst().takeFirst(); QVERIFY(success.toBool()); QTRY_COMPARE(cookieAddedSpy.count(), 2); @@ -115,8 +121,8 @@ void tst_QWebEngineCookieStore::cookieSignals() void tst_QWebEngineCookieStore::setAndDeleteCookie() { - QWebEnginePage page(&m_profile); - QWebEngineCookieStore *client = m_profile.cookieStore(); + QWebEnginePage page(m_profile); + QWebEngineCookieStore *client = m_profile->cookieStore(); QSignalSpy loadSpy(&page, SIGNAL(loadFinished(bool))); QSignalSpy cookieAddedSpy(client, SIGNAL(cookieAdded(const QNetworkCookie &))); @@ -127,16 +133,23 @@ void tst_QWebEngineCookieStore::setAndDeleteCookie() QNetworkCookie cookie3(QNetworkCookie::parseCookies(QByteArrayLiteral("SessionCookie=QtWebEngineCookieTest; Path=///resources")).first()); QNetworkCookie expiredCookie3(QNetworkCookie::parseCookies(QByteArrayLiteral("SessionCookie=delete; expires=Thu, 01-Jan-1970 00:00:00 GMT; path=///resources")).first()); + // force to init storage as it's done lazily upon first navigation + client->loadAllCookies(); + // /* FIXME remove 'blank' navigation once loadAllCookies api is fixed + page.load(QUrl("about:blank")); + QTRY_COMPARE_WITH_TIMEOUT(loadSpy.count(), 1, 30000); + // */ + // check if pending cookies are set and removed client->setCookie(cookie1); - QTRY_COMPARE(cookieAddedSpy.count(),1); client->setCookie(cookie2); - QTRY_COMPARE(cookieAddedSpy.count(),2); + QTRY_COMPARE(cookieAddedSpy.count(), 2); client->deleteCookie(cookie1); + QTRY_COMPARE(cookieRemovedSpy.count(), 1); page.load(QUrl("qrc:///resources/content.html")); - QTRY_COMPARE(loadSpy.count(), 1); + QTRY_COMPARE_WITH_TIMEOUT(loadSpy.count(), 2, 30000); QVariant success = loadSpy.takeFirst().takeFirst(); QVERIFY(success.toBool()); QTRY_COMPARE(cookieAddedSpy.count(), 2); @@ -155,8 +168,8 @@ void tst_QWebEngineCookieStore::setAndDeleteCookie() void tst_QWebEngineCookieStore::batchCookieTasks() { - QWebEnginePage page(&m_profile); - QWebEngineCookieStore *client = m_profile.cookieStore(); + QWebEnginePage page(m_profile); + QWebEngineCookieStore *client = m_profile->cookieStore(); QSignalSpy loadSpy(&page, SIGNAL(loadFinished(bool))); QSignalSpy cookieAddedSpy(client, SIGNAL(cookieAdded(const QNetworkCookie &))); @@ -165,14 +178,20 @@ void tst_QWebEngineCookieStore::batchCookieTasks() QNetworkCookie cookie1(QNetworkCookie::parseCookies(QByteArrayLiteral("khaos=I9GX8CWI; Domain=.example.com; Path=/docs")).first()); QNetworkCookie cookie2(QNetworkCookie::parseCookies(QByteArrayLiteral("Test%20Cookie=foobar; domain=example.com; Path=/")).first()); + // force to init storage as it's done lazily upon first navigation + client->loadAllCookies(); + // /* FIXME remove 'blank' navigation once loadAllCookies api is fixed + page.load(QUrl("about:blank")); + QTRY_COMPARE_WITH_TIMEOUT(loadSpy.count(), 1, 30000); + // */ + client->setCookie(cookie1); - QTRY_COMPARE(cookieAddedSpy.count(), 1); client->setCookie(cookie2); QTRY_COMPARE(cookieAddedSpy.count(), 2); page.load(QUrl("qrc:///resources/index.html")); - QTRY_COMPARE(loadSpy.count(), 1); + QTRY_COMPARE_WITH_TIMEOUT(loadSpy.count(), 2, 30000); QVariant success = loadSpy.takeFirst().takeFirst(); QVERIFY(success.toBool()); QTRY_COMPARE(cookieAddedSpy.count(), 4); @@ -190,8 +209,8 @@ void tst_QWebEngineCookieStore::batchCookieTasks() void tst_QWebEngineCookieStore::basicFilter() { - QWebEnginePage page(&m_profile); - QWebEngineCookieStore *client = m_profile.cookieStore(); + QWebEnginePage page(m_profile); + QWebEngineCookieStore *client = m_profile->cookieStore(); QAtomicInt accessTested = 0; client->setCookieFilter([&](const QWebEngineCookieStore::FilterRequest &){ ++accessTested; return true;}); @@ -202,7 +221,7 @@ void tst_QWebEngineCookieStore::basicFilter() page.load(QUrl("qrc:///resources/index.html")); - QTRY_COMPARE(loadSpy.count(), 1); + QTRY_COMPARE_WITH_TIMEOUT(loadSpy.count(), 1, 30000); QVERIFY(loadSpy.takeFirst().takeFirst().toBool()); QTRY_COMPARE(cookieAddedSpy.count(), 2); QTRY_COMPARE(accessTested.loadAcquire(), 2); // FIXME? @@ -222,8 +241,8 @@ void tst_QWebEngineCookieStore::basicFilter() void tst_QWebEngineCookieStore::html5featureFilter() { - QWebEnginePage page(&m_profile); - QWebEngineCookieStore *client = m_profile.cookieStore(); + QWebEnginePage page(m_profile); + QWebEngineCookieStore *client = m_profile->cookieStore(); QAtomicInt accessTested = 0; client->setCookieFilter([&](const QWebEngineCookieStore::FilterRequest &){ ++accessTested; return false;}); @@ -232,7 +251,7 @@ void tst_QWebEngineCookieStore::html5featureFilter() page.load(QUrl("qrc:///resources/content.html")); - QTRY_COMPARE(loadSpy.count(), 1); + QTRY_COMPARE_WITH_TIMEOUT(loadSpy.count(), 1, 30000); QVERIFY(loadSpy.takeFirst().takeFirst().toBool()); QCOMPARE(accessTested.loadAcquire(), 0); // FIXME? QTest::ignoreMessage(QtCriticalMsg, QRegularExpression(".*Uncaught SecurityError.*sessionStorage.*")); diff --git a/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp b/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp index 76a061a8f..5effb2abf 100644 --- a/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp +++ b/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp @@ -114,7 +114,7 @@ class TestRequestInterceptor : public QWebEngineUrlRequestInterceptor public: QList<RequestInfo> requestInfos; bool shouldIntercept; - QMap<QUrl, QUrl> requestInitiatorUrls; + QMap<QUrl, QSet<QUrl>> requestInitiatorUrls; void interceptRequest(QWebEngineUrlRequestInfo &info) override { @@ -129,7 +129,7 @@ public: // Set referrer header info.setHttpHeader(kHttpHeaderRefererName, kHttpHeaderReferrerValue); - requestInitiatorUrls.insert(info.requestUrl(), info.initiator()); + requestInitiatorUrls[info.requestUrl()].insert(info.initiator()); requestInfos.append(info); } @@ -585,49 +585,49 @@ void tst_QWebEngineUrlRequestInterceptor::initiator() QTRY_VERIFY(interceptor.hasUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeSubFrame)); infos = interceptor.getUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeSubFrame); foreach (auto info, infos) - QCOMPARE(info.initiator, interceptor.requestInitiatorUrls[info.requestUrl]); + QVERIFY(interceptor.requestInitiatorUrls[info.requestUrl].contains(info.initiator)); // Stylesheet QTRY_VERIFY(interceptor.hasUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeStylesheet)); infos = interceptor.getUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeStylesheet); foreach (auto info, infos) - QCOMPARE(info.initiator, interceptor.requestInitiatorUrls[info.requestUrl]); + QVERIFY(interceptor.requestInitiatorUrls[info.requestUrl].contains(info.initiator)); // Script QTRY_VERIFY(interceptor.hasUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeScript)); infos = interceptor.getUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeScript); foreach (auto info, infos) - QCOMPARE(info.initiator, interceptor.requestInitiatorUrls[info.requestUrl]); + QVERIFY(interceptor.requestInitiatorUrls[info.requestUrl].contains(info.initiator)); // Image QTRY_VERIFY(interceptor.hasUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeImage)); infos = interceptor.getUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeImage); foreach (auto info, infos) - QCOMPARE(info.initiator, interceptor.requestInitiatorUrls[info.requestUrl]); + QVERIFY(interceptor.requestInitiatorUrls[info.requestUrl].contains(info.initiator)); // FontResource QTRY_VERIFY(interceptor.hasUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeFontResource)); infos = interceptor.getUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeFontResource); foreach (auto info, infos) - QCOMPARE(info.initiator, interceptor.requestInitiatorUrls[info.requestUrl]); + QVERIFY(interceptor.requestInitiatorUrls[info.requestUrl].contains(info.initiator)); // Media QTRY_VERIFY(interceptor.hasUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeMedia)); infos = interceptor.getUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeMedia); foreach (auto info, infos) - QCOMPARE(info.initiator, interceptor.requestInitiatorUrls[info.requestUrl]); + QVERIFY(interceptor.requestInitiatorUrls[info.requestUrl].contains(info.initiator)); // Favicon QTRY_VERIFY(interceptor.hasUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeFavicon)); infos = interceptor.getUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeFavicon); foreach (auto info, infos) - QCOMPARE(info.initiator, interceptor.requestInitiatorUrls[info.requestUrl]); + QVERIFY(interceptor.requestInitiatorUrls[info.requestUrl].contains(info.initiator)); // XMLHttpRequest QTRY_VERIFY(interceptor.hasUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeXhr)); infos = interceptor.getUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeXhr); foreach (auto info, infos) - QCOMPARE(info.initiator, interceptor.requestInitiatorUrls[info.requestUrl]); + QVERIFY(interceptor.requestInitiatorUrls[info.requestUrl].contains(info.initiator)); } QTEST_MAIN(tst_QWebEngineUrlRequestInterceptor) diff --git a/tests/auto/quick/dialogs/tst_dialogs.cpp b/tests/auto/quick/dialogs/tst_dialogs.cpp index 82ea3be37..8e802a836 100644 --- a/tests/auto/quick/dialogs/tst_dialogs.cpp +++ b/tests/auto/quick/dialogs/tst_dialogs.cpp @@ -230,6 +230,7 @@ void tst_Dialogs::javaScriptDialogRequested() QTRY_VERIFY(m_listner->ready()); // make sure javascript executes no longer } +static QByteArrayList params; +W_QTEST_MAIN(tst_Dialogs, params) #include "tst_dialogs.moc" -W_QTEST_MAIN(tst_Dialogs) diff --git a/tests/auto/quick/qmltests/data/tst_filePicker.qml b/tests/auto/quick/qmltests/data/tst_filePicker.qml index c9572224e..15eadb2a1 100644 --- a/tests/auto/quick/qmltests/data/tst_filePicker.qml +++ b/tests/auto/quick/qmltests/data/tst_filePicker.qml @@ -267,7 +267,7 @@ TestWebEngineView { { tag: "CustomSuffix", input: ".pug", expected: ".pug", exactMatch: false}, { tag: "CustomMime", input: "dog/pug", expected: "Accepted types ()", exactMatch: true}, { tag: "CustomGlob", input: "dog/*", expected: "Accepted types ()", exactMatch: true}, - { tag: "Invalid", input: "---", expected: "Accepted types ()", exactMatch: true}, + { tag: "Invalid", input: "---", expected: undefined, exactMatch: true}, { tag: "Jpeg", input: "image/jpeg", expected: ".jpeg", exactMatch: false} ]; } diff --git a/tests/auto/quick/qquickwebengineview/BLACKLIST b/tests/auto/quick/qquickwebengineview/BLACKLIST index d4d5c9844..322c6f561 100644 --- a/tests/auto/quick/qquickwebengineview/BLACKLIST +++ b/tests/auto/quick/qquickwebengineview/BLACKLIST @@ -1,2 +1,6 @@ [transparentWebEngineViews] windows + +# until qt5.git is updated with new qtdeclarative +[focusChild] +* diff --git a/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp b/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp index 5a7879993..7798f07fc 100644 --- a/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp +++ b/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp @@ -92,6 +92,8 @@ private Q_SLOTS: void javascriptClipboard_data(); void javascriptClipboard(); void setProfile(); + void focusChild(); + void focusChild_data(); private: inline QQuickWebEngineView *newWebEngineView(); @@ -1162,5 +1164,71 @@ void tst_QQuickWebEngineView::setProfile() { QTRY_COMPARE(webEngineView()->url() ,urlFromTestPath("html/basic_page2.html")); } -QTEST_MAIN(tst_QQuickWebEngineView) +void tst_QQuickWebEngineView::focusChild_data() +{ + QTest::addColumn<QString>("interfaceName"); + QTest::addColumn<QVector<QAccessible::Role>>("ancestorRoles"); + + QTest::newRow("QQuickWebEngineView") << QString("QQuickWebEngineView") << QVector<QAccessible::Role>({QAccessible::Client}); + QTest::newRow("RenderWidgetHostViewQtDelegate") << QString("RenderWidgetHostViewQtDelegate") << QVector<QAccessible::Role>({QAccessible::Client}); + QTest::newRow("QQuickView") << QString("QQuickView") << QVector<QAccessible::Role>({QAccessible::Window, QAccessible::Client /* view */}); +} + +void tst_QQuickWebEngineView::focusChild() +{ + auto traverseToWebDocumentAccessibleInterface = [](QAccessibleInterface *iface) -> QAccessibleInterface * { + QFETCH(QVector<QAccessible::Role>, ancestorRoles); + for (int i = 0; i < ancestorRoles.size(); ++i) { + if (iface->childCount() == 0 || iface->role() != ancestorRoles[i]) + return nullptr; + iface = iface->child(0); + } + + if (iface->role() != QAccessible::WebDocument) + return nullptr; + + return iface; + }; + + QQuickWebEngineView *view = webEngineView(); + m_window->show(); + view->settings()->setFocusOnNavigationEnabled(true); + view->setSize(QSizeF(640, 480)); + view->loadHtml("<html><body>" + "<input id='input1' type='text'>" + "</body></html>"); + QVERIFY(waitForLoadSucceeded(view)); + + QAccessibleInterface *iface = nullptr; + QFETCH(QString, interfaceName); + if (interfaceName == "QQuickWebEngineView") + iface = QAccessible::queryAccessibleInterface(view); + else if (interfaceName == "RenderWidgetHostViewQtDelegate") + iface = QAccessible::queryAccessibleInterface(m_window->focusObject()); + else if (interfaceName == "QQuickView") + iface = QAccessible::queryAccessibleInterface(m_window.data()); + QVERIFY(iface); + + // Make sure the input field does not have the focus. + runJavaScript("document.getElementById('input1').blur();"); + QTRY_VERIFY(evaluateJavaScriptSync(view, "document.activeElement.id").toString().isEmpty()); + + QVERIFY(iface->focusChild()); + QTRY_COMPARE(iface->focusChild()->role(), QAccessible::WebDocument); + QCOMPARE(traverseToWebDocumentAccessibleInterface(iface), iface->focusChild()); + + // Set active focus on the input field. + runJavaScript("document.getElementById('input1').focus();"); + QTRY_COMPARE(evaluateJavaScriptSync(view, "document.activeElement.id").toString(), QStringLiteral("input1")); + + QVERIFY(iface->focusChild()); + QTRY_COMPARE(iface->focusChild()->role(), QAccessible::EditableText); + // <html> -> <body> -> <input> + QCOMPARE(traverseToWebDocumentAccessibleInterface(iface)->child(0)->child(0), iface->focusChild()); +} + +static QByteArrayList params = QByteArrayList() + << "--force-renderer-accessibility"; + +W_QTEST_MAIN(tst_QQuickWebEngineView, params) #include "tst_qquickwebengineview.moc" diff --git a/tests/auto/quick/qquickwebengineviewgraphics/tst_qquickwebengineviewgraphics.cpp b/tests/auto/quick/qquickwebengineviewgraphics/tst_qquickwebengineviewgraphics.cpp index c9abe9cfe..518ddaa0d 100644 --- a/tests/auto/quick/qquickwebengineviewgraphics/tst_qquickwebengineviewgraphics.cpp +++ b/tests/auto/quick/qquickwebengineviewgraphics/tst_qquickwebengineviewgraphics.cpp @@ -157,5 +157,6 @@ void tst_QQuickWebEngineViewGraphics::setHtml(const QString &html) QTRY_COMPARE_WITH_TIMEOUT(m_view->rootObject()->property("loading"), QVariant(false), 30000); } -W_QTEST_MAIN(tst_QQuickWebEngineViewGraphics) +static QByteArrayList params; +W_QTEST_MAIN(tst_QQuickWebEngineViewGraphics, params) #include "tst_qquickwebengineviewgraphics.moc" diff --git a/tests/auto/quick/shared/util.h b/tests/auto/quick/shared/util.h index fbce8bfa7..b7b7b1564 100644 --- a/tests/auto/quick/shared/util.h +++ b/tests/auto/quick/shared/util.h @@ -168,11 +168,19 @@ inline QString activeElementId(QQuickWebEngineView *webEngineView) return arguments.at(1).toString(); } -#define W_QTEST_MAIN(TestObject) \ +#define W_QTEST_MAIN(TestObject, params) \ int main(int argc, char *argv[]) \ { \ QtWebEngine::initialize(); \ - QGuiApplication app(argc, argv); \ + \ + QVector<const char *> w_argv(argc); \ + for (int i = 0; i < argc; ++i) \ + w_argv[i] = argv[i]; \ + for (int i = 0; i < params.size(); ++i) \ + w_argv.append(params[i].data()); \ + int w_argc = w_argv.size(); \ + \ + QGuiApplication app(w_argc, const_cast<char **>(w_argv.data())); \ app.setAttribute(Qt::AA_Use96Dpi, true); \ TestObject tc; \ QTEST_SET_MAIN_SOURCE_PATH \ diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp index 2c4b2574a..7fdf897ca 100644 --- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp +++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp @@ -791,7 +791,7 @@ void tst_QWebEnginePage::backActionUpdate() QVERIFY(evaluateJavaScriptSync(page, "document.getElementsByName('frame_b')[0].contentDocument == undefined").toBool()); QTest::mouseClick(view.focusProxy(), Qt::LeftButton, 0, firstAnchorCenterInFrame(page, "frame_c")); QTRY_VERIFY(evaluateJavaScriptSync(page, "document.getElementsByName('frame_b')[0].contentDocument != undefined").toBool()); - QVERIFY(action->isEnabled()); + QTRY_VERIFY(action->isEnabled()); } void tst_QWebEnginePage::localStorageVisibility() |