summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-02-19 13:27:34 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-02-19 13:27:34 +0100
commit1e204ff6e91227de3bd2f105a1efbaf47ee2b5aa (patch)
tree1609ebd46902d5c568d3df08e593ff2b5919cbbc
parent18b0081aeda8fcd5c2d756c47bdd63cb7f89e891 (diff)
parent8b048ef2ba4e8414f4852f791964878a6dc3f00f (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
-rw-r--r--examples/webengine/quicknanobrowser/BrowserWindow.qml31
-rw-r--r--src/core/file_picker_controller.cpp3
-rw-r--r--src/core/web_contents_delegate_qt.cpp5
-rw-r--r--src/webengine/api/qquickwebengineview.cpp31
-rw-r--r--src/webengine/api/qquickwebengineview_p_p.h1
-rw-r--r--src/webengine/render_widget_host_view_qt_delegate_quick.cpp49
-rw-r--r--src/webengine/render_widget_host_view_qt_delegate_quick.h22
-rw-r--r--tests/auto/core/qwebenginecookiestore/tst_qwebenginecookiestore.cpp63
-rw-r--r--tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp20
-rw-r--r--tests/auto/quick/dialogs/tst_dialogs.cpp3
-rw-r--r--tests/auto/quick/qmltests/data/tst_filePicker.qml2
-rw-r--r--tests/auto/quick/qquickwebengineview/BLACKLIST4
-rw-r--r--tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp70
-rw-r--r--tests/auto/quick/qquickwebengineviewgraphics/tst_qquickwebengineviewgraphics.cpp3
-rw-r--r--tests/auto/quick/shared/util.h12
-rw-r--r--tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp2
16 files changed, 264 insertions, 57 deletions
diff --git a/examples/webengine/quicknanobrowser/BrowserWindow.qml b/examples/webengine/quicknanobrowser/BrowserWindow.qml
index 2d3168382..c595c3bc5 100644
--- a/examples/webengine/quicknanobrowser/BrowserWindow.qml
+++ b/examples/webengine/quicknanobrowser/BrowserWindow.qml
@@ -133,6 +133,10 @@ ApplicationWindow {
}
}
Action {
+ shortcut: StandardKey.Quit
+ onTriggered: browserWindow.close()
+ }
+ Action {
shortcut: "Escape"
onTriggered: {
if (currentWebView.state == "FullScreen") {
@@ -268,7 +272,7 @@ ApplicationWindow {
id: faviconImage
width: 16; height: 16
sourceSize: Qt.size(width, height)
- source: currentWebView && currentWebView.icon
+ source: currentWebView && currentWebView.icon ? currentWebView.icon : ''
}
style: TextFieldStyle {
padding {
@@ -395,11 +399,25 @@ ApplicationWindow {
var tab = addTab("", tabComponent);
// We must do this first to make sure that tab.active gets set so that tab.item gets instantiated immediately.
tab.active = true;
- tab.title = Qt.binding(function() { return tab.item.title });
+ tab.title = Qt.binding(function() { return tab.item.title ? tab.item.title : 'New Tab' });
tab.item.profile = profile;
return tab;
}
+ function indexOfView(view) {
+ for (let i = 0; i < tabs.count; ++i)
+ if (tabs.getTab(i).item == view)
+ return i
+ return -1
+ }
+
+ function removeView(index) {
+ if (tabs.count > 1)
+ tabs.removeTab(index)
+ else
+ browserWindow.close();
+ }
+
anchors.top: parent.top
anchors.bottom: devToolsView.top
anchors.left: parent.left
@@ -447,7 +465,7 @@ ApplicationWindow {
color: control.hovered ? "#ccc" : tabRectangle.color
Text {text: "x" ; anchors.centerIn: parent ; color: "gray"}
}}
- onClicked: tabs.removeTab(styleData.index);
+ onClicked: tabs.removeView(styleData.index)
}
}
}
@@ -564,12 +582,7 @@ ApplicationWindow {
reloadTimer.running = true;
}
- onWindowCloseRequested: {
- if (tabs.count == 1)
- browserWindow.close();
- else
- tabs.removeTab(tabs.currentIndex);
- }
+ onWindowCloseRequested: tabs.removeView(tabs.indexOfView(webEngineView))
onSelectClientCertificate: function(selection) {
selection.certificates[0].select();
diff --git a/src/core/file_picker_controller.cpp b/src/core/file_picker_controller.cpp
index 13e9437d2..62e02e126 100644
--- a/src/core/file_picker_controller.cpp
+++ b/src/core/file_picker_controller.cpp
@@ -172,6 +172,9 @@ QStringList FilePickerController::nameFilters(const QStringList &acceptedMimeTyp
QStringList acceptedGlobs;
QMimeDatabase mimeDatabase;
+ if (acceptedMimeTypes.isEmpty())
+ return nameFilters;
+
for (QString type : acceptedMimeTypes) {
if (type.startsWith(".")) {
// A single suffix
diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp
index 078b34d64..f409d8a7c 100644
--- a/src/core/web_contents_delegate_qt.cpp
+++ b/src/core/web_contents_delegate_qt.cpp
@@ -198,7 +198,10 @@ void WebContentsDelegateQt::NavigationStateChanged(content::WebContents* source,
QString newTitle = toQt(source->GetTitle());
if (m_title != newTitle) {
m_title = newTitle;
- m_viewClient->titleChanged(m_title);
+ QTimer::singleShot(0, [delegate = AsWeakPtr(), title = newTitle] () {
+ if (delegate)
+ delegate->adapterClient()->titleChanged(title);
+ });
}
}
diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp
index 67d4142b9..8f5313a9d 100644
--- a/src/webengine/api/qquickwebengineview.cpp
+++ b/src/webengine/api/qquickwebengineview.cpp
@@ -753,26 +753,34 @@ QQuickWebEngineViewAccessible::QQuickWebEngineViewAccessible(QQuickWebEngineView
QAccessibleInterface *QQuickWebEngineViewAccessible::parent() const
{
QQuickItem *parent = engineView()->parentItem();
- return QAccessible::queryAccessibleInterface(parent);
+ QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(parent);
+ if (!iface)
+ return QAccessible::queryAccessibleInterface(engineView()->window());
+ return iface;
+}
+
+QAccessibleInterface *QQuickWebEngineViewAccessible::focusChild() const
+{
+ if (child(0) && child(0)->focusChild())
+ return child(0)->focusChild();
+ return const_cast<QQuickWebEngineViewAccessible *>(this);
}
int QQuickWebEngineViewAccessible::childCount() const
{
- if (engineView() && child(0))
- return 1;
- return 0;
+ return child(0) ? 1 : 0;
}
QAccessibleInterface *QQuickWebEngineViewAccessible::child(int index) const
{
- if (index == 0)
+ if (index == 0 && engineView())
return engineView()->d_func()->adapter->browserAccessible();
return 0;
}
int QQuickWebEngineViewAccessible::indexOfChild(const QAccessibleInterface *c) const
{
- if (c == child(0))
+ if (child(0) && c == child(0))
return 0;
return -1;
}
@@ -784,7 +792,7 @@ QString QQuickWebEngineViewAccessible::text(QAccessible::Text) const
QAccessible::Role QQuickWebEngineViewAccessible::role() const
{
- return QAccessible::Document;
+ return QAccessible::Client;
}
QAccessible::State QQuickWebEngineViewAccessible::state() const
@@ -945,10 +953,17 @@ void QQuickWebEngineViewPrivate::widgetChanged(RenderWidgetHostViewQtDelegateQui
{
Q_Q(QQuickWebEngineView);
- if (oldWidget)
+ if (oldWidget) {
oldWidget->setParentItem(nullptr);
+#if QT_CONFIG(accessibility)
+ QAccessible::deleteAccessibleInterface(QAccessible::uniqueId(QAccessible::queryAccessibleInterface(oldWidget)));
+#endif
+ }
if (newWidget) {
+#if QT_CONFIG(accessibility)
+ QAccessible::registerAccessibleInterface(new QtWebEngineCore::RenderWidgetHostViewQtDelegateQuickAccessible(newWidget, q));
+#endif
newWidget->setParentItem(q);
newWidget->setSize(q->boundingRect().size());
// Focus on creation if the view accepts it
diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h
index 8557a8db5..1f024167f 100644
--- a/src/webengine/api/qquickwebengineview_p_p.h
+++ b/src/webengine/api/qquickwebengineview_p_p.h
@@ -236,6 +236,7 @@ class QQuickWebEngineViewAccessible : public QAccessibleObject
public:
QQuickWebEngineViewAccessible(QQuickWebEngineView *o);
QAccessibleInterface *parent() const override;
+ QAccessibleInterface *focusChild() const override;
int childCount() const override;
QAccessibleInterface *child(int index) const override;
int indexOfChild(const QAccessibleInterface*) const override;
diff --git a/src/webengine/render_widget_host_view_qt_delegate_quick.cpp b/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
index ac32671aa..ede85ca69 100644
--- a/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
+++ b/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
@@ -373,4 +373,53 @@ bool RenderWidgetHostViewQtDelegateQuick::copySurface(const QRect &rect, const Q
return true;
}
+#if QT_CONFIG(accessibility)
+RenderWidgetHostViewQtDelegateQuickAccessible::RenderWidgetHostViewQtDelegateQuickAccessible(RenderWidgetHostViewQtDelegateQuick *o, QQuickWebEngineView *view)
+ : QAccessibleObject(o)
+ , m_view(view)
+{
+}
+
+QAccessibleInterface *RenderWidgetHostViewQtDelegateQuickAccessible::parent() const
+{
+ return QAccessible::queryAccessibleInterface(m_view)->parent();
+}
+
+QString RenderWidgetHostViewQtDelegateQuickAccessible::text(QAccessible::Text) const
+{
+ return QString();
+}
+
+QAccessible::Role RenderWidgetHostViewQtDelegateQuickAccessible::role() const
+{
+ return QAccessible::Client;
+}
+
+QAccessible::State RenderWidgetHostViewQtDelegateQuickAccessible::state() const
+{
+ return QAccessible::queryAccessibleInterface(m_view)->state();
+}
+
+QAccessibleInterface *RenderWidgetHostViewQtDelegateQuickAccessible::focusChild() const
+{
+ return QAccessible::queryAccessibleInterface(m_view)->focusChild();
+}
+
+int RenderWidgetHostViewQtDelegateQuickAccessible::childCount() const
+{
+ return QAccessible::queryAccessibleInterface(m_view)->childCount();
+}
+
+QAccessibleInterface *RenderWidgetHostViewQtDelegateQuickAccessible::child(int index) const
+{
+ return QAccessible::queryAccessibleInterface(m_view)->child(index);
+}
+
+int RenderWidgetHostViewQtDelegateQuickAccessible::indexOfChild(const QAccessibleInterface *c) const
+{
+ return QAccessible::queryAccessibleInterface(m_view)->indexOfChild(c);
+}
+
+#endif // QT_CONFIG(accessibility)
+
} // namespace QtWebEngineCore
diff --git a/src/webengine/render_widget_host_view_qt_delegate_quick.h b/src/webengine/render_widget_host_view_qt_delegate_quick.h
index b55b2d658..6874aac2b 100644
--- a/src/webengine/render_widget_host_view_qt_delegate_quick.h
+++ b/src/webengine/render_widget_host_view_qt_delegate_quick.h
@@ -42,6 +42,7 @@
#include "render_widget_host_view_qt_delegate.h"
+#include <QAccessibleObject>
#include <QQuickItem>
QT_BEGIN_NAMESPACE
@@ -115,6 +116,27 @@ private:
QQuickWebEngineView *m_view = nullptr;
};
+#if QT_CONFIG(accessibility)
+class RenderWidgetHostViewQtDelegateQuickAccessible : public QAccessibleObject
+{
+public:
+ RenderWidgetHostViewQtDelegateQuickAccessible(RenderWidgetHostViewQtDelegateQuick *o, QQuickWebEngineView *view);
+
+ QAccessibleInterface *parent() const override;
+ QString text(QAccessible::Text t) const override;
+ QAccessible::Role role() const override;
+ QAccessible::State state() const override;
+
+ QAccessibleInterface *focusChild() const override;
+ int childCount() const override;
+ QAccessibleInterface *child(int index) const override;
+ int indexOfChild(const QAccessibleInterface *) const override;
+
+private:
+ QQuickWebEngineView *m_view;
+};
+#endif // QT_CONFIG(accessibility)
+
} // namespace QtWebEngineCore
#endif
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()