// public: Phantom::Phantom(QObject *parent) : QObject(parent) , m_terminated(false) , m_returnValue(0) , m_converter(0) , m_netAccessMan(0) { m_page = new WebPage(this); QString proxyHost; int proxyPort = 1080; bool autoLoadImages = true; bool pluginsEnabled = false; bool diskCacheEnabled = false; bool ignoreSslErrors = false; bool localAccessRemote = false; // second argument: script name QStringList args = QApplication::arguments(); // Skip the first argument, i.e. the application executable (phantomjs). args.removeFirst(); // Handle all command-line options. QStringListIterator argIterator(args); while (argIterator.hasNext()) { const QString &arg = argIterator.next(); if (arg == "--version") { m_terminated = true; std::cout << PHANTOMJS_VERSION_STRING << " (development)" << std::endl; return; } if (arg == "--load-images=yes") { autoLoadImages = true; continue; } if (arg == "--load-images=no") { autoLoadImages = false; continue; } if (arg == "--load-plugins=yes") { pluginsEnabled = true; continue; } if (arg == "--load-plugins=no") { pluginsEnabled = false; continue; } if (arg == "--disk-cache=yes") { diskCacheEnabled = true; continue; } if (arg == "--disk-cache=no") { diskCacheEnabled = false; continue; } if (arg == "--ignore-ssl-errors=yes") { ignoreSslErrors = true; continue; } if (arg == "--ignore-ssl-errors=no") { ignoreSslErrors = false; continue; } if (arg == "--local-access-remote=no") { localAccessRemote = false; continue; } if (arg == "--local-access-remote=yes") { localAccessRemote = true; continue; } if (arg.startsWith("--proxy=")) { proxyHost = arg.mid(8).trimmed(); if (proxyHost.lastIndexOf(':') > 0) { bool ok = true; int port = proxyHost.mid(proxyHost.lastIndexOf(':') + 1).toInt(&ok); if (ok) { proxyHost = proxyHost.left(proxyHost.lastIndexOf(':')).trimmed(); proxyPort = port; } } continue; } if (arg.startsWith("--")) { std::cerr << "Unknown option '" << qPrintable(arg) << "'" << std::endl; m_terminated = true; return; } else { m_scriptFile = arg; break; } } if (m_scriptFile.isEmpty()) { Utils::showUsage(); return; } if (proxyHost.isEmpty()) { QNetworkProxyFactory::setUseSystemConfiguration(true); } else { QNetworkProxy proxy(QNetworkProxy::HttpProxy, proxyHost, proxyPort); QNetworkProxy::setApplicationProxy(proxy); } // The remaining arguments are available for the script. while (argIterator.hasNext()) { const QString &arg = argIterator.next(); m_args += arg; } // Provide WebPage with a non-standard Network Access Manager m_netAccessMan = new NetworkAccessManager(this, diskCacheEnabled, ignoreSslErrors); m_page->setNetworkAccessManager(m_netAccessMan); connect(m_page, SIGNAL(javaScriptConsoleMessageSent(QString, int, QString)), SLOT(printConsoleMessage(QString, int, QString))); m_defaultPageSettings[PAGE_SETTINGS_LOAD_IMAGES] = QVariant::fromValue(autoLoadImages); m_defaultPageSettings[PAGE_SETTINGS_LOAD_PLUGINS] = QVariant::fromValue(pluginsEnabled); m_defaultPageSettings[PAGE_SETTINGS_USER_AGENT] = QVariant::fromValue(m_page->userAgent()); m_defaultPageSettings[PAGE_SETTINGS_LOCAL_ACCESS_REMOTE] = QVariant::fromValue(localAccessRemote); m_page->applySettings(m_defaultPageSettings); setLibraryPath(QFileInfo(m_scriptFile).dir().absolutePath()); m_page->mainFrame()->addToJavaScriptWindowObject("phantom", this); QFile file(":/bootstrap.js"); if (!file.open(QFile::ReadOnly)) { std::cerr << "Can not bootstrap!" << std::endl; exit(1); } QString bootstrapper = QString::fromUtf8(file.readAll()); file.close(); if (bootstrapper.isEmpty()) { std::cerr << "Can not bootstrap!" << std::endl; exit(1); } m_page->mainFrame()->evaluateJavaScript(bootstrapper); }
// public: Phantom::Phantom(QObject *parent) : QObject(parent) , m_proxyPort(1080) , m_returnValue(0) , m_converter(0) , m_netAccessMan(0) { QPalette palette = m_page.palette(); palette.setBrush(QPalette::Base, Qt::transparent); m_page.setPalette(palette); bool autoLoadImages = true; bool pluginsEnabled = false; bool diskCacheEnabled = false; bool ignoreSslErrors = false; // second argument: script name QStringList args = QApplication::arguments(); // Skip the first argument, i.e. the application executable (phantomjs). args.removeFirst(); // Handle all command-line options. QStringListIterator argIterator(args); while (argIterator.hasNext()) { const QString &arg = argIterator.next(); if (arg.startsWith("--upload-file") && argIterator.hasNext()) { const QString &fileInfoString = argIterator.next(); QStringList fileInfo = fileInfoString.split("="); const QString &tag = fileInfo.at(0); const QString &fileName = fileInfo.at(1); m_page.m_allowedFiles[tag] = fileName; continue; } if (arg == "--load-images=yes") { autoLoadImages = true; continue; } if (arg == "--load-images=no") { autoLoadImages = false; continue; } if (arg == "--load-plugins=yes") { pluginsEnabled = true; continue; } if (arg == "--load-plugins=no") { pluginsEnabled = false; continue; } if (arg == "--disk-cache=yes") { diskCacheEnabled = true; continue; } if (arg == "--disk-cache=no") { diskCacheEnabled = false; continue; } if (arg == "--ignore-ssl-errors=yes") { ignoreSslErrors = true; continue; } if (arg == "--ignore-ssl-errors=no") { ignoreSslErrors = false; continue; } if (arg.startsWith("--proxy=")) { m_proxyHost = arg.mid(8).trimmed(); if (m_proxyHost.lastIndexOf(':') > 0) { bool ok = true; int port = m_proxyHost.mid(m_proxyHost.lastIndexOf(':') + 1).toInt(&ok); if (ok) { m_proxyHost = m_proxyHost.left(m_proxyHost.lastIndexOf(':')).trimmed(); m_proxyPort = port; } } continue; } if (arg.startsWith("--")) { qFatal("Unknown option '%s'", qPrintable(arg)); exit(-1); return; } else { m_scriptFile = arg; break; } } if (m_scriptFile.isEmpty()) { Utils::showUsage(); return; } if (m_proxyHost.isEmpty()) { #if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) QNetworkProxyFactory::setUseSystemConfiguration(true); #endif } else { QNetworkProxy proxy(QNetworkProxy::HttpProxy, m_proxyHost, m_proxyPort); QNetworkProxy::setApplicationProxy(proxy); } // The remaining arguments are available for the script. while (argIterator.hasNext()) { const QString &arg = argIterator.next(); m_args += arg; } // Provide WebPage with a non-standard Network Access Manager m_netAccessMan = new NetworkAccessManager(this, diskCacheEnabled, ignoreSslErrors); m_page.setNetworkAccessManager(m_netAccessMan); connect(m_page.mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), SLOT(inject())); connect(&m_page, SIGNAL(loadFinished(bool)), this, SLOT(finish(bool))); m_page.settings()->setAttribute(QWebSettings::AutoLoadImages, autoLoadImages); m_page.settings()->setAttribute(QWebSettings::PluginsEnabled, pluginsEnabled); m_page.settings()->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, true); m_page.settings()->setOfflineStoragePath(QDesktopServices::storageLocation(QDesktopServices::DataLocation)); m_page.settings()->setAttribute(QWebSettings::LocalStorageDatabaseEnabled, true); #if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0) m_page.settings()->setAttribute(QWebSettings::FrameFlatteningEnabled, true); #endif #if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) m_page.settings()->setAttribute(QWebSettings::LocalStorageEnabled, true); m_page.settings()->setLocalStoragePath(QDesktopServices::storageLocation(QDesktopServices::DataLocation)); #endif // Ensure we have document.body. m_page.mainFrame()->setHtml("<html><body></body></html>"); m_page.mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff); m_page.mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff); }