#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 + "\" " + 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(); return QProcess::startDetached(QString("\"") + browser + "\"", 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("<[^>]*>")); } 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["<"] = '<'; m_escapes[">"] = '>'; m_escapes["&"] = '&'; m_escapes["""] = '\"'; m_escapes[" "] = ' '; m_escapes["±"] = "±"; m_escapes["×"] = "×"; m_escapes["'"] = '\''; } void WebFactory::generateDeescapes() { m_deEscapes["<"] = "<"; m_deEscapes[">"] = ">"; m_deEscapes["&"] = "&"; m_deEscapes["\""] = """; m_deEscapes["±"] = "±"; m_deEscapes["×"] = "×"; m_deEscapes["\'"] = "'"; }