From a8666bc741c72b6b21dc0993d83919947cc17575 Mon Sep 17 00:00:00 2001 From: Peter Varga Date: Tue, 19 Sep 2017 14:20:19 +0200 Subject: Refactor tst_qquickwebengineview auto test Pass JavaScript result via callback instead of using console.log. Change-Id: Ie464f038d4fa778b1f64e95eca58e86e29184c1e Reviewed-by: Allan Sandfeld Jensen --- .../tst_qquickwebengineview.cpp | 20 ++-- tests/auto/quick/shared/util.h | 121 ++++++--------------- 2 files changed, 41 insertions(+), 100 deletions(-) (limited to 'tests/auto/quick') diff --git a/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp b/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp index 4bc136539..c5718dc1f 100644 --- a/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp +++ b/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp @@ -507,7 +507,7 @@ void tst_QQuickWebEngineView::interruptImeTextComposition() QVERIFY(waitForLoadSucceeded(view)); runJavaScript("document.getElementById('input1').focus();"); - QTRY_COMPARE(activeElementId(view), QStringLiteral("input1")); + QTRY_COMPARE(evaluateJavaScriptSync(view, "document.activeElement.id").toString(), QStringLiteral("input1")); TestInputContext testContext; @@ -516,7 +516,7 @@ void tst_QQuickWebEngineView::interruptImeTextComposition() QInputMethodEvent event("x", attributes); input = qobject_cast(qApp->focusObject()); QGuiApplication::sendEvent(input, &event); - QTRY_COMPARE(elementValue(view, "input1"), QStringLiteral("x")); + QTRY_COMPARE(evaluateJavaScriptSync(view, "document.getElementById('input1').value").toString(), QStringLiteral("x")); // Focus 'input2' input field by an input event QFETCH(QString, eventType); @@ -529,7 +529,7 @@ void tst_QQuickWebEngineView::interruptImeTextComposition() QTest::touchEvent(view->window(), touchDevice).press(0, textInputCenter, view->window()); QTest::touchEvent(view->window(), touchDevice).release(0, textInputCenter, view->window()); } - QTRY_COMPARE(activeElementId(view), QStringLiteral("input2")); + QTRY_COMPARE(evaluateJavaScriptSync(view, "document.activeElement.id").toString(), QStringLiteral("input2")); #ifndef Q_OS_WIN QTRY_COMPARE(testContext.commitCallCount, 1); #else @@ -538,7 +538,7 @@ void tst_QQuickWebEngineView::interruptImeTextComposition() // Check the composition text has been committed runJavaScript("document.getElementById('input1').focus();"); - QTRY_COMPARE(activeElementId(view), QStringLiteral("input1")); + QTRY_COMPARE(evaluateJavaScriptSync(view, "document.activeElement.id").toString(), QStringLiteral("input1")); input = qobject_cast(qApp->focusObject()); QTRY_COMPARE(input->inputMethodQuery(Qt::ImSurroundingText).toString(), QStringLiteral("x")); } @@ -786,8 +786,8 @@ void tst_QQuickWebEngineView::changeLocale() viewDE->setUrl(url); QVERIFY(waitForLoadFailed(viewDE.data())); - QTRY_VERIFY(!bodyInnerText(viewDE.data()).isEmpty()); - errorLines = bodyInnerText(viewDE.data()).split(QRegExp("[\r\n]"), QString::SkipEmptyParts); + QTRY_VERIFY(!evaluateJavaScriptSync(viewDE.data(), "document.body.innerText").isNull()); + errorLines = evaluateJavaScriptSync(viewDE.data(), "document.body.innerText").toString().split(QRegExp("[\r\n]"), QString::SkipEmptyParts); QCOMPARE(errorLines.first().toUtf8(), QByteArrayLiteral("Diese Website ist nicht erreichbar")); QLocale::setDefault(QLocale("en")); @@ -795,8 +795,8 @@ void tst_QQuickWebEngineView::changeLocale() viewEN->setUrl(url); QVERIFY(waitForLoadFailed(viewEN.data())); - QTRY_VERIFY(!bodyInnerText(viewEN.data()).isEmpty()); - errorLines = bodyInnerText(viewEN.data()).split(QRegExp("[\r\n]"), QString::SkipEmptyParts); + QTRY_VERIFY(!evaluateJavaScriptSync(viewEN.data(), "document.body.innerText").isNull()); + errorLines = evaluateJavaScriptSync(viewEN.data(), "document.body.innerText").toString().split(QRegExp("[\r\n]"), QString::SkipEmptyParts); QCOMPARE(errorLines.first().toUtf8(), QByteArrayLiteral("This site can\xE2\x80\x99t be reached")); // Reset error page @@ -807,8 +807,8 @@ void tst_QQuickWebEngineView::changeLocale() viewDE->setUrl(url); QVERIFY(waitForLoadFailed(viewDE.data())); - QTRY_VERIFY(!bodyInnerText(viewDE.data()).isEmpty()); - errorLines = bodyInnerText(viewDE.data()).split(QRegExp("[\r\n]"), QString::SkipEmptyParts); + QTRY_VERIFY(!evaluateJavaScriptSync(viewDE.data(), "document.body.innerText").isNull()); + errorLines = evaluateJavaScriptSync(viewDE.data(), "document.body.innerText").toString().split(QRegExp("[\r\n]"), QString::SkipEmptyParts); QCOMPARE(errorLines.first().toUtf8(), QByteArrayLiteral("Diese Website ist nicht erreichbar")); } diff --git a/tests/auto/quick/shared/util.h b/tests/auto/quick/shared/util.h index 8e7169be7..619a02d67 100644 --- a/tests/auto/quick/shared/util.h +++ b/tests/auto/quick/shared/util.h @@ -30,6 +30,7 @@ #define UTIL_H #include +#include #include #include #include @@ -120,103 +121,43 @@ inline bool waitForViewportReady(QQuickWebEngineView *webEngineView, int timeout #endif } -inline QString bodyInnerText(QQuickWebEngineView *webEngineView) +inline QVariant evaluateJavaScriptSync(QQuickWebEngineView *view, const QString &script) { - qRegisterMetaType("JavaScriptConsoleMessageLevel"); - QSignalSpy consoleMessageSpy(webEngineView, &QQuickWebEngineView::javaScriptConsoleMessage); - - webEngineView->runJavaScript( - "if (document.body == null)" - " console.log('');" - "else" - " console.log(document.body.innerText);" - ); - - if (!consoleMessageSpy.wait()) - return QString(); - - QList arguments = consoleMessageSpy.takeFirst(); - if (static_cast(arguments.at(0).toInt()) != QQuickWebEngineView::InfoMessageLevel) - return QString(); - - return arguments.at(1).toString(); -} - -inline QString activeElementId(QQuickWebEngineView *webEngineView) -{ - qRegisterMetaType("JavaScriptConsoleMessageLevel"); - QSignalSpy consoleMessageSpy(webEngineView, &QQuickWebEngineView::javaScriptConsoleMessage); - - webEngineView->runJavaScript( - "if (document.activeElement == null)" - " console.log('');" - "else" - " console.log(document.activeElement.id);" - ); - - if (!consoleMessageSpy.wait()) - return QString(); - - QList arguments = consoleMessageSpy.takeFirst(); - if (static_cast(arguments.at(0).toInt()) != QQuickWebEngineView::InfoMessageLevel) - return QString(); - - return arguments.at(1).toString(); -} - -inline QString elementValue(QQuickWebEngineView *webEngineView, const QString &id) -{ - qRegisterMetaType("JavaScriptConsoleMessageLevel"); - QSignalSpy consoleMessageSpy(webEngineView, &QQuickWebEngineView::javaScriptConsoleMessage); - - webEngineView->runJavaScript(QString( - "var element = document.getElementById('" + id + "');" - "if (element == null)" - " console.log('');" - "else" - " console.log(element.value);") - ); - - if (!consoleMessageSpy.wait()) - return QString(); - - QList arguments = consoleMessageSpy.takeFirst(); - if (static_cast(arguments.at(0).toInt()) != QQuickWebEngineView::InfoMessageLevel) - return QString(); + QQmlEngine *engine = qmlEngine(view); + engine->globalObject().setProperty("called", false); + engine->globalObject().setProperty("result", QJSValue()); + QJSValue callback = engine->evaluate( + "(function callback(r) {" + " called = true;" + " result = r;" + "})" + ); + view->runJavaScript(script, callback); + QTRY_LOOP_IMPL(engine->globalObject().property("called").toBool(), 5000, 50); + if (!engine->globalObject().property("called").toBool()) { + qWarning("JavaScript wasn't evaluated"); + return QVariant(); + } - return arguments.at(1).toString(); + return engine->globalObject().property("result").toVariant(); } -inline QPoint elementCenter(QQuickWebEngineView *webEngineView, const QString &id) +inline QPoint elementCenter(QQuickWebEngineView *view, const QString &id) { - qRegisterMetaType("JavaScriptConsoleMessageLevel"); - QSignalSpy consoleMessageSpy(webEngineView, &QQuickWebEngineView::javaScriptConsoleMessage); - - webEngineView->runJavaScript(QString( - "var element = document.getElementById('" + id + "');" - "var rect = element.getBoundingClientRect();" - "console.log((rect.left + rect.right) / 2);" - "console.log((rect.top + rect.bottom) / 2);") - ); - - QTRY_LOOP_IMPL(consoleMessageSpy.count() == 2, 5000, 50); - if (consoleMessageSpy.count() != 2) + const QString jsCode( + "(function(){" + " var elem = document.getElementById('" + id + "');" + " var rect = elem.getBoundingClientRect();" + " return [(rect.left + rect.right) / 2, (rect.top + rect.bottom) / 2];" + "})()"); + QVariantList rectList = evaluateJavaScriptSync(view, jsCode).toList(); + + if (rectList.count() != 2) { + qWarning("elementCenter failed."); return QPoint(); + } - QList arguments; - double x, y; - - arguments = consoleMessageSpy.takeFirst(); - if (static_cast(arguments.at(0).toInt()) != QQuickWebEngineView::InfoMessageLevel) - return QPoint(); - x = arguments.at(1).toDouble(); - - arguments = consoleMessageSpy.takeLast(); - if (static_cast(arguments.at(0).toInt()) != QQuickWebEngineView::InfoMessageLevel) - return QPoint(); - y = arguments.at(1).toDouble(); - - return QPoint(x, y); + return QPoint(rectList.at(0).toInt(), rectList.at(1).toInt()); } #endif /* UTIL_H */ -- cgit v1.2.3