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