[Qt] Make it possible to build without QtQuick
[WebKit-https.git] / Source / WebKit2 / UIProcess / API / qt / tests / util.cpp
1 /*
2     Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies)
3
4     This library is free software; you can redistribute it and/or
5     modify it under the terms of the GNU Library General Public
6     License as published by the Free Software Foundation; either
7     version 2 of the License, or (at your option) any later version.
8
9     This library is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12     Library General Public License for more details.
13
14     You should have received a copy of the GNU Library General Public License
15     along with this library; see the file COPYING.LIB.  If not, write to
16     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17     Boston, MA 02110-1301, USA.
18 */
19
20 #include "util.h"
21
22 #include <QtTest/QtTest>
23 #include <stdio.h>
24
25 #if defined(HAVE_QTQUICK) && HAVE_QTQUICK
26 #include "private/qquickwebview_p.h"
27 #include "private/qwebloadrequest_p.h"
28 #endif
29
30 void addQtWebProcessToPath()
31 {
32     // Since tests won't find ./QtWebProcess, add it to PATH (at the end to prevent surprises).
33     // QWP_PATH should be defined by qmake.
34     qputenv("PATH", qgetenv("PATH") + ":" + QWP_PATH);
35 }
36
37 /**
38  * Starts an event loop that runs until the given signal is received.
39  * Optionally the event loop
40  * can return earlier on a timeout.
41  *
42  * \return \p true if the requested signal was received
43  *         \p false on timeout
44  */
45 bool waitForSignal(QObject* obj, const char* signal, int timeout)
46 {
47     QEventLoop loop;
48     QObject::connect(obj, signal, &loop, SLOT(quit()));
49     QTimer timer;
50     QSignalSpy timeoutSpy(&timer, SIGNAL(timeout()));
51     if (timeout > 0) {
52         QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
53         timer.setSingleShot(true);
54         timer.start(timeout);
55     }
56     loop.exec();
57     return timeoutSpy.isEmpty();
58 }
59
60 #if defined(HAVE_QTQUICK) && HAVE_QTQUICK
61 class LoadSpy : public QEventLoop {
62     Q_OBJECT
63 public:
64     LoadSpy(QQuickWebView* webView)
65     {
66         connect(webView, SIGNAL(loadingChanged(QWebLoadRequest*)), SLOT(onLoadingChanged(QWebLoadRequest*)));
67     }
68 signals:
69     void loadSucceeded();
70     void loadFailed();
71 private slots:
72     void onLoadingChanged(QWebLoadRequest* loadRequest)
73     {
74         if (loadRequest->status() == QQuickWebView::LoadSucceededStatus)
75             emit loadSucceeded();
76         else if (loadRequest->status() == QQuickWebView::LoadFailedStatus)
77             emit loadFailed();
78     }
79 };
80
81 bool waitForLoadSucceeded(QQuickWebView* webView, int timeout)
82 {
83     QEventLoop loop;
84     LoadSpy loadSpy(webView);
85     QObject::connect(&loadSpy, SIGNAL(loadSucceeded()), &loop, SLOT(quit()));
86     QTimer timer;
87     QSignalSpy timeoutSpy(&timer, SIGNAL(timeout()));
88     if (timeout > 0) {
89         QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
90         timer.setSingleShot(true);
91         timer.start(timeout);
92     }
93     loop.exec();
94     return timeoutSpy.isEmpty();
95 }
96
97 bool waitForLoadFailed(QQuickWebView* webView, int timeout)
98 {
99     QEventLoop loop;
100     LoadSpy loadSpy(webView);
101     QObject::connect(&loadSpy, SIGNAL(loadFailed()), &loop, SLOT(quit()));
102     QTimer timer;
103     QSignalSpy timeoutSpy(&timer, SIGNAL(timeout()));
104     if (timeout > 0) {
105         QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
106         timer.setSingleShot(true);
107         timer.start(timeout);
108     }
109     loop.exec();
110     return timeoutSpy.isEmpty();
111 }
112
113 static void messageHandler(QtMsgType type, const char* message)
114 {
115     if (type == QtCriticalMsg) {
116         fprintf(stderr, "%s\n", message);
117         return;
118     }
119     // Do nothing
120 }
121
122 void suppressDebugOutput()
123 {
124     qInstallMsgHandler(messageHandler); \
125     if (qgetenv("QT_WEBKIT_SUPPRESS_WEB_PROCESS_OUTPUT").isEmpty()) \
126         qputenv("QT_WEBKIT_SUPPRESS_WEB_PROCESS_OUTPUT", "1");
127 }
128
129
130 LoadStartedCatcher::LoadStartedCatcher(QQuickWebView* webView)
131     : m_webView(webView)
132 {
133     connect(m_webView, SIGNAL(loadingChanged(QWebLoadRequest*)), this, SLOT(onLoadingChanged(QWebLoadRequest*)));
134 }
135
136 void LoadStartedCatcher::onLoadingChanged(QWebLoadRequest* loadRequest)
137 {
138     if (loadRequest->status() == QQuickWebView::LoadStartedStatus) {
139         QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection);
140
141         QCOMPARE(m_webView->loading(), true);
142     }
143 }
144 #endif
145
146 #include "util.moc"