From a8666bc741c72b6b21dc0993d83919947cc17575 Mon Sep 17 00:00:00 2001
From: Peter Varga <pvarga@inf.u-szeged.hu>
Date: Tue, 19 Sep 2017 14:20:19 +0200
Subject: [PATCH] Refactor tst_qquickwebengineview auto test

Pass JavaScript result via callback instead of using console.log.

Change-Id: Ie464f038d4fa778b1f64e95eca58e86e29184c1e
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
---
 .../tst_qquickwebengineview.cpp               |  20 +--
 tests/auto/quick/shared/util.h                | 121 +++++-------------
 2 files changed, 41 insertions(+), 100 deletions(-)

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<QQuickItem *>(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<QQuickItem *>(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 <QEventLoop>
+#include <QQmlEngine>
 #include <QSignalSpy>
 #include <QTimer>
 #include <QtTest/QtTest>
@@ -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<QQuickWebEngineView::JavaScriptConsoleMessageLevel>("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<QVariant> arguments = consoleMessageSpy.takeFirst();
-    if (static_cast<QQuickWebEngineView::JavaScriptConsoleMessageLevel>(arguments.at(0).toInt()) != QQuickWebEngineView::InfoMessageLevel)
-        return QString();
-
-    return arguments.at(1).toString();
-}
-
-inline QString activeElementId(QQuickWebEngineView *webEngineView)
-{
-    qRegisterMetaType<QQuickWebEngineView::JavaScriptConsoleMessageLevel>("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<QVariant> arguments = consoleMessageSpy.takeFirst();
-    if (static_cast<QQuickWebEngineView::JavaScriptConsoleMessageLevel>(arguments.at(0).toInt()) != QQuickWebEngineView::InfoMessageLevel)
-        return QString();
-
-    return arguments.at(1).toString();
-}
-
-inline QString elementValue(QQuickWebEngineView *webEngineView, const QString &id)
-{
-    qRegisterMetaType<QQuickWebEngineView::JavaScriptConsoleMessageLevel>("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<QVariant> arguments = consoleMessageSpy.takeFirst();
-    if (static_cast<QQuickWebEngineView::JavaScriptConsoleMessageLevel>(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<QQuickWebEngineView::JavaScriptConsoleMessageLevel>("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<QVariant> arguments;
-    double x, y;
-
-    arguments = consoleMessageSpy.takeFirst();
-    if (static_cast<QQuickWebEngineView::JavaScriptConsoleMessageLevel>(arguments.at(0).toInt()) != QQuickWebEngineView::InfoMessageLevel)
-        return QPoint();
-    x = arguments.at(1).toDouble();
-
-    arguments = consoleMessageSpy.takeLast();
-    if (static_cast<QQuickWebEngineView::JavaScriptConsoleMessageLevel>(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 */
-- 
GitLab