main.cpp revision cad810f21b803229eb11403f9209855525a25d57
1/*
2 * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
3 * Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in>
4 * Copyright (C) 2006 George Staikos <staikos@kde.org>
5 * Copyright (C) 2006 Dirk Mueller <mueller@kde.org>
6 * Copyright (C) 2006 Zack Rusin <zack@kde.org>
7 * Copyright (C) 2006 Simon Hausmann <hausmann@kde.org>
8 *
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 *    notice, this list of conditions and the following disclaimer in the
18 *    documentation and/or other materials provided with the distribution.
19 *
20 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
21 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
28 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33#include "launcherwindow.h"
34#include "urlloader.h"
35
36WindowOptions windowOptions;
37
38int launcherMain(const QApplication& app)
39{
40#ifndef NDEBUG
41    int retVal = app.exec();
42    DumpRenderTreeSupportQt::garbageCollectorCollect();
43    QWebSettings::clearMemoryCaches();
44    return retVal;
45#else
46    return app.exec();
47#endif
48}
49
50class LauncherApplication : public QApplication {
51    Q_OBJECT
52
53public:
54    LauncherApplication(int& argc, char** argv);
55    QStringList urls() const { return m_urls; }
56    bool isRobotized() const { return m_isRobotized; }
57    int robotTimeout() const { return m_robotTimeoutSeconds; }
58    int robotExtraTime() const { return m_robotExtraTimeSeconds; }
59
60private:
61    void handleUserOptions();
62    void applyDefaultSettings();
63
64private:
65    bool m_isRobotized;
66    int m_robotTimeoutSeconds;
67    int m_robotExtraTimeSeconds;
68    QStringList m_urls;
69};
70
71void LauncherApplication::applyDefaultSettings()
72{
73    QWebSettings::setMaximumPagesInCache(4);
74
75    QWebSettings::setObjectCacheCapacities((16*1024*1024) / 8, (16*1024*1024) / 8, 16*1024*1024);
76
77    QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled, true);
78    QWebSettings::globalSettings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
79    QWebSettings::enablePersistentStorage();
80}
81
82LauncherApplication::LauncherApplication(int& argc, char** argv)
83    : QApplication(argc, argv, QApplication::GuiServer)
84    , m_isRobotized(false)
85    , m_robotTimeoutSeconds(0)
86    , m_robotExtraTimeSeconds(0)
87{
88    // To allow QWebInspector's configuration persistence
89    setOrganizationName("Nokia");
90    setApplicationName("QtTestBrowser");
91    setApplicationVersion("0.1");
92
93    applyDefaultSettings();
94
95    handleUserOptions();
96}
97
98static void requiresGraphicsView(const QString& option)
99{
100    if (windowOptions.useGraphicsView)
101        return;
102    appQuit(1, QString("%1 only works in combination with the -graphicsbased option").arg(option));
103}
104
105void LauncherApplication::handleUserOptions()
106{
107    QStringList args = arguments();
108    QFileInfo program(args.at(0));
109    QString programName("QtTestBrowser");
110    if (program.exists())
111        programName = program.baseName();
112
113    QList<QString> updateModes(enumToKeys(QGraphicsView::staticMetaObject,
114            "ViewportUpdateMode", "ViewportUpdate"));
115
116    if (args.contains("-help")) {
117        qDebug() << "Usage:" << programName.toLatin1().data()
118             << "[-graphicsbased]"
119             << "[-no-compositing]"
120             << QString("[-viewport-update-mode %1]").arg(formatKeys(updateModes)).toLatin1().data()
121             << "[-cache-webview]"
122             << "[-show-fps]"
123             << "[-r list]"
124             << "[-robot-timeout seconds]"
125             << "[-robot-extra-time seconds]"
126             << "[-inspector-url location]"
127             << "[-tiled-backing-store]"
128             << "[-resizes-to-contents]"
129             << "[-local-storage-enabled]"
130             << "[-offline-storage-database-enabled]"
131             << "[-offline-web-application-cache-enabled]"
132             << "[-set-offline-storage-default-quota maxSize]"
133             << "URLs";
134        appQuit(0);
135    }
136
137    const bool defaultForAnimations = args.contains("-default-animations");
138    if (args.contains("-graphicsbased") || defaultForAnimations)
139        windowOptions.useGraphicsView = true;
140
141    if (args.contains("-no-compositing")) {
142        requiresGraphicsView("-no-compositing");
143        windowOptions.useCompositing = false;
144    }
145
146    if (args.contains("-show-fps")) {
147        requiresGraphicsView("-show-fps");
148        windowOptions.showFrameRate = true;
149    }
150
151    if (args.contains("-cache-webview") || defaultForAnimations) {
152        requiresGraphicsView("-cache-webview");
153        windowOptions.cacheWebView = true;
154    }
155
156    if (args.contains("-tiled-backing-store")) {
157        requiresGraphicsView("-tiled-backing-store");
158        windowOptions.useTiledBackingStore = true;
159    }
160
161    if (args.contains("-resizes-to-contents")) {
162        requiresGraphicsView("-resizes-to-contents");
163        windowOptions.resizesToContents = true;
164    }
165
166    if (args.contains("-local-storage-enabled"))
167        QWebSettings::globalSettings()->setAttribute(QWebSettings::LocalStorageEnabled, true);
168
169    if (args.contains("-offline-storage-database-enabled"))
170        QWebSettings::globalSettings()->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, true);
171
172    if (args.contains("-offline-web-application-cache-enabled"))
173        QWebSettings::globalSettings()->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled, true);
174
175    int setOfflineStorageDefaultQuotaIndex = args.indexOf("-set-offline-storage-default-quota");
176    if (setOfflineStorageDefaultQuotaIndex != -1) {
177        int maxSize = takeOptionValue(&args, setOfflineStorageDefaultQuotaIndex).toInt();
178        QWebSettings::globalSettings()->setOfflineStorageDefaultQuota(maxSize);
179    }
180
181    if (defaultForAnimations)
182        windowOptions.viewportUpdateMode = QGraphicsView::BoundingRectViewportUpdate;
183
184    QString arg1("-viewport-update-mode");
185    int modeIndex = args.indexOf(arg1);
186    if (modeIndex != -1) {
187        requiresGraphicsView(arg1);
188
189        QString mode = takeOptionValue(&args, modeIndex);
190        if (mode.isEmpty())
191            appQuit(1, QString("%1 needs a value of one of [%2]").arg(arg1).arg(formatKeys(updateModes)));
192        int idx = updateModes.indexOf(mode);
193        if (idx == -1)
194            appQuit(1, QString("%1 value has to be one of [%2]").arg(arg1).arg(formatKeys(updateModes)));
195
196        windowOptions.viewportUpdateMode = static_cast<QGraphicsView::ViewportUpdateMode>(idx);
197    }
198#ifdef QT_CONFIGURED_WITH_OPENGL
199    if (args.contains("-gl-viewport") || defaultForAnimations) {
200        requiresGraphicsView("-gl-viewport");
201        windowOptions.useQGLWidgetViewport = true;
202    }
203#endif
204
205    QString inspectorUrlArg("-inspector-url");
206    int inspectorUrlIndex = args.indexOf(inspectorUrlArg);
207    if (inspectorUrlIndex != -1)
208       windowOptions.inspectorUrl = takeOptionValue(&args, inspectorUrlIndex);
209
210    QString remoteInspectorPortArg("-remote-inspector-port");
211    int remoteInspectorPortIndex = args.indexOf(remoteInspectorPortArg);
212    if (remoteInspectorPortIndex != -1)
213        windowOptions.remoteInspectorPort = takeOptionValue(&args, remoteInspectorPortIndex).toInt();
214
215    int robotIndex = args.indexOf("-r");
216    if (robotIndex != -1) {
217        QString listFile = takeOptionValue(&args, robotIndex);
218        if (listFile.isEmpty())
219            appQuit(1, "-r needs a list file to start in robotized mode");
220        if (!QFile::exists(listFile))
221            appQuit(1, "The list file supplied to -r does not exist.");
222
223        m_isRobotized = true;
224        m_urls = QStringList(listFile);
225    } else {
226        int lastArg = args.lastIndexOf(QRegExp("^-.*"));
227        m_urls = (lastArg != -1) ? args.mid(++lastArg) : args.mid(1);
228    }
229
230    int robotTimeoutIndex = args.indexOf("-robot-timeout");
231    if (robotTimeoutIndex != -1)
232        m_robotTimeoutSeconds = takeOptionValue(&args, robotTimeoutIndex).toInt();
233
234    int robotExtraTimeIndex = args.indexOf("-robot-extra-time");
235    if (robotExtraTimeIndex != -1)
236        m_robotExtraTimeSeconds = takeOptionValue(&args, robotExtraTimeIndex).toInt();
237}
238
239
240int main(int argc, char **argv)
241{
242    LauncherApplication app(argc, argv);
243
244    if (app.isRobotized()) {
245        LauncherWindow* window = new LauncherWindow();
246        UrlLoader loader(window->page()->mainFrame(), app.urls().at(0), app.robotTimeout(), app.robotExtraTime());
247        loader.loadNext();
248        window->show();
249        return launcherMain(app);
250    }
251
252    QStringList urls = app.urls();
253
254    if (urls.isEmpty()) {
255        QString defaultIndexFile = QString("%1/%2").arg(QDir::homePath()).arg(QLatin1String("index.html"));
256        if (QFile(defaultIndexFile).exists())
257            urls.append(QString("file://") + defaultIndexFile);
258        else
259            urls.append("");
260    }
261
262    LauncherWindow* window = 0;
263    foreach (QString url, urls) {
264        LauncherWindow* newWindow;
265        if (!window)
266            newWindow = window = new LauncherWindow(&windowOptions);
267        else
268            newWindow = window->newWindow();
269
270        newWindow->load(url);
271    }
272
273    window->show();
274    return launcherMain(app);
275}
276
277#include "main.moc"
278