1d0825bca7fe65beaee391d30da42e937db621564Steve Block/*
2d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
3d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in>
4d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2006 George Staikos <staikos@kde.org>
5d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2006 Dirk Mueller <mueller@kde.org>
6d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2006 Zack Rusin <zack@kde.org>
7d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2006 Simon Hausmann <hausmann@kde.org>
8d0825bca7fe65beaee391d30da42e937db621564Steve Block *
9d0825bca7fe65beaee391d30da42e937db621564Steve Block * All rights reserved.
10d0825bca7fe65beaee391d30da42e937db621564Steve Block *
11d0825bca7fe65beaee391d30da42e937db621564Steve Block * Redistribution and use in source and binary forms, with or without
12d0825bca7fe65beaee391d30da42e937db621564Steve Block * modification, are permitted provided that the following conditions
13d0825bca7fe65beaee391d30da42e937db621564Steve Block * are met:
14d0825bca7fe65beaee391d30da42e937db621564Steve Block * 1. Redistributions of source code must retain the above copyright
15d0825bca7fe65beaee391d30da42e937db621564Steve Block *    notice, this list of conditions and the following disclaimer.
16d0825bca7fe65beaee391d30da42e937db621564Steve Block * 2. Redistributions in binary form must reproduce the above copyright
17d0825bca7fe65beaee391d30da42e937db621564Steve Block *    notice, this list of conditions and the following disclaimer in the
18d0825bca7fe65beaee391d30da42e937db621564Steve Block *    documentation and/or other materials provided with the distribution.
19d0825bca7fe65beaee391d30da42e937db621564Steve Block *
20d0825bca7fe65beaee391d30da42e937db621564Steve Block * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
21d0825bca7fe65beaee391d30da42e937db621564Steve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22d0825bca7fe65beaee391d30da42e937db621564Steve Block * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23d0825bca7fe65beaee391d30da42e937db621564Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
24d0825bca7fe65beaee391d30da42e937db621564Steve Block * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25d0825bca7fe65beaee391d30da42e937db621564Steve Block * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26d0825bca7fe65beaee391d30da42e937db621564Steve Block * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27d0825bca7fe65beaee391d30da42e937db621564Steve Block * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
28d0825bca7fe65beaee391d30da42e937db621564Steve Block * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29d0825bca7fe65beaee391d30da42e937db621564Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30d0825bca7fe65beaee391d30da42e937db621564Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31d0825bca7fe65beaee391d30da42e937db621564Steve Block */
32d0825bca7fe65beaee391d30da42e937db621564Steve Block
33db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include "launcherwindow.h"
34d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "urlloader.h"
35d0825bca7fe65beaee391d30da42e937db621564Steve Block
36dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochWindowOptions windowOptions;
37dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
382bde8e466a4451c7319e3a072d118917957d6554Steve Block
392bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <QDir>
402bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <QFile>
412bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <QFileInfo>
422bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <QFontDatabase>
432bde8e466a4451c7319e3a072d118917957d6554Steve Block
442bde8e466a4451c7319e3a072d118917957d6554Steve Block
452bde8e466a4451c7319e3a072d118917957d6554Steve Block#if defined(Q_WS_X11)
462bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <fontconfig/fontconfig.h>
472bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
482bde8e466a4451c7319e3a072d118917957d6554Steve Block
492bde8e466a4451c7319e3a072d118917957d6554Steve Block
502bde8e466a4451c7319e3a072d118917957d6554Steve Block#if defined(Q_WS_X11)
512bde8e466a4451c7319e3a072d118917957d6554Steve Block// Very similar to WebCore::DumpRenderTree::initializeFonts();
522bde8e466a4451c7319e3a072d118917957d6554Steve Block// Duplicated here so that QtTestBrowser would display contents
532bde8e466a4451c7319e3a072d118917957d6554Steve Block// with the same fonts as run-webkit-tests/DumpRenderTree.
542bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic void initTestFonts()
552bde8e466a4451c7319e3a072d118917957d6554Steve Block{
562bde8e466a4451c7319e3a072d118917957d6554Steve Block    static int numFonts = -1;
572bde8e466a4451c7319e3a072d118917957d6554Steve Block
582bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Some test cases may add or remove application fonts (via @font-face).
592bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Make sure to re-initialize the font set if necessary.
602bde8e466a4451c7319e3a072d118917957d6554Steve Block    FcFontSet* appFontSet = FcConfigGetFonts(0, FcSetApplication);
612bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (appFontSet && numFonts >= 0 && appFontSet->nfont == numFonts)
622bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
632bde8e466a4451c7319e3a072d118917957d6554Steve Block
642bde8e466a4451c7319e3a072d118917957d6554Steve Block    QByteArray fontDir = getenv("WEBKIT_TESTFONTS");
652bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (fontDir.isEmpty() || !QDir(fontDir).exists()) {
662bde8e466a4451c7319e3a072d118917957d6554Steve Block        fprintf(stderr,
672bde8e466a4451c7319e3a072d118917957d6554Steve Block                "\n\n"
682bde8e466a4451c7319e3a072d118917957d6554Steve Block                "----------------------------------------------------------------------\n"
692bde8e466a4451c7319e3a072d118917957d6554Steve Block                "WEBKIT_TESTFONTS environment variable is not set correctly.\n"
702bde8e466a4451c7319e3a072d118917957d6554Steve Block                "This variable has to point to the directory containing the fonts\n"
712bde8e466a4451c7319e3a072d118917957d6554Steve Block                "you can clone from git://gitorious.org/qtwebkit/testfonts.git\n"
722bde8e466a4451c7319e3a072d118917957d6554Steve Block                "----------------------------------------------------------------------\n"
732bde8e466a4451c7319e3a072d118917957d6554Steve Block               );
742bde8e466a4451c7319e3a072d118917957d6554Steve Block        exit(1);
752bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
762bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Looks for qt/fonts.conf relative to the directory of the QtTestBrowser
772bde8e466a4451c7319e3a072d118917957d6554Steve Block    // executable.
782bde8e466a4451c7319e3a072d118917957d6554Steve Block    QString configFileString = QCoreApplication::applicationDirPath();
792bde8e466a4451c7319e3a072d118917957d6554Steve Block    configFileString += "/../../../Tools/DumpRenderTree/qt/fonts.conf";
802bde8e466a4451c7319e3a072d118917957d6554Steve Block    QByteArray configFileArray = configFileString.toUtf8();
812bde8e466a4451c7319e3a072d118917957d6554Steve Block    FcConfig* config = FcConfigCreate();
822bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!FcConfigParseAndLoad (config, (FcChar8*) configFileArray.data(), true))
832bde8e466a4451c7319e3a072d118917957d6554Steve Block        qFatal("Couldn't load font configuration file");
842bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!FcConfigAppFontAddDir (config, (FcChar8*) fontDir.data()))
852bde8e466a4451c7319e3a072d118917957d6554Steve Block        qFatal("Couldn't add font dir!");
862bde8e466a4451c7319e3a072d118917957d6554Steve Block    FcConfigSetCurrent(config);
872bde8e466a4451c7319e3a072d118917957d6554Steve Block
882bde8e466a4451c7319e3a072d118917957d6554Steve Block    appFontSet = FcConfigGetFonts(config, FcSetApplication);
892bde8e466a4451c7319e3a072d118917957d6554Steve Block    numFonts = appFontSet->nfont;
902bde8e466a4451c7319e3a072d118917957d6554Steve Block}
912bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
922bde8e466a4451c7319e3a072d118917957d6554Steve Block
93d0825bca7fe65beaee391d30da42e937db621564Steve Blockint launcherMain(const QApplication& app)
94d0825bca7fe65beaee391d30da42e937db621564Steve Block{
952bde8e466a4451c7319e3a072d118917957d6554Steve Block#ifdef Q_WS_X11
962bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (windowOptions.useTestFonts)
972bde8e466a4451c7319e3a072d118917957d6554Steve Block        initTestFonts();
982bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
992bde8e466a4451c7319e3a072d118917957d6554Steve Block
100d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifndef NDEBUG
101d0825bca7fe65beaee391d30da42e937db621564Steve Block    int retVal = app.exec();
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DumpRenderTreeSupportQt::garbageCollectorCollect();
103d0825bca7fe65beaee391d30da42e937db621564Steve Block    QWebSettings::clearMemoryCaches();
104d0825bca7fe65beaee391d30da42e937db621564Steve Block    return retVal;
105d0825bca7fe65beaee391d30da42e937db621564Steve Block#else
106d0825bca7fe65beaee391d30da42e937db621564Steve Block    return app.exec();
107d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
108d0825bca7fe65beaee391d30da42e937db621564Steve Block}
109d0825bca7fe65beaee391d30da42e937db621564Steve Block
1105e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockclass LauncherApplication : public QApplication {
1115e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    Q_OBJECT
112d0825bca7fe65beaee391d30da42e937db621564Steve Block
1135e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockpublic:
1145e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    LauncherApplication(int& argc, char** argv);
1155e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    QStringList urls() const { return m_urls; }
1165e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    bool isRobotized() const { return m_isRobotized; }
117bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    int robotTimeout() const { return m_robotTimeoutSeconds; }
118bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    int robotExtraTime() const { return m_robotExtraTimeSeconds; }
1195e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
1205e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockprivate:
1215e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    void handleUserOptions();
1225e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    void applyDefaultSettings();
123d0825bca7fe65beaee391d30da42e937db621564Steve Block
1245e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockprivate:
1255e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    bool m_isRobotized;
126bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    int m_robotTimeoutSeconds;
127bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    int m_robotExtraTimeSeconds;
1285e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    QStringList m_urls;
1295e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block};
1305e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
1315e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid LauncherApplication::applyDefaultSettings()
1325e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
1335e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    QWebSettings::setMaximumPagesInCache(4);
134d0825bca7fe65beaee391d30da42e937db621564Steve Block
135d0825bca7fe65beaee391d30da42e937db621564Steve Block    QWebSettings::setObjectCacheCapacities((16*1024*1024) / 8, (16*1024*1024) / 8, 16*1024*1024);
136d0825bca7fe65beaee391d30da42e937db621564Steve Block
137d0825bca7fe65beaee391d30da42e937db621564Steve Block    QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled, true);
138d0825bca7fe65beaee391d30da42e937db621564Steve Block    QWebSettings::globalSettings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
139d0825bca7fe65beaee391d30da42e937db621564Steve Block    QWebSettings::enablePersistentStorage();
1405e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block}
141d0825bca7fe65beaee391d30da42e937db621564Steve Block
1425e2bc6953fe6923165b8a5d7679939693a1d58d6Steve BlockLauncherApplication::LauncherApplication(int& argc, char** argv)
143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    : QApplication(argc, argv, QApplication::GuiServer)
1445e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    , m_isRobotized(false)
145bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    , m_robotTimeoutSeconds(0)
146bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    , m_robotExtraTimeSeconds(0)
1475e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
148d0825bca7fe65beaee391d30da42e937db621564Steve Block    // To allow QWebInspector's configuration persistence
1495e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    setOrganizationName("Nokia");
150e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    setApplicationName("QtTestBrowser");
1515e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    setApplicationVersion("0.1");
152d0825bca7fe65beaee391d30da42e937db621564Steve Block
1535e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    applyDefaultSettings();
154d0825bca7fe65beaee391d30da42e937db621564Steve Block
1555e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    handleUserOptions();
1565e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block}
1575e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
1588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockstatic void requiresGraphicsView(const QString& option)
1595e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
160dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (windowOptions.useGraphicsView)
1618a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return;
1628a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    appQuit(1, QString("%1 only works in combination with the -graphicsbased option").arg(option));
1635e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block}
1645e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
1655e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid LauncherApplication::handleUserOptions()
1665e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
1675e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    QStringList args = arguments();
1685e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    QFileInfo program(args.at(0));
169e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    QString programName("QtTestBrowser");
1705e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    if (program.exists())
1715e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        programName = program.baseName();
1725e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
1735e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    QList<QString> updateModes(enumToKeys(QGraphicsView::staticMetaObject,
1745e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block            "ViewportUpdateMode", "ViewportUpdate"));
1755e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
1768a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (args.contains("-help")) {
1775e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        qDebug() << "Usage:" << programName.toLatin1().data()
1788a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block             << "[-graphicsbased]"
179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block             << "[-no-compositing]"
1802bde8e466a4451c7319e3a072d118917957d6554Steve Block#if defined(QT_CONFIGURED_WITH_OPENGL)
1812bde8e466a4451c7319e3a072d118917957d6554Steve Block             << "[-gl-viewport]"
1822bde8e466a4451c7319e3a072d118917957d6554Steve Block             << "[-webgl]"
1832bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
1848a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block             << QString("[-viewport-update-mode %1]").arg(formatKeys(updateModes)).toLatin1().data()
1858a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block             << "[-cache-webview]"
1862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch             << "[-maximize]"
1878a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block             << "[-show-fps]"
1885e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block             << "[-r list]"
189bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen             << "[-robot-timeout seconds]"
190bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen             << "[-robot-extra-time seconds]"
191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block             << "[-inspector-url location]"
192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block             << "[-tiled-backing-store]"
193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block             << "[-resizes-to-contents]"
194cad810f21b803229eb11403f9209855525a25d57Steve Block             << "[-local-storage-enabled]"
195cad810f21b803229eb11403f9209855525a25d57Steve Block             << "[-offline-storage-database-enabled]"
196cad810f21b803229eb11403f9209855525a25d57Steve Block             << "[-offline-web-application-cache-enabled]"
197cad810f21b803229eb11403f9209855525a25d57Steve Block             << "[-set-offline-storage-default-quota maxSize]"
1982bde8e466a4451c7319e3a072d118917957d6554Steve Block#if defined(Q_WS_X11)
1992bde8e466a4451c7319e3a072d118917957d6554Steve Block             << "[-use-test-fonts]"
2002bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
2012bde8e466a4451c7319e3a072d118917957d6554Steve Block             << "[-print-loaded-urls]"
2025e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block             << "URLs";
2038a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        appQuit(0);
2045e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    }
2055e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
206e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    const bool defaultForAnimations = args.contains("-default-animations");
207e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (args.contains("-graphicsbased") || defaultForAnimations)
208dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        windowOptions.useGraphicsView = true;
2095e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (args.contains("-no-compositing")) {
211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        requiresGraphicsView("-no-compositing");
212dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        windowOptions.useCompositing = false;
2138a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
2145e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
2158a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (args.contains("-show-fps")) {
2168a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        requiresGraphicsView("-show-fps");
217dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        windowOptions.showFrameRate = true;
2188a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
2195e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
220e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (args.contains("-cache-webview") || defaultForAnimations) {
2218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        requiresGraphicsView("-cache-webview");
222dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        windowOptions.cacheWebView = true;
2238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
2245e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (args.contains("-tiled-backing-store")) {
226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        requiresGraphicsView("-tiled-backing-store");
227dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        windowOptions.useTiledBackingStore = true;
228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (args.contains("-resizes-to-contents")) {
231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        requiresGraphicsView("-resizes-to-contents");
232dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        windowOptions.resizesToContents = true;
233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
234cad810f21b803229eb11403f9209855525a25d57Steve Block
235cad810f21b803229eb11403f9209855525a25d57Steve Block    if (args.contains("-local-storage-enabled"))
2362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        windowOptions.useLocalStorage = true;
237cad810f21b803229eb11403f9209855525a25d57Steve Block
2382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (args.contains("-maximize"))
2392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        windowOptions.startMaximized = true;
2402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
241cad810f21b803229eb11403f9209855525a25d57Steve Block    if (args.contains("-offline-storage-database-enabled"))
2422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        windowOptions.useOfflineStorageDatabase = true;
243cad810f21b803229eb11403f9209855525a25d57Steve Block
244cad810f21b803229eb11403f9209855525a25d57Steve Block    if (args.contains("-offline-web-application-cache-enabled"))
2452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        windowOptions.useOfflineWebApplicationCache = true;
246cad810f21b803229eb11403f9209855525a25d57Steve Block
247cad810f21b803229eb11403f9209855525a25d57Steve Block    int setOfflineStorageDefaultQuotaIndex = args.indexOf("-set-offline-storage-default-quota");
248cad810f21b803229eb11403f9209855525a25d57Steve Block    if (setOfflineStorageDefaultQuotaIndex != -1) {
2492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        unsigned int maxSize = takeOptionValue(&args, setOfflineStorageDefaultQuotaIndex).toUInt();
2502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        windowOptions.offlineStorageDefaultQuotaSize = maxSize;
251cad810f21b803229eb11403f9209855525a25d57Steve Block    }
252cad810f21b803229eb11403f9209855525a25d57Steve Block
253e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (defaultForAnimations)
254e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        windowOptions.viewportUpdateMode = QGraphicsView::BoundingRectViewportUpdate;
255e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
2568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    QString arg1("-viewport-update-mode");
2578a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    int modeIndex = args.indexOf(arg1);
2588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (modeIndex != -1) {
2598a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        requiresGraphicsView(arg1);
2608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
2618a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        QString mode = takeOptionValue(&args, modeIndex);
2628a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (mode.isEmpty())
2638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            appQuit(1, QString("%1 needs a value of one of [%2]").arg(arg1).arg(formatKeys(updateModes)));
2648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        int idx = updateModes.indexOf(mode);
2658a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (idx == -1)
2668a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            appQuit(1, QString("%1 value has to be one of [%2]").arg(arg1).arg(formatKeys(updateModes)));
2678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
268dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        windowOptions.viewportUpdateMode = static_cast<QGraphicsView::ViewportUpdateMode>(idx);
2695e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    }
270e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#ifdef QT_CONFIGURED_WITH_OPENGL
271e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (args.contains("-gl-viewport") || defaultForAnimations) {
272e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        requiresGraphicsView("-gl-viewport");
273e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        windowOptions.useQGLWidgetViewport = true;
274e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    }
2752bde8e466a4451c7319e3a072d118917957d6554Steve Block
2762bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (args.contains("-webgl")) {
2772bde8e466a4451c7319e3a072d118917957d6554Steve Block        requiresGraphicsView("-webgl");
2782bde8e466a4451c7319e3a072d118917957d6554Steve Block        windowOptions.useWebGL = true;
2792bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
280e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif
2815e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
2822bde8e466a4451c7319e3a072d118917957d6554Steve Block#if defined(Q_WS_X11)
2832bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (args.contains("-use-test-fonts"))
2842bde8e466a4451c7319e3a072d118917957d6554Steve Block        windowOptions.useTestFonts = true;
2852bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
2862bde8e466a4451c7319e3a072d118917957d6554Steve Block
2872bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (args.contains("-print-loaded-urls"))
2882bde8e466a4451c7319e3a072d118917957d6554Steve Block        windowOptions.printLoadedUrls = true;
2892bde8e466a4451c7319e3a072d118917957d6554Steve Block
290dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QString inspectorUrlArg("-inspector-url");
291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int inspectorUrlIndex = args.indexOf(inspectorUrlArg);
292dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (inspectorUrlIndex != -1)
293dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch       windowOptions.inspectorUrl = takeOptionValue(&args, inspectorUrlIndex);
294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
295bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    QString remoteInspectorPortArg("-remote-inspector-port");
296bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    int remoteInspectorPortIndex = args.indexOf(remoteInspectorPortArg);
297bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (remoteInspectorPortIndex != -1)
298bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        windowOptions.remoteInspectorPort = takeOptionValue(&args, remoteInspectorPortIndex).toInt();
299bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
3005e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    int robotIndex = args.indexOf("-r");
3015e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    if (robotIndex != -1) {
3028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        QString listFile = takeOptionValue(&args, robotIndex);
3038a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (listFile.isEmpty())
3048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            appQuit(1, "-r needs a list file to start in robotized mode");
3058a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (!QFile::exists(listFile))
3068a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            appQuit(1, "The list file supplied to -r does not exist.");
3078a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3088a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        m_isRobotized = true;
3098a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        m_urls = QStringList(listFile);
310bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    } else {
311bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        int lastArg = args.lastIndexOf(QRegExp("^-.*"));
312bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_urls = (lastArg != -1) ? args.mid(++lastArg) : args.mid(1);
3135e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    }
3145e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
315bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    int robotTimeoutIndex = args.indexOf("-robot-timeout");
316bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (robotTimeoutIndex != -1)
317bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_robotTimeoutSeconds = takeOptionValue(&args, robotTimeoutIndex).toInt();
318bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
319bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    int robotExtraTimeIndex = args.indexOf("-robot-extra-time");
320bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (robotExtraTimeIndex != -1)
321bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_robotExtraTimeSeconds = takeOptionValue(&args, robotExtraTimeIndex).toInt();
3225e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block}
3235e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
3245e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
3255e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockint main(int argc, char **argv)
3265e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
3275e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    LauncherApplication app(argc, argv);
3285e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
3295e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    if (app.isRobotized()) {
3308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        LauncherWindow* window = new LauncherWindow();
331bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        UrlLoader loader(window->page()->mainFrame(), app.urls().at(0), app.robotTimeout(), app.robotExtraTime());
332d0825bca7fe65beaee391d30da42e937db621564Steve Block        loader.loadNext();
333d0825bca7fe65beaee391d30da42e937db621564Steve Block        window->show();
3345e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        return launcherMain(app);
3355e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    }
336d0825bca7fe65beaee391d30da42e937db621564Steve Block
3375e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    QStringList urls = app.urls();
338d0825bca7fe65beaee391d30da42e937db621564Steve Block
3395e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    if (urls.isEmpty()) {
340bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        QString defaultIndexFile = QString("%1/%2").arg(QDir::homePath()).arg(QLatin1String("index.html"));
341bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (QFile(defaultIndexFile).exists())
342bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            urls.append(QString("file://") + defaultIndexFile);
3435e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        else
3445e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block            urls.append("");
3455e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    }
3465e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
3475e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    LauncherWindow* window = 0;
3485e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    foreach (QString url, urls) {
349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LauncherWindow* newWindow;
3505e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        if (!window)
351dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            newWindow = window = new LauncherWindow(&windowOptions);
3525e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        else
353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            newWindow = window->newWindow();
354dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        newWindow->load(url);
356d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
3575e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
3585e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    window->show();
3595e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    return launcherMain(app);
360d0825bca7fe65beaee391d30da42e937db621564Steve Block}
3615e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
3625e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "main.moc"
363