tst_inspectorserver.cpp [plain text]
#include "../testwindow.h"
#include "../util.h"
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QScopedPointer>
#include <QtQml/QQmlEngine>
#include <QtTest/QtTest>
#include <private/qquickwebview_p.h>
#include <private/qwebpreferences_p.h>
#define INSPECTOR_SERVER_PORT "23654"
static const QUrl s_inspectorServerHttpBaseUrl("http://localhost:" INSPECTOR_SERVER_PORT);
static const QUrl s_inspectorServerWebSocketBaseUrl("ws://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 QQuickWebView* newWebView();
inline QQuickWebView* webView() const;
QJsonArray fetchPageList() const;
QScopedPointer<TestWindow> m_window;
QScopedPointer<QQmlComponent> m_component;
};
tst_InspectorServer::tst_InspectorServer()
{
qputenv("QTWEBKIT_INSPECTOR_SERVER", INSPECTOR_SERVER_PORT);
addQtWebProcessToPath();
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 QtWebKit 3.0\n"
"WebView {}")
, QUrl());
}
QQuickWebView* tst_InspectorServer::newWebView()
{
QObject* viewInstance = m_component->create();
return qobject_cast<QQuickWebView*>(viewInstance);
}
void tst_InspectorServer::init()
{
m_window.reset(new TestWindow(newWebView()));
webView()->experimental()->preferences()->setDeveloperExtrasEnabled(true);
}
void tst_InspectorServer::cleanup()
{
m_window.reset();
}
inline QQuickWebView* tst_InspectorServer::webView() const
{
return static_cast<QQuickWebView*>(m_window->webView.data());
}
QJsonArray tst_InspectorServer::fetchPageList() const
{
QNetworkAccessManager qnam;
QScopedPointer<QNetworkReply> reply(qnam.get(QNetworkRequest(s_inspectorServerHttpBaseUrl.resolved(QUrl("pagelist.json")))));
waitForSignal(reply.data(), SIGNAL(finished()));
return QJsonDocument::fromJson(reply->readAll()).array();
}
void tst_InspectorServer::testPageList()
{
QUrl testPageUrl = QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "/html/basic_page.html"));
LoadStartedCatcher catcher(webView());
webView()->setUrl(testPageUrl);
waitForSignal(&catcher, SIGNAL(finished()));
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);
QLatin1String jsExpression("2 + 2");
QLatin1String jsExpressionResult("4");
QScopedPointer<QQuickWebView> webSocketQueryWebView(newWebView());
webSocketQueryWebView->loadHtml(QString(
"<script type=\"text/javascript\">\n"
"var socket = new WebSocket('%1/devtools/page/%2');\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\": \"%3\" } }');\n"
"}\n"
"</script>")
.arg(s_inspectorServerWebSocketBaseUrl.toString())
.arg(pageList.at(0).toObject().value("id").toDouble())
.arg(jsExpression));
for (int i = 0; i < 10; ++i) {
if (!webSocketQueryWebView->title().isEmpty())
break;
waitForSignal(webSocketQueryWebView.data(), SIGNAL(titleChanged()), 500);
}
QCOMPARE(webSocketQueryWebView->title(), jsExpressionResult);
}
void tst_InspectorServer::openRemoteDebuggingSession()
{
QJsonArray pageList = fetchPageList();
QCOMPARE(pageList.size(), 1);
QScopedPointer<QQuickWebView> inspectorWebView(newWebView());
LoadStartedCatcher catcher2(inspectorWebView.data());
inspectorWebView->setUrl(s_inspectorServerHttpBaseUrl.resolved(QUrl(pageList.at(0).toObject().value("inspectorUrl").toString())));
waitForSignal(&catcher2, SIGNAL(finished()));
for (int i = 0; i < 10; ++i) {
if (!inspectorWebView->title().isEmpty())
break;
waitForSignal(inspectorWebView.data(), SIGNAL(titleChanged()), 500);
}
QVERIFY(!inspectorWebView->title().isEmpty());
}
QTEST_MAIN(tst_InspectorServer)
#include "tst_inspectorserver.moc"