void NetworkAccessManager::loadSettings() { QSettings settings; settings.beginGroup(QLatin1String("proxy")); QNetworkProxy proxy; if (settings.value(QLatin1String("enabled"), false).toBool()) { int proxyType = settings.value(QLatin1String("type"), 0).toInt(); if (proxyType == 0) proxy = QNetworkProxy::Socks5Proxy; else if (proxyType == 1) proxy = QNetworkProxy::HttpProxy; else { // 2 proxy.setType(QNetworkProxy::HttpCachingProxy); #if QT_VERSION >= 0x040500 proxy.setCapabilities(QNetworkProxy::CachingCapability | QNetworkProxy::HostNameLookupCapability); #endif } proxy.setHostName(settings.value(QLatin1String("hostName")).toString()); proxy.setPort(settings.value(QLatin1String("port"), 1080).toInt()); proxy.setUser(settings.value(QLatin1String("userName")).toString()); proxy.setPassword(settings.value(QLatin1String("password")).toString()); } #if QT_VERSION >= 0x040500 NetworkProxyFactory *proxyFactory = new NetworkProxyFactory; if (proxy.type() == QNetworkProxy::HttpCachingProxy) { proxyFactory->setHttpProxy(proxy); proxyFactory->setGlobalProxy(QNetworkProxy::DefaultProxy); } else { proxyFactory->setHttpProxy(QNetworkProxy::DefaultProxy); proxyFactory->setGlobalProxy(proxy); } setProxyFactory(proxyFactory); #else setProxy(proxy); #endif settings.endGroup(); #ifndef QT_NO_OPENSSL QSslConfiguration sslCfg = QSslConfiguration::defaultConfiguration(); QList<QSslCertificate> ca_list = sslCfg.caCertificates(); QList<QSslCertificate> ca_new = QSslCertificate::fromData(settings.value(QLatin1String("CaCertificates")).toByteArray()); ca_list += ca_new; sslCfg.setCaCertificates(ca_list); QSslConfiguration::setDefaultConfiguration(sslCfg); #endif settings.beginGroup(QLatin1String("network")); QStringList acceptList = settings.value(QLatin1String("acceptLanguages"), AcceptLanguageDialog::defaultAcceptList()).toStringList(); acceptLanguage = AcceptLanguageDialog::httpString(acceptList); settings.endGroup(); }
int main(int argc, char** argv) { // Parse options // TODO: http://api.kde.org/4.x-api/kdelibs-apidocs/kdecore/html/classKCmdLineArgs.html { QStringList arguments = getCliArguments(argc, argv); if ((arguments.indexOf("-h") != -1) || (arguments.indexOf("--help") != -1)) { qDebug() << "QtWeb options:"; qDebug() << ""; qDebug() << "--maximize"; qDebug() << ""; qDebug() << "--url"; qDebug() << "--user-agent"; qDebug() << "--socks host:port"; qDebug() << "--socks-resolver"; qDebug() << "--extra-enabled"; return EXIT_SUCCESS; } int optionIndex = 0; // maximize if ((optionIndex = arguments.indexOf("--maximize")) != -1) { options.maximize = true; } // url if ((optionIndex = arguments.indexOf("--url")) != -1) { options.url = arguments.at(optionIndex + 1); } // user agent if ((optionIndex = arguments.indexOf("--user-agent")) != -1) { options.userAgent = arguments.at(optionIndex + 1); Wrapper::QWebPage::userAgent = options.userAgent; } // socks if ((optionIndex = arguments.indexOf("--socks")) != -1) { options.socks = arguments.at(optionIndex + 1); } // socks resolver if ((optionIndex = arguments.indexOf("--socks-resolver")) != -1) { options.socksResolver = true; } // enable extra if ((optionIndex = arguments.indexOf("--extra-enabled")) != -1) { options.extraEnabled = true; } qDebug() << "Maximize" << options.maximize; qDebug() << "Load" << options.url; qDebug() << "User-agent" << options.userAgent; qDebug() << "Socks" << options.socks; qDebug() << "Socks resolver" << options.socksResolver; qDebug() << "Extra enabled" << options.extraEnabled; } QApplication a(argc, argv); // release view Lambda qHandler([&]() { view.reset(); }); QObject::connect(&a, SIGNAL(aboutToQuit()), &qHandler, SLOT(call())); view.reset(new QWebView); view->setPage(new Wrapper::QWebPage); // add "http://" if (options.url.indexOf("://") == -1) { options.url = QLatin1String("http://") + options.url; } // socks if (options.socks.length()) { QNetworkProxy proxy; proxy.setType(QNetworkProxy::Socks5Proxy); int colonPosition = options.socks.lastIndexOf(":"); if (colonPosition == -1) { qDebug() << "Malformed proxy (HOST:PORT is needed)"; return EXIT_FAILURE; } proxy.setHostName(options.socks.left(colonPosition)); proxy.setPort(options.socks.right(options.socks.length() - 1 - colonPosition).toInt()); if (options.socksResolver) { proxy.setCapabilities(proxy.capabilities() | QNetworkProxy::HostNameLookupCapability); } else { proxy.setCapabilities(proxy.capabilities() & ~QNetworkProxy::HostNameLookupCapability); } view->page()->networkAccessManager()->setProxy(proxy); qDebug() << "Proxy installed"; } // Add inspector. view->page()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true); if (options.extraEnabled) { view->page()->settings()->setAttribute(QWebSettings::PluginsEnabled, true); view->page()->settings()->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, true); view->page()->settings()->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled, true); view->page()->settings()->setAttribute(QWebSettings::LocalStorageEnabled, true); view->page()->settings()->setAttribute(QWebSettings::LocalStorageDatabaseEnabled, true); } view->load(QUrl(options.url)); if (options.maximize) { view->showMaximized(); } else { view->show(); } // execute JS { // Reinterpret pointer to Wrapper class Wrapper::QWebPage *page = reinterpret_cast<Wrapper::QWebPage *>(view->page()); // async read from STDIN // and eval this as JS code stdinNotifier.reset(new QSocketNotifier(STDIN_FILENO, QSocketNotifier::Read)); QObject::connect(&(*stdinNotifier), SIGNAL(activated(int)), new Lambda([&] { qDebug() << Q_FUNC_INFO; QTextStream stream(stdin, QIODevice::ReadOnly); QString jsToExecute; forever { fd_set stdinfd; FD_ZERO( &stdinfd ); FD_SET( STDIN_FILENO, &stdinfd ); struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 0; int ready = select(1, &stdinfd, NULL, NULL, &tv); if (ready > 0) { jsToExecute += stream.readLine(); } else { break; } } // TODO : drop code duplicating if (jsToExecute.startsWith(options.moveToElementPrefix)) { QString moveMouseToElementSelector = jsToExecute.remove(0, options.moveToElementPrefix.length()); page->moveMouseTo(page->mainFrame()->findFirstElement(moveMouseToElementSelector)); } else if (jsToExecute.startsWith(options.clickToElementPrefix)) { QString clickMouseToElementSelector = jsToExecute.remove(0, options.clickToElementPrefix.length()); page->clickTo(page->mainFrame()->findFirstElement(clickMouseToElementSelector)); } else if (jsToExecute.startsWith(options.cursorSetToElementPrefix)) { QString setCursorToElementSelector = jsToExecute.remove(0, options.cursorSetToElementPrefix.length()); page->setCursorTo(page->mainFrame()->findFirstElement(setCursorToElementSelector)); } else { view->page()->mainFrame()->evaluateJavaScript(jsToExecute); } }), SLOT(call())); stdinNotifier->setEnabled(true); }