summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorPeter Varga <pvarga@inf.u-szeged.hu>2020-01-15 10:47:37 +0100
committerPeter Varga <pvarga@inf.u-szeged.hu>2020-02-17 23:25:11 +0000
commit2d7a173b1f00c108cdf2ab451ff7f9af0094c2fa (patch)
treef2126b080c08b3f249105835d6a111092bb4e1e4 /tests
parent2cbd4ba7703756c3b0b5b37b118e755e5ea0bfe6 (diff)
Fix quick accessibility on macOS
Same as the widget fix: ffdf7ece Fix widget accessibility on macOS This patch depends on a focusChild() fix in qtdeclarative: 6420ad91d3 Fix QAccessibleQuickWindow::focusChild() to return focused descendant Task-number: QTBUG-78284 Task-number: QTBUG-81539 Change-Id: If0da937d2c778a158ce02e1433b28ca0888692d8 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/quick/dialogs/tst_dialogs.cpp3
-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
4 files changed, 83 insertions, 5 deletions
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/qquickwebengineview/tst_qquickwebengineview.cpp b/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp
index 5572515a1..6f9cb9c69 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 \