#include "network-web/webfactory.h" #include "miscellaneous/application.h" #include #include #include #include #include QPointer WebFactory::s_instance; WebFactory::WebFactory(QObject *parent) : QObject(parent), m_escapes(QMap()), m_deEscapes(QMap()), m_globalSettings(QWebSettings::globalSettings()) { } WebFactory::~WebFactory() { } void WebFactory::loadState() { Settings *settings = qApp->settings(); switchJavascript(settings->value(GROUP(Browser), SETTING(Browser::JavascriptEnabled)).toBool(), false); switchImages(settings->value(GROUP(Browser), SETTING(Browser::ImagesEnabled)).toBool(), false); switchPlugins(settings->value(GROUP(Browser), SETTING(Browser::PluginsEnabled)).toBool(), false); } bool WebFactory::sendMessageViaEmail(const Message &message) { if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailEnabled)).toBool()) { QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailExecutable)).toString(); QString arguments = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailArguments)).toString(); return QProcess::startDetached(QString("\"") + browser + QSL("\" ") + arguments.arg(message.m_title, stripTags(message.m_contents))); } else { // Send it via mailto protocol. // NOTE: http://en.wikipedia.org/wiki/Mailto return QDesktopServices::openUrl(QString("mailto:?subject=%1&body=%2").arg(QString(QUrl::toPercentEncoding(message.m_title)), QString(QUrl::toPercentEncoding(stripTags(message.m_contents))))); } } bool WebFactory::openUrlInExternalBrowser(const QString &url) { if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserEnabled)).toBool()) { QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserExecutable)).toString(); QString arguments = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserArguments)).toString(); QString call_line = "\"" + browser + "\" \"" + arguments.arg(url) + "\""; qDebug("Running code '%s'.", qPrintable(call_line)); return QProcess::startDetached(call_line); //return QProcess::startDetached(QString("\"") + browser + QSL("\""), QStringList() << arguments.arg(url)); } else { return QDesktopServices::openUrl(url); } } void WebFactory::switchJavascript(bool enable, bool save_settings) { if (save_settings) { qApp->settings()->setValue(GROUP(Browser), Browser::JavascriptEnabled, enable); } m_globalSettings->setAttribute(QWebSettings::JavascriptEnabled, enable); emit javascriptSwitched(enable); } void WebFactory::switchPlugins(bool enable, bool save_settings) { if (save_settings) { qApp->settings()->setValue(GROUP(Browser), Browser::PluginsEnabled, enable); } m_globalSettings->setAttribute(QWebSettings::PluginsEnabled, enable); emit pluginsSwitched(enable); } void WebFactory::switchImages(bool enable, bool save_settings) { if (save_settings) { qApp->settings()->setValue(GROUP(Browser), Browser::ImagesEnabled, enable); } m_globalSettings->setAttribute(QWebSettings::AutoLoadImages, enable); emit imagesLoadingSwitched(enable); } WebFactory *WebFactory::instance() { if (s_instance.isNull()) { s_instance = new WebFactory(qApp); } return s_instance; } bool WebFactory::javascriptEnabled() const { return m_globalSettings->testAttribute(QWebSettings::JavascriptEnabled); } bool WebFactory::pluginsEnabled() const { return m_globalSettings->testAttribute(QWebSettings::PluginsEnabled); } bool WebFactory::autoloadImages() const { return m_globalSettings->testAttribute(QWebSettings::AutoLoadImages); } QString WebFactory::stripTags(QString text) { return text.remove(QRegExp(QSL("<[^>]*>"))); } QString WebFactory::escapeHtml(const QString &html) { if (m_escapes.isEmpty()) { generetaEscapes(); } QString output = html; foreach (const QString &key, m_escapes.keys()) { output = output.replace(key, m_escapes.value(key)); } return output; } QString WebFactory::deEscapeHtml(const QString &text) { if (m_deEscapes.isEmpty()) { generateDeescapes(); } QString output = text; foreach (const QString &key, m_deEscapes.keys()) { output = output.replace(key, m_deEscapes.value(key)); } return output; } QString WebFactory::toSecondLevelDomain(const QUrl &url) { #if QT_VERSION >= 0x040800 const QString top_level_domain = url.topLevelDomain(); const QString url_host = url.host(); if (top_level_domain.isEmpty() || url_host.isEmpty()) { return QString(); } QString domain = url_host.left(url_host.size() - top_level_domain.size()); if (domain.count(QL1C('.')) == 0) { return url_host; } while (domain.count(QL1C('.')) != 0) { domain = domain.mid(domain.indexOf(QL1C('.')) + 1); } return domain + top_level_domain; #else QString domain = url.host(); if (domain.count(QL1C('.')) == 0) { return QString(); } while (domain.count(QL1C('.')) != 1) { domain = domain.mid(domain.indexOf(QL1C('.')) + 1); } return domain; #endif } void WebFactory::generetaEscapes() { m_escapes[QSL("<")] = QL1C('<'); m_escapes[QSL(">")] = QL1C('>'); m_escapes[QSL("&")] = QL1C('&'); m_escapes[QSL(""")] = QL1C('\"'); m_escapes[QSL(" ")] = QL1C(' '); m_escapes[QSL("±")] = QSL("±"); m_escapes[QSL("×")] = QSL("×"); m_escapes[QSL("'")] = QL1C('\''); } void WebFactory::generateDeescapes() { m_deEscapes[QSL("<")] = QSL("<"); m_deEscapes[QSL(">")] = QSL(">"); m_deEscapes[QSL("&")] = QSL("&"); m_deEscapes[QSL("\"")] = QSL("""); m_deEscapes[QSL("±")] = QSL("±"); m_deEscapes[QSL("×")] = QSL("×"); m_deEscapes[QSL("\'")] = QSL("'"); }