summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJocelyn Turcotte <jocelyn.turcotte@digia.com>2014-11-17 12:03:00 +0100
committerJocelyn Turcotte <jocelyn.turcotte@digia.com>2015-01-22 16:22:19 +0100
commitb6c905a0616f3ed22e553171ad4f5667c1250941 (patch)
tree8e21c0bf80886dfb815d9ef7756760195c81180f
parent35630628d927d95bd5b7a8720e982294e7281b15 (diff)
Import the inspectorserver auto test from qtwebkit
The command interface is still similar to the remote inspector in WebKit2, the JSON page list information is slightly different. Change-Id: I85e6bd665efe9ba487622ec0f5c2e66669526888 Reviewed-by: Andras Becsi <andras.becsi@theqtcompany.com>
-rw-r--r--tests/auto/quick/inspectorserver/inspectorserver.pro4
-rw-r--r--tests/auto/quick/inspectorserver/tst_inspectorserver.cpp186
-rw-r--r--tests/auto/quick/quick.pro1
3 files changed, 191 insertions, 0 deletions
diff --git a/tests/auto/quick/inspectorserver/inspectorserver.pro b/tests/auto/quick/inspectorserver/inspectorserver.pro
new file mode 100644
index 000000000..1a2c2f053
--- /dev/null
+++ b/tests/auto/quick/inspectorserver/inspectorserver.pro
@@ -0,0 +1,4 @@
+include(../tests.pri)
+QT += webengine
+QT_PRIVATE += webengine-private
+DEFINES += IMPORT_DIR=\"\\\"$${ROOT_BUILD_DIR}$${QMAKE_DIR_SEP}imports\\\"\"
diff --git a/tests/auto/quick/inspectorserver/tst_inspectorserver.cpp b/tests/auto/quick/inspectorserver/tst_inspectorserver.cpp
new file mode 100644
index 000000000..827f1a3c5
--- /dev/null
+++ b/tests/auto/quick/inspectorserver/tst_inspectorserver.cpp
@@ -0,0 +1,186 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QNetworkAccessManager>
+#include <QNetworkReply>
+#include <QNetworkRequest>
+#include <QScopedPointer>
+#include <QtQml/QQmlEngine>
+#include <QtTest/QtTest>
+#include <private/qquickwebengineview_p.h>
+
+#define INSPECTOR_SERVER_PORT "23654"
+static const QUrl s_inspectorServerHttpBaseUrl("http://localhost:" INSPECTOR_SERVER_PORT);
+
+class tst_InspectorServer : public QObject {
+ Q_OBJECT
+public:
+ tst_InspectorServer();
+
+private Q_SLOTS:
+ void init();
+ void cleanup();
+
+ void testPageList();
+ void testRemoteDebuggingMessage();
+ void openRemoteDebuggingSession();
+private:
+ void prepareWebViewComponent();
+ inline QQuickWebEngineView* newWebView();
+ inline QQuickWebEngineView* webView() const;
+ QJsonArray fetchPageList() const;
+ QScopedPointer<QQuickWebEngineView> m_webView;
+ QScopedPointer<QQmlComponent> m_component;
+};
+
+tst_InspectorServer::tst_InspectorServer()
+{
+ qputenv("QTWEBENGINE_REMOTE_DEBUGGING", INSPECTOR_SERVER_PORT);
+ QtWebEngine::initialize();
+ prepareWebViewComponent();
+}
+
+void tst_InspectorServer::prepareWebViewComponent()
+{
+ static QQmlEngine* engine = new QQmlEngine(this);
+ engine->addImportPath(QString::fromUtf8(IMPORT_DIR));
+
+ m_component.reset(new QQmlComponent(engine, this));
+
+ m_component->setData(QByteArrayLiteral("import QtQuick 2.0\n"
+ "import QtWebEngine 1.0\n"
+ "WebEngineView { }")
+ , QUrl());
+}
+
+QQuickWebEngineView* tst_InspectorServer::newWebView()
+{
+ QObject* viewInstance = m_component->create();
+
+ return qobject_cast<QQuickWebEngineView*>(viewInstance);
+}
+
+void tst_InspectorServer::init()
+{
+ m_webView.reset(newWebView());
+}
+
+void tst_InspectorServer::cleanup()
+{
+ m_webView.reset();
+}
+
+inline QQuickWebEngineView* tst_InspectorServer::webView() const
+{
+ return m_webView.data();
+}
+
+QJsonArray tst_InspectorServer::fetchPageList() const
+{
+ QNetworkAccessManager qnam;
+ QScopedPointer<QNetworkReply> reply(qnam.get(QNetworkRequest(s_inspectorServerHttpBaseUrl.resolved(QUrl("json/list")))));
+ QSignalSpy(reply.data(), SIGNAL(finished())).wait();
+ return QJsonDocument::fromJson(reply->readAll()).array();
+}
+
+void tst_InspectorServer::testPageList()
+{
+ const QUrl testPageUrl = QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "/html/basic_page.html"));
+ QSignalSpy loadSpy(webView(), SIGNAL(loadingChanged(QQuickWebEngineLoadRequest*)));
+ webView()->setUrl(testPageUrl);
+ QTRY_VERIFY(loadSpy.size() && !webView()->isLoading());
+
+ // Our page has developerExtrasEnabled and should be the only one in the list.
+ QJsonArray pageList = fetchPageList();
+ QCOMPARE(pageList.size(), 1);
+ QCOMPARE(testPageUrl.toString(), pageList.at(0).toObject().value("url").toString());
+}
+
+void tst_InspectorServer::testRemoteDebuggingMessage()
+{
+ QJsonArray pageList = fetchPageList();
+ QCOMPARE(pageList.size(), 1);
+ QVERIFY(pageList.at(0).toObject().contains("webSocketDebuggerUrl"));
+
+ // Test sending a raw remote debugging message through our web socket server.
+ // For this specific message see: http://code.google.com/chrome/devtools/docs/protocol/tot/runtime.html#command-evaluate
+ QLatin1String jsExpression("2 + 2");
+ QLatin1String jsExpressionResult("4");
+ QScopedPointer<QQuickWebEngineView> webSocketQueryWebView(newWebView());
+ webSocketQueryWebView->loadHtml(QString(
+ "<script type=\"text/javascript\">\n"
+ "var socket = new WebSocket('%1');\n"
+ "socket.onmessage = function(message) {\n"
+ "var response = JSON.parse(message.data);\n"
+ "if (response.id === 1)\n"
+ "document.title = response.result.result.value;\n"
+ "}\n"
+ "socket.onopen = function() {\n"
+ "socket.send('{\"id\": 1, \"method\": \"Runtime.evaluate\", \"params\": {\"expression\": \"%2\" } }');\n"
+ "}\n"
+ "</script>")
+ .arg(pageList.at(0).toObject().value("webSocketDebuggerUrl").toString())
+ .arg(jsExpression));
+
+ QTRY_COMPARE(webSocketQueryWebView->title(), jsExpressionResult);
+}
+
+void tst_InspectorServer::openRemoteDebuggingSession()
+{
+ QJsonArray pageList = fetchPageList();
+ QCOMPARE(pageList.size(), 1);
+ QVERIFY(pageList.at(0).toObject().contains("devtoolsFrontendUrl"));
+
+ QScopedPointer<QQuickWebEngineView> inspectorWebView(newWebView());
+ inspectorWebView->setUrl(s_inspectorServerHttpBaseUrl.resolved(QUrl(pageList.at(0).toObject().value("devtoolsFrontendUrl").toString())));
+
+ // To test the whole pipeline this exploits a behavior of the inspector front-end which won't provide any title unless the
+ // debugging session was established correctly through web socket.
+ // So this test case will fail if:
+ // - The page list didn't return a valid inspector URL
+ // - Or the front-end couldn't be loaded through the inspector HTTP server
+ // - Or the web socket connection couldn't be established between the front-end and the page through the inspector server
+ QTRY_VERIFY(inspectorWebView->title().startsWith("Developer Tools -"));
+}
+
+QTEST_MAIN(tst_InspectorServer)
+
+#include "tst_inspectorserver.moc"
diff --git a/tests/auto/quick/quick.pro b/tests/auto/quick/quick.pro
index 5c9bb72b5..71bc61b9e 100644
--- a/tests/auto/quick/quick.pro
+++ b/tests/auto/quick/quick.pro
@@ -1,6 +1,7 @@
TEMPLATE = subdirs
SUBDIRS += \
+ inspectorserver \
publicapi \
qmltests \
qquickwebengineview \