aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAqua-sama <aqua@iserlohn-fortress.net>2019-01-16 16:52:07 +0100
committerAqua-sama <aqua@iserlohn-fortress.net>2019-01-16 16:52:07 +0100
commit2a696a57abafb25978aef1af5758fe75b706d1f0 (patch)
tree9c9b3468398b16711a573e0c8b87ae2ad03100b4 /lib
parentRewrite lib/urlfilter (diff)
downloadsmolbote-2a696a57abafb25978aef1af5758fe75b706d1f0.tar.xz
Rewrite lib/web to lib/webprofile
- libweb was supposed to be a general QtWebEngine wrapper, but only turned out to do profiles and profile management. The new name should make this more obvious. - Renamed ProfileManager to WebProfileManager, and cut out duplicate code. - Temporary profiles: temporary profiles are not kept after closing the browser.
Diffstat (limited to 'lib')
-rw-r--r--lib/web/meson.build15
-rw-r--r--lib/web/profilemanager.cpp171
-rw-r--r--lib/web/profilemanager.h79
-rw-r--r--lib/webprofile/meson.build12
-rw-r--r--lib/webprofile/webprofile.cpp (renamed from lib/web/webprofile.cpp)4
-rw-r--r--lib/webprofile/webprofile.h (renamed from lib/web/webprofile.h)8
-rw-r--r--lib/webprofile/webprofilemanager.cpp150
-rw-r--r--lib/webprofile/webprofilemanager.h78
8 files changed, 246 insertions, 271 deletions
diff --git a/lib/web/meson.build b/lib/web/meson.build
deleted file mode 100644
index 54d94df..0000000
--- a/lib/web/meson.build
+++ /dev/null
@@ -1,15 +0,0 @@
-web_inc = include_directories('.')
-web_moc = qt5.preprocess(
- moc_headers: ['profilemanager.h', 'webprofile.h'],
- dependencies: dep_qt5
-)
-web_lib = static_library('web',
- ['profilemanager.cpp', 'webprofile.cpp', web_moc, interfaces_moc],
- dependencies: dep_qt5,
- include_directories: [include, web_inc]
-)
-
-dep_web = declare_dependency(
- include_directories: web_inc,
- link_with: web_lib
-)
diff --git a/lib/web/profilemanager.cpp b/lib/web/profilemanager.cpp
deleted file mode 100644
index 0bae251..0000000
--- a/lib/web/profilemanager.cpp
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * This file is part of smolbote. It's copyrighted by the contributors recorded
- * in the version control history of the file, available from its original
- * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote
- *
- * SPDX-License-Identifier: GPL-3.0
- */
-
-#include "profilemanager.h"
-#include "webprofile.h"
-#include <QFileInfo>
-#include <QWebEngineSettings>
-
-ProfileManager::ProfileManager(const QHash<QString, QString> &profileSection, QObject *parent)
- : QObject(parent)
- , defaults(profileSection)
-{
-}
-
-WebProfile *ProfileManager::createProfile(const QString& id, bool isOffTheRecord)
-{
- QDir profileDir(defaults.value("profile.path"));
- const QString path = profileDir.absoluteFilePath(id + ".profile");
- {
- QSettings init(path, QSettings::IniFormat);
- init.setValue("name", id);
- init.setValue("otr", isOffTheRecord);
- init.sync();
- }
- return loadProfile(path);
-}
-
-WebProfile *ProfileManager::loadProfile(const QString &path)
-{
- std::unique_ptr<ProfileData> ptr = std::make_unique<ProfileData>(path);
- const QString id = QFileInfo(path).baseName();
-
- if(ptr->settings.value("otr", true).toBool()) {
- ptr->profile = new WebProfile(ptr->settings.value("name", id).toString(), nullptr);
- } else {
- ptr->profile = new WebProfile(id, ptr->settings.value("name", id).toString(), nullptr);
- }
- Q_CHECK_PTR(ptr->profile);
- connect(ptr->profile, &WebProfile::nameChanged, ptr->profile, [this, id](const QString &name) {
- this->m_profiles.at(id)->settings.setValue("name", name);
- });
-
- ptr->profile->setSearch(ptr->settings.value("search", defaults.value("profile.search")).toString());
- connect(ptr->profile, &WebProfile::searchChanged, ptr->profile, [this, id](const QString &url) {
- this->m_profiles.at(id)->settings.setValue("search", url);
- });
-
- ptr->profile->setHomepage(ptr->settings.value("homepage", defaults.value("profile.homepage")).toUrl());
- connect(ptr->profile, &WebProfile::homepageChanged, ptr->profile, [this, id](const QUrl &url) {
- this->m_profiles.at(id)->settings.setValue("homepage", url);
- });
-
- ptr->profile->setNewtab(ptr->settings.value("newtab", defaults.value("profile.newtab")).toUrl());
- connect(ptr->profile, &WebProfile::newtabChanged, ptr->profile, [this, id](const QUrl &url) {
- this->m_profiles.at(id)->settings.setValue("newtab", url);
- });
-
- ptr->settings.beginGroup("properties");
- {
- const auto keys = ptr->settings.childKeys();
- for(const QString &key : keys) {
- ptr->profile->setProperty(qUtf8Printable(key), ptr->settings.value(key));
- }
- }
- ptr->settings.endGroup(); // properties
- connect(ptr->profile, &WebProfile::propertyChanged, ptr->profile, [this, id](const QString &property, const QVariant &value) {
- this->m_profiles.at(id)->settings.setValue("properties/" + property, value);
- });
-
- ptr->settings.beginGroup("attributes");
- {
- const auto keys = ptr->settings.childKeys();
- auto *settings = ptr->profile->settings();
- for(const QString &key : keys) {
- auto attribute = static_cast<QWebEngineSettings::WebAttribute>(key.toInt());
- settings->setAttribute(attribute, ptr->settings.value(key).toBool());
- }
- }
- ptr->settings.endGroup();
- connect(ptr->profile, &WebProfile::attributeChanged, ptr->profile, [this, id](const QWebEngineSettings::WebAttribute attr, const bool value) {
- this->m_profiles.at(id)->settings.setValue("attributes/" + QString::number(attr), value);
- });
-
- // headers
- ptr->settings.beginGroup("headers");
- for(const QString &key : ptr->settings.childKeys()) {
- ptr->profile->setHttpHeader(key.toLatin1(), ptr->settings.value(key).toString().toLatin1());
- }
- ptr->settings.endGroup();
- connect(ptr->profile, &WebProfile::headerChanged, ptr->profile, [this, id](const QString &name, const QString &value) {
- this->m_profiles.at(id)->settings.setValue("headers/" + name, value);
- });
- connect(ptr->profile, &WebProfile::headerRemoved, ptr->profile, [this, id](const QString &name) {
- this->m_profiles.at(id)->settings.remove("headers/" + name);
- });
-
- m_profiles[id] = std::move(ptr);
- return m_profiles.at(id)->profile;
-}
-
-void ProfileManager::deleteProfile(const QString &id)
-{
- if(m_profiles.count(id) > 0) {
- auto profileData = m_profiles.extract(id);
- profileData.mapped()->deleteSelf = true;
- }
-}
-
-void ProfileManager::profilePickerMenu(QMenu *menu, WebProfile *current, std::function<void(WebProfile *)> callback) const
-{
- auto *profileGroup = new QActionGroup(menu);
-
- for(const auto &profileData : m_profiles) {
- WebProfile *profile = profileData.second->profile;
-
- auto *action = menu->addAction(profile->name(), profile, [profile, callback]() {
- callback(profile);
- });
- action->setCheckable(true);
- profileGroup->addAction(action);
-
- if(profile == current)
- action->setChecked(true);
- }
-
- connect(menu, &QMenu::aboutToHide, profileGroup, &QActionGroup::deleteLater);
-}
-
-QMenu *ProfileManager::createProfileMenu(std::function<void(WebProfile *)> callback, QWidget *parent) const
-{
- auto *menu = new QMenu(parent);
- for(const auto &m_profile : m_profiles) {
- WebProfile *profile = m_profile.second->profile;
- QAction *action = menu->addAction(profile->name());
- connect(action, &QAction::triggered, profile, [profile, callback]() {
- callback(profile);
- });
- }
- return menu;
-}
-
-const QStringList ProfileManager::idList() const
-{
- QStringList ids;
- for(const auto &m_profile : m_profiles) {
- ids.append(m_profile.first);
- }
- return ids;
-}
-
-const QString ProfileManager::id(const WebProfile *profile) const
-{
- for(const auto &m_profile : m_profiles) {
- if(m_profile.second->profile == profile)
- return m_profile.first;
- }
- return QString();
-}
-
-WebProfile *ProfileManager::profile(const QString &id) const
-{
- if(m_profiles.count(id) > 0) {
- return m_profiles.at(id)->profile;
- }
- return nullptr;
-}
diff --git a/lib/web/profilemanager.h b/lib/web/profilemanager.h
deleted file mode 100644
index e0040a3..0000000
--- a/lib/web/profilemanager.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * This file is part of smolbote. It's copyrighted by the contributors recorded
- * in the version control history of the file, available from its original
- * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote
- *
- * SPDX-License-Identifier: GPL-3.0
- */
-
-#ifndef SMOLBOTE_PROFILEMANAGER_H
-#define SMOLBOTE_PROFILEMANAGER_H
-
-#include "webprofile.h"
-#include <QDir>
-#include <QFile>
-#include <QMap>
-#include <QMenu>
-#include <QObject>
-#include <QSettings>
-#include <functional>
-#include <map>
-#include <memory>
-
-class WebProfile;
-class ProfileManager : public QObject
-{
- Q_OBJECT
-public:
- explicit ProfileManager(const QHash<QString, QString> &profileSection, QObject *parent);
-
- WebProfile *createProfile(const QString &id, bool isOffTheRecord);
- WebProfile *loadProfile(const QString &path);
- void deleteProfile(const QString &id);
-
- void profilePickerMenu(QMenu *menu, WebProfile *current, std::function<void(WebProfile *)> callback) const;
- QMenu *createProfileMenu(std::function<void(WebProfile *)> callback, QWidget *parent = nullptr) const;
-
- const QStringList idList() const;
- const QString id(const WebProfile *profile) const;
- WebProfile *profile(const QString &id) const;
-
-private:
- struct ProfileData {
- explicit ProfileData(const QString &path = QString())
- : settings(path, QSettings::IniFormat)
- {
- this->path = path;
- }
-
- ~ProfileData()
- {
- if(!deleteSelf) {
-#ifdef QT_DEBUG
- qDebug("sync %s", qUtf8Printable(settings.fileName()));
-#endif
- this->settings.sync();
- } else {
- QFile::remove(path);
-
- if(!profile->isOffTheRecord()) {
- if(!profile->persistentStoragePath().isEmpty())
- QDir(profile->persistentStoragePath()).removeRecursively();
-
- if(!profile->cachePath().isEmpty())
- QDir(profile->cachePath()).removeRecursively();
- }
- }
- }
-
- WebProfile *profile = nullptr;
- bool deleteSelf = false;
- QSettings settings;
- QString path;
- };
-
- std::map<QString, std::unique_ptr<ProfileData>> m_profiles;
- const QHash<QString, QString> defaults;
-};
-
-#endif // SMOLBOTE_PROFILEMANAGER_H
diff --git a/lib/webprofile/meson.build b/lib/webprofile/meson.build
new file mode 100644
index 0000000..af4cfcb
--- /dev/null
+++ b/lib/webprofile/meson.build
@@ -0,0 +1,12 @@
+webprofile_lib = static_library('webprofile',
+ ['webprofilemanager.cpp', 'webprofile.cpp', interfaces_moc,
+ qt5.preprocess(moc_headers: ['webprofilemanager.h', 'webprofile.h'], dependencies: dep_qt5)],
+ dependencies: dep_qt5,
+ include_directories: [include]
+)
+
+dep_webprofile = declare_dependency(
+ include_directories: include_directories('.'),
+ link_with: webprofile_lib
+)
+
diff --git a/lib/web/webprofile.cpp b/lib/webprofile/webprofile.cpp
index 38aa7f0..ae6993e 100644
--- a/lib/web/webprofile.cpp
+++ b/lib/webprofile/webprofile.cpp
@@ -135,13 +135,13 @@ void WebProfile::setHttpUserAgent(const QString &userAgent)
emit propertyChanged("httpUserAgent", userAgent);
}
-void WebProfile::setHttpHeader(const QString& name, const QString& value)
+void WebProfile::setHttpHeader(const QString &name, const QString &value)
{
m_headers[name.toLatin1()] = value.toLatin1();
emit headerChanged(name, value);
}
-void WebProfile::removeHttpHeader(const QString& name)
+void WebProfile::removeHttpHeader(const QString &name)
{
if(m_headers.contains(name.toLatin1())) {
m_headers.remove(name.toLatin1());
diff --git a/lib/web/webprofile.h b/lib/webprofile/webprofile.h
index a3b5b12..37e3419 100644
--- a/lib/web/webprofile.h
+++ b/lib/webprofile/webprofile.h
@@ -10,12 +10,12 @@
#define SMOLBOTE_WEBENGINEPROFILE_H
#include <QHash>
-#include <QUrl>
+#include <QMap>
+#include <QNetworkCookie>
#include <QString>
-#include <QWebEngineProfile>
+#include <QUrl>
#include <QVector>
-#include <QNetworkCookie>
-#include <QMap>
+#include <QWebEngineProfile>
#include <QWebEngineSettings>
#include <profileinterface.h>
diff --git a/lib/webprofile/webprofilemanager.cpp b/lib/webprofile/webprofilemanager.cpp
new file mode 100644
index 0000000..d22b75c
--- /dev/null
+++ b/lib/webprofile/webprofilemanager.cpp
@@ -0,0 +1,150 @@
+/*
+ * This file is part of smolbote. It's copyrighted by the contributors recorded
+ * in the version control history of the file, available from its original
+ * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote
+ *
+ * SPDX-License-Identifier: GPL-3.0
+ */
+
+#include "webprofilemanager.h"
+#include "webprofile.h"
+#include <QFileInfo>
+#include <QWebEngineSettings>
+
+WebProfileManager::WebProfileManager(const QHash<QString, QString> &profileSection, QObject *parent)
+ : QObject(parent)
+ , defaults(profileSection)
+{
+}
+
+WebProfileManager::~WebProfileManager()
+{
+ for(Profile p : profiles) {
+ if(p.selfDestruct && p.settings != nullptr) {
+ if(!p.ptr->isOffTheRecord()) {
+ if(!p.ptr->persistentStoragePath().isEmpty())
+ QDir(p.ptr->persistentStoragePath()).removeRecursively();
+ if(!p.ptr->cachePath().isEmpty())
+ QDir(p.ptr->cachePath()).removeRecursively();
+ }
+ delete p.settings;
+ QFile::remove(p.settings->fileName());
+ } else if(p.settings != nullptr) {
+#ifdef QT_DEBUG
+ qDebug("sync %s", qUtf8Printable(p.settings->fileName()));
+#endif
+ p.settings->sync();
+ delete p.settings;
+ }
+ }
+}
+
+WebProfile *WebProfileManager::profile(const QString &id, const QString &path, bool isOffTheRecord)
+{
+ // Check if profile exists
+ if(profiles.contains(id))
+ return profiles.value(id).ptr;
+
+ Profile profile;
+
+ if(!path.isEmpty())
+ profile.settings = new QSettings(path, QSettings::IniFormat);
+
+ // QWebEngineCore cleans up profiles automatically, so no need to set parent
+ profile.ptr = [id, isOffTheRecord, profile]() {
+ if(isOffTheRecord)
+ return new WebProfile(/* name */ profile.value("name", id).toString(), /* parent */ nullptr);
+ else
+ return new WebProfile(/* storageName */ id, /* name */ profile.value("name", id).toString(), /* parent */ nullptr);
+ }();
+ if(profile.settings != nullptr)
+ profile.settings->setParent(profile.ptr);
+
+ connect(profile.ptr, &WebProfile::nameChanged, profile.settings, [profile](const QString &name) {
+ profile.settings->setValue("name", name);
+ });
+
+ profile.ptr->setSearch(profile.value("search", defaults.value("profile.search")).toString());
+ connect(profile.ptr, &WebProfile::searchChanged, profile.settings, [profile](const QString &url) {
+ profile.settings->setValue("search", url);
+ });
+
+ profile.ptr->setHomepage(profile.value("homepage", defaults.value("profile.homepage")).toUrl());
+ connect(profile.ptr, &WebProfile::homepageChanged, profile.settings, [profile](const QUrl &url) {
+ profile.settings->setValue("homepage", url);
+ });
+
+ profile.ptr->setNewtab(profile.value("newtab", defaults.value("profile.newtab")).toUrl());
+ connect(profile.ptr, &WebProfile::newtabChanged, profile.settings, [profile](const QUrl &url) {
+ profile.settings->setValue("newtab", url);
+ });
+
+ if(profile.settings != nullptr) {
+ profile.settings->beginGroup("properties");
+ {
+ const auto keys = profile.settings->childKeys();
+ for(const QString &key : keys) {
+ profile.ptr->setProperty(qUtf8Printable(key), profile.settings->value(key));
+ }
+ }
+ profile.settings->endGroup(); // properties
+ connect(profile.ptr, &WebProfile::propertyChanged, [profile](const QString &property, const QVariant &value) {
+ profile.settings->setValue("properties/" + property, value);
+ });
+
+ profile.settings->beginGroup("attributes");
+ {
+ const auto keys = profile.settings->childKeys();
+ auto *settings = profile.ptr->settings();
+ for(const QString &key : keys) {
+ auto attribute = static_cast<QWebEngineSettings::WebAttribute>(key.toInt());
+ settings->setAttribute(attribute, profile.settings->value(key).toBool());
+ }
+ }
+ profile.settings->endGroup();
+ connect(profile.ptr, &WebProfile::attributeChanged, [profile](const QWebEngineSettings::WebAttribute attr, const bool value) {
+ profile.settings->setValue("attributes/" + QString::number(attr), value);
+ });
+
+ // headers
+ profile.settings->beginGroup("headers");
+ for(const QString &key : profile.settings->childKeys()) {
+ profile.ptr->setHttpHeader(key.toLatin1(), profile.settings->value(key).toString().toLatin1());
+ }
+ profile.settings->endGroup();
+ connect(profile.ptr, &WebProfile::headerChanged, [profile](const QString &name, const QString &value) {
+ profile.settings->setValue("headers/" + name, value);
+ });
+ connect(profile.ptr, &WebProfile::headerRemoved, [profile](const QString &name) {
+ profile.settings->remove("headers/" + name);
+ });
+
+ } // profile.settings != nullptr
+
+ profiles[id] = profile;
+ return profile.ptr;
+}
+
+void WebProfileManager::deleteProfile(const QString &id)
+{
+ if(profiles.contains(id)) {
+ profiles[id].selfDestruct = true;
+ }
+}
+
+void WebProfileManager::profileMenu(QMenu *menu, std::function<void(WebProfile *)> callback, WebProfile *current, bool checkable) const
+{
+ auto *group = new QActionGroup(menu);
+ connect(menu, &QMenu::aboutToHide, group, &QActionGroup::deleteLater);
+
+ for(const auto &profile : profiles) {
+ auto *action = menu->addAction(profile.ptr->name(), profile.ptr, [profile, callback]() {
+ callback(profile.ptr);
+ });
+ action->setCheckable(checkable);
+ if(profile.ptr == current)
+ action->setChecked(true);
+ group->addAction(action);
+ }
+}
+
diff --git a/lib/webprofile/webprofilemanager.h b/lib/webprofile/webprofilemanager.h
new file mode 100644
index 0000000..822dc7d
--- /dev/null
+++ b/lib/webprofile/webprofilemanager.h
@@ -0,0 +1,78 @@
+/*
+ * This file is part of smolbote. It's copyrighted by the contributors recorded
+ * in the version control history of the file, available from its original
+ * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote
+ *
+ * SPDX-License-Identifier: GPL-3.0
+ */
+
+#ifndef SMOLBOTE_WEBPROFILEMANAGER_H
+#define SMOLBOTE_WEBPROFILEMANAGER_H
+
+#include "webprofile.h"
+#include <QDir>
+#include <QFile>
+#include <QMap>
+#include <QMenu>
+#include <QObject>
+#include <QSettings>
+#include <functional>
+
+class WebProfileManager : public QObject
+{
+ Q_OBJECT
+public:
+ explicit WebProfileManager(const QHash<QString, QString> &profileSection, QObject *parent);
+ ~WebProfileManager();
+
+ /** Create a profile with specified id
+ * param id The profile ID
+ * param path The path to the profile settings
+ * param isOffTheRecord Off-the-record toggle
+ * return WebProfile* The profile, or nullptr if one could not be created
+ */
+ WebProfile *profile(const QString &id, const QString &path = QString(), bool isOffTheRecord = true);
+
+ /** Set a profile for deletion
+ * param id The profile ID
+ * return void
+ */
+ void deleteProfile(const QString &id);
+
+ void profileMenu(QMenu *menu, std::function<void(WebProfile *)> callback, WebProfile *current = nullptr, bool checkable = false) const;
+
+ const QStringList idList() const
+ {
+ return profiles.keys();
+ }
+ QString id(WebProfile *profile) const
+ {
+ QMapIterator<QString, Profile> i(profiles);
+ while(i.hasNext()) {
+ i.next();
+ if(i.value().ptr == profile)
+ return i.key();
+ }
+ return QString();
+ }
+
+private:
+ struct Profile {
+ WebProfile *ptr = nullptr;
+ QSettings *settings = nullptr;
+ bool selfDestruct = false;
+
+ QVariant value(const QString &key, const QVariant &defaultValue) const
+ {
+ if(settings == nullptr)
+ return defaultValue;
+ else
+ return settings->value(key, defaultValue);
+ }
+ };
+
+ QMap<QString, Profile> profiles;
+ const QHash<QString, QString> defaults;
+};
+
+#endif // SMOLBOTE_PROFILEMANAGER_H