aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt69
-rw-r--r--src/about/CMakeLists.txt12
-rw-r--r--src/about/aboutdialog.cpp6
-rw-r--r--src/about/meson.build21
-rw-r--r--src/applicationmenu.cpp12
-rw-r--r--src/bookmarks/bookmarkstoolbar.cpp6
-rw-r--r--src/browser.cpp39
-rw-r--r--src/main.cpp166
-rw-r--r--src/mainwindow/addressbar.cpp4
-rw-r--r--src/mainwindow/mainwindow.cpp8
-rw-r--r--src/mainwindow/menubar.cpp29
-rw-r--r--src/mainwindow/widgets/navigationbar.cpp14
-rw-r--r--src/mainwindow/widgets/searchform.cpp4
-rw-r--r--src/meson.build60
-rw-r--r--src/session/sessiondialog.h1
-rw-r--r--src/settings.h.in32
-rw-r--r--src/subwindow/subwindow.cpp3
-rw-r--r--src/subwindow/tabwidget.cpp16
-rw-r--r--src/util.cpp2
-rw-r--r--src/version.h.in8
-rw-r--r--src/webengine/CMakeLists.txt10
-rw-r--r--src/webengine/webpage.cpp4
-rw-r--r--src/webengine/webpage.h4
-rw-r--r--src/webengine/webprofile.cpp2
-rw-r--r--src/webengine/webprofilemanager.cpp1
-rw-r--r--src/webengine/webprofilemanager.h13
-rw-r--r--src/webengine/webview.cpp14
-rw-r--r--src/webengine/webviewcontextmenu.cpp97
28 files changed, 246 insertions, 411 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000..f80dbc7
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,69 @@
+# version.h
+configure_file(version.h.in version.h)
+
+add_executable(poi
+ applicationmenu.cpp
+ applicationmenu.h
+ bookmarks/bookmarksform.ui
+ bookmarks/bookmarkstoolbar.cpp
+ bookmarks/bookmarkstoolbar.h
+ bookmarks/bookmarkswidget.cpp
+ bookmarks/bookmarkswidget.h
+ #bookmarks/builtins.cpp
+ bookmarks/editbookmarkdialog.cpp
+ bookmarks/editbookmarkdialog.h
+ bookmarks/editbookmarkdialog.ui
+ browser.cpp
+ browser.h
+ #builtins.cpp
+ #builtins.h
+ #crashhandler.cpp
+ #crashhandler.h
+ #crashhandler_dummy.cpp
+ main.cpp
+ mainwindow/addressbar.cpp
+ mainwindow/addressbar.h
+ mainwindow/addressbar.ui
+ mainwindow/mainwindow.cpp
+ mainwindow/mainwindow.h
+ mainwindow/menubar.cpp
+ mainwindow/menubar.h
+ mainwindow/widgets/completer.cpp
+ mainwindow/widgets/completer.h
+ mainwindow/widgets/dockwidget.cpp
+ mainwindow/widgets/dockwidget.h
+ mainwindow/widgets/menusearch.cpp
+ mainwindow/widgets/menusearch.h
+ mainwindow/widgets/navigationbar.cpp
+ mainwindow/widgets/navigationbar.h
+ mainwindow/widgets/searchform.cpp
+ mainwindow/widgets/searchform.h
+ mainwindow/widgets/searchform.ui
+ mainwindow/widgets/urllineedit.cpp
+ mainwindow/widgets/urllineedit.h
+ session/savesessiondialog.cpp
+ session/savesessiondialog.h
+ session/savesessiondialog.ui
+ session/sessiondialog.cpp
+ session/sessiondialog.h
+ session/sessiondialog.ui
+ subwindow/subwindow.cpp
+ subwindow/subwindow.h
+ subwindow/tabwidget.cpp
+ subwindow/tabwidget.h
+ util.cpp
+ util.h
+ wallet/wallet.cpp
+ wallet/wallet.h
+
+ # resources
+ ${PROJECT_SOURCE_DIR}/data/resources.qrc
+)
+target_include_directories(poi PRIVATE ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+target_enable_warnings(poi)
+target_link_libraries(poi
+ PRIVATE SingleApplication::SingleApplication spdlog::spdlog
+ PRIVATE bookmarks configuration downloads session_formats urlfilter
+ PRIVATE about webengine
+)
+
diff --git a/src/about/CMakeLists.txt b/src/about/CMakeLists.txt
new file mode 100644
index 0000000..f1e2c41
--- /dev/null
+++ b/src/about/CMakeLists.txt
@@ -0,0 +1,12 @@
+add_library(about STATIC
+ aboutdialog.cpp aboutdialog.h aboutdialog.ui
+ aboutplugin.cpp aboutplugin.h aboutplugin.ui
+)
+target_link_libraries(about PUBLIC Qt6::Widgets Qt6::SvgWidgets)
+target_include_directories(about PUBLIC ${CMAKE_CURRENT_LIST_DIR})
+
+# tests
+add_executable(test_about test/main.cpp)
+target_link_libraries(test_about PRIVATE about)
+add_test(NAME about_dialog COMMAND $<TARGET_FILE:test_about> -platform offscreen)
+set_property(TEST about_dialog PROPERTY ENVIRONMENT autoclose=1)
diff --git a/src/about/aboutdialog.cpp b/src/about/aboutdialog.cpp
index 894b1ec..1013866 100644
--- a/src/about/aboutdialog.cpp
+++ b/src/about/aboutdialog.cpp
@@ -8,7 +8,6 @@
#include "aboutdialog.h"
#include "ui_aboutdialog.h"
-#include <version.h>
// compiler
// clang also defines __GNUC__, so we need to check for clang first
@@ -59,7 +58,7 @@ AboutDialog::AboutDialog(QWidget *parent)
"<p>This program is distributed in the hope that it will be useful, but without any warranty.</p>"
"<p>You can read the full terms of the license on <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>the GNU website</a>.</p>"));
- ui->detailsLabel->setText(tr("<p>Version " poi_Version "</p>"
+ ui->detailsLabel->setText(tr("<p>Version %1</p>"
"<p>Compiled with " compiler "</p>"
"<p>Libraries: <ul>"
"<li><a href='https://www.qt.io/'>Qt5</a> " QT_VERSION_STR "</li>"
@@ -69,7 +68,8 @@ AboutDialog::AboutDialog(QWidget *parent)
#ifdef CONFIG_USEBREAKPAD
"<li><a href='https://chromium.googlesource.com/breakpad/breakpad'>Breakpad</a></li>"
#endif
- "</ul></p>"));
+ "</ul></p>")
+ .arg(qApp->applicationVersion()));
}
AboutDialog::~AboutDialog()
diff --git a/src/about/meson.build b/src/about/meson.build
deleted file mode 100644
index 49274a8..0000000
--- a/src/about/meson.build
+++ /dev/null
@@ -1,21 +0,0 @@
-about_moc = mod_qt5.preprocess(
- moc_headers: ['aboutdialog.h', 'aboutplugin.h'],
- ui_files: ['aboutdialog.ui', 'aboutplugin.ui'],
- dependencies: dep_qt5
-)
-
-dep_about = declare_dependency(
- include_directories: '.',
- link_with: static_library('about',
- [ 'aboutdialog.cpp', 'aboutplugin.cpp', about_moc, version_h],
- dependencies: [dep_qt5])
-)
-
-poi_sourceset.add(dep_about)
-
-test('about dialog', executable('about',
- sources: 'test/main.cpp',
- dependencies: [ dep_qt5, dep_about, dep_catch ]),
- args: [ '-platform', 'offscreen' ],
- env: 'autoclose=1'
-)
diff --git a/src/applicationmenu.cpp b/src/applicationmenu.cpp
index dc888e7..aff5576 100644
--- a/src/applicationmenu.cpp
+++ b/src/applicationmenu.cpp
@@ -22,31 +22,31 @@ ApplicationMenu::ApplicationMenu(Browser *app, QWidget *parent)
setTitle(qApp->applicationName());
Configuration conf;
- const auto sessionPath = conf.value<QString>("session.path").value();
+ const auto sessionPath = conf.value<QString>("session/path").value();
auto *actionSaveSession = addAction(tr("Save Session"), this, [sessionPath]() {
auto *sessionDialog = new SaveSessionDialog(nullptr);
if(sessionDialog->exec() == QDialog::Accepted) {
sessionDialog->save(sessionPath);
}
});
- conf.shortcut<QAction>(*actionSaveSession, "shortcuts.session.save");
+ conf.shortcut<QAction>(*actionSaveSession, "shortcuts/session.save");
auto *actionOpenSession = addAction(tr("Open Session"), this, []() {
auto *sessionDialog = new SessionDialog(nullptr);
sessionDialog->exec();
});
- conf.shortcut<QAction>(*actionOpenSession, "shortcuts.session.open");
+ conf.shortcut<QAction>(*actionOpenSession, "shortcuts/session.open");
bottom_pluginSeparator = addSeparator();
auto *actionAbout = addAction(tr("About"), app, &Browser::about);
- conf.shortcut<QAction>(*actionAbout, "shortcuts.window.about");
+ conf.shortcut<QAction>(*actionAbout, "shortcuts/window.about");
auto *action_aboutPlugins = addAction(tr("About Plugins"), app, &Browser::aboutPlugins);
- conf.shortcut(*action_aboutPlugins, "app.shortcuts.about.plugins");
+ conf.shortcut(*action_aboutPlugins, "shortcuts/about.plugins");
auto *actionQuit = addAction(tr("Quit"), app, &Browser::quit);
- conf.shortcut<QAction>(*actionQuit, "shortcuts.window.quit");
+ conf.shortcut<QAction>(*actionQuit, "shortcuts/window.quit");
}
void ApplicationMenu::addPlugin(QPluginLoader *plugin)
diff --git a/src/bookmarks/bookmarkstoolbar.cpp b/src/bookmarks/bookmarkstoolbar.cpp
index 52dcae2..3174874 100644
--- a/src/bookmarks/bookmarkstoolbar.cpp
+++ b/src/bookmarks/bookmarkstoolbar.cpp
@@ -18,10 +18,10 @@ BookmarksToolbar::BookmarksToolbar(const BookmarkModel *model, MainWindow *paren
m_window = parent;
Configuration conf;
- setObjectName("bookmarks.toolbar");
+ setObjectName("bookmarks/toolbar");
setWindowTitle(tr("Bookmarks Toolbar"));
- setMovable(conf.value<bool>("bookmarks.toolbar.movable").value());
- setVisible(conf.value<bool>("bookmarks.toolbar.visible").value());
+ setMovable(conf.value<bool>("bookmarks/toolbar.movable").value());
+ setVisible(conf.value<bool>("bookmarks/toolbar.visible").value());
setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
const auto *root = model->root();
diff --git a/src/browser.cpp b/src/browser.cpp
index f748e2f..74da540 100644
--- a/src/browser.cpp
+++ b/src/browser.cpp
@@ -31,7 +31,7 @@
#include <QTimer>
#include <QTranslator>
#include <QVersionNumber>
-#include <pluginloader.h>
+// #include <pluginloader.h>
#include <spdlog/spdlog.h>
#include <version.h>
@@ -40,11 +40,11 @@ Browser::Browser(int &argc, char *argv[], bool allowSecondary)
{
Configuration conf;
- setApplicationName(conf.value<QString>("poi.name").value());
- setWindowIcon(QIcon(conf.value<QString>("poi.icon").value()));
+ setApplicationName(conf.value<QString>("poi/name").value());
+ setWindowIcon(QIcon(conf.value<QString>("poi/icon").value()));
setApplicationVersion(QVersionNumber::fromString(QLatin1String(poi_Version)).toString());
- if(const auto _translation = conf.value<QString>("browser.translation")) {
+ if(const auto _translation = conf.value<QString>("browser/translation")) {
auto *translator = new QTranslator(this);
if(translator->load(_translation.value()))
installTranslator(translator);
@@ -52,7 +52,7 @@ Browser::Browser(int &argc, char *argv[], bool allowSecondary)
delete translator;
}
- if(const auto _locale = conf.value<QString>("browser.locale")) {
+ if(const auto _locale = conf.value<QString>("browser/locale")) {
auto *locale = new QTranslator(this);
if(locale->load("qt_" + _locale.value(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
installTranslator(locale);
@@ -60,11 +60,11 @@ Browser::Browser(int &argc, char *argv[], bool allowSecondary)
delete locale;
}
- if(auto iconTheme = conf.value<QString>("browser.iconTheme")) {
+ if(auto iconTheme = conf.value<QString>("browser/iconTheme")) {
QIcon::setThemeName(iconTheme.value());
}
- if(auto stylesheet = conf.value<QString>("browser.stylesheet")) {
+ if(auto stylesheet = conf.value<QString>("browser/stylesheet")) {
QFile f(stylesheet.value());
if(f.open(QIODevice::ReadOnly)) {
setStyleSheet(f.readAll());
@@ -74,11 +74,11 @@ Browser::Browser(int &argc, char *argv[], bool allowSecondary)
// load profiles
{
- const auto profiles = Util::files(conf.value<QString>("profile.path").value(), { "*.profile" });
- const auto search = conf.value<QString>("profile.search").value();
- const auto homepage = QUrl::fromUserInput(conf.value<QString>("profile.homepage").value());
- const auto newtab = QUrl::fromUserInput(conf.value<QString>("profile.newtab").value());
- const auto default_id = conf.value<QString>("profile.default").value();
+ const auto profiles = Util::files(conf.value<QString>("profile/path").value(), { "*.profile" });
+ const auto search = conf.value<QString>("profile/search").value();
+ const auto homepage = QUrl::fromUserInput(conf.value<QString>("profile/homepage").value());
+ const auto newtab = QUrl::fromUserInput(conf.value<QString>("profile/newtab").value());
+ const auto default_id = conf.value<QString>("profile/default").value();
m_profileManager = std::make_unique<WebProfileManager<false>>(profiles, default_id, search, homepage, newtab);
m_profileManager->make_global();
@@ -92,13 +92,13 @@ Browser::Browser(int &argc, char *argv[], bool allowSecondary)
}
// downloads
- m_downloads = std::make_unique<DownloadsWidget>(conf.value<QString>("downloads.path").value());
+ m_downloads = std::make_unique<DownloadsWidget>(conf.value<QString>("downloads/path").value());
m_profileManager->walk([this](const QString &, WebProfile *profile, QSettings *) {
connect(profile, &QWebEngineProfile::downloadRequested, m_downloads.get(), &DownloadsWidget::addDownload);
});
// bookmarks
- m_bookmarks = std::make_shared<BookmarksWidget>(QString::fromStdString(conf.value<std::string>("bookmarks.path").value()));
+ m_bookmarks = std::make_shared<BookmarksWidget>(QString::fromStdString(conf.value<std::string>("bookmarks/path").value()));
connect(m_bookmarks.get(), &BookmarksWidget::openUrl, this, [this](const QUrl &url) {
m_windows.last()->createTab(url);
});
@@ -142,22 +142,31 @@ bool Browser::loadPlugin(const QString &path)
}
Configuration conf;
+ bool loaded = false;
+
+#ifdef HAVE_PLUGINLOADER
const auto state = PluginLoader::signature_state(
conf.value<bool>("plugins.signature.ignored").value(),
conf.value<bool>("plugins.signature.checked").value(),
conf.value<bool>("plugins.signature.enforced").value());
auto *loader = new PluginLoader(path, state, this);
- const bool loaded = loader->load();
+ loaded = loader->load();
+#endif
if(!loaded) {
+#ifdef HAVE_PLUGINLOADER
delete loader;
+#endif
return false;
}
+#ifdef HAVE_PLUGINLOADER
auto *info = new PluginInfo(loader);
m_plugins.append(info);
emit pluginAdded(loader);
+#endif
+
return true;
}
diff --git a/src/main.cpp b/src/main.cpp
index dad1f73..8cd1d34 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -7,36 +7,15 @@
*/
#include "browser.h"
-#include "builtins.h"
#include "configuration.h"
-#include "crashhandler.h"
#include "session/sessiondialog.h"
#include "session_json.hpp"
-#include "settings.h"
-#include "util.h"
-#include "version.h"
+#include <QCommandLineParser>
#include <QFile>
#include <QPluginLoader>
#include <QStandardPaths>
-#include <iostream>
-#include <memory>
-#include <pluginloader.h>
#include <spdlog/spdlog.h>
-// a helper function to join the keys of a command_map into a string
-inline std::string join_keys(const command_map &map, const std::string sep = ", ")
-{
- std::vector<std::string> keys(map.size());
- std::transform(map.begin(), map.end(), keys.begin(), [](auto pair) { return pair.first; });
- std::sort(keys.begin(), keys.end());
-
- std::string k;
- std::for_each(keys.begin(), keys.end() - 1, [&k, &sep](const std::string &piece) { k += piece + sep; });
- k += keys.back();
-
- return k;
-}
-
int main(int argc, char **argv)
{
// change log pattern
@@ -45,104 +24,71 @@ int main(int argc, char **argv)
spdlog::set_level(spdlog::level::debug); // Set global log level to debug
#endif
- const command_map commands{
- { "configuration", builtins::configuration },
- { "bookmarks", builtins::bookmarks },
- };
-
- const std::vector<std::string> args(argv + 1, argv + argc);
- args::ArgumentParser parser("smolbote: yet another no-frills browser", "Subcommands: " + join_keys(commands));
- parser.Prog(argv[0]);
-
- args::HelpFlag cmd_help(parser, "help", "Display this help message.", { 'h', "help" });
- args::Flag cmd_version(parser, "version", "Display version information.", { 'v', "version" });
- args::Flag cmd_build(parser, "build", "Display build commit.", { 'b', "build" });
-
- args::ValueFlag<std::string> cmd_config(parser, "config", "Set the configuration file.", { 'c', "config" });
-
- args::Flag cmd_noRemote(parser, "no-remote", "Do not accept or send remote commands.", { "no-remote" });
-
- args::Flag cmd_pickSession(parser, "pick-session", "Show all available sessions and select which one to open", { "pick-session" });
- args::ValueFlag<std::string> cmd_session(parser, "session", "Open the specified session.", { 's', "session" });
-
- args::PositionalList<std::string> cmd_args(parser, "URL(s)", "List of URLs to open");
- cmd_args.KickOut(true);
-
- try {
- auto next = parser.ParseArgs(args);
-
- if(cmd_version)
- return builtins::version();
- if(cmd_build)
- return builtins::build();
-
- // create and load configuration
- spdlog::debug("Loading configuration {}", init_conf(args::get(cmd_config)));
-
- if(cmd_args) {
- const auto front = args::get(cmd_args).front();
- const auto cmd = commands.find(front);
- if(cmd != commands.end()) {
- return cmd->second(argv[0], next, std::end(args));
+ QCommandLineParser parser;
+ parser.addHelpOption();
+ parser.addVersionOption();
+ parser.addPositionalArgument("url", "URLs to open");
+
+ // generic options
+ QCommandLineOption cmd_config({ "c", "config" }, "Set the configuration file.", "path");
+ parser.addOption(cmd_config);
+
+ QCommandLineOption cmd_session({ "s", "session" }, "Open the specified session.", "path");
+ parser.addOption(cmd_session);
+
+ QCommandLineOption cmd_pick_session("pick-session", "Show all available sessions and select which one to open.");
+ parser.addOption(cmd_pick_session);
+
+ // Qt options
+ QCommandLineOption cmd_renderer("renderer", "Select the OpenGL renderer used by the application. Available options are: desktop, gles, software", "value");
+ parser.addOption(cmd_renderer);
+
+ // SingleApplication options
+ QCommandLineOption cmd_no_remote("no-remote", "Start a new instance that won't accept or send remote commands.");
+ parser.addOption(cmd_no_remote);
+
+ { // handle command line options that need to be set before the QApplication object is created
+ QStringList args;
+ for(int i = 0; i < argc; ++i)
+ args.append(argv[i]);
+ parser.parse(args);
+
+ // the OpenGL implementation needs to be manually set to software if it's not properly configured
+ if(parser.isSet(cmd_renderer)) {
+ const auto value = parser.value(cmd_renderer);
+ if(value == QLatin1String("desktop")) {
+ QApplication::setAttribute(Qt::AA_UseDesktopOpenGL, true);
+ } else if(value == QLatin1String("gles")) {
+ QApplication::setAttribute(Qt::AA_UseOpenGLES, true);
+ } else if(value == QLatin1String("software")) {
+ QApplication::setAttribute(Qt::AA_UseSoftwareOpenGL, true);
+ } else {
+ spdlog::error("Unknown cmd_renderer flag: {}", qUtf8Printable(value));
}
}
-
- } catch(args::Help &) {
- std::cout << parser;
- return 0;
-
- } catch(args::Error &e) {
- std::cerr << e.what() << std::endl;
- std::cerr << parser;
- return -1;
}
- // argc, argv, allowSecondary
- Browser app(argc, argv);
// set this, otherwise the webview becomes black when using a stylesheet
- app.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true);
-
- {
- Configuration conf;
-
- if(conf.value<bool>("usebreakpad").value()) {
- CrashHandler::Context ctx(
- conf.value<std::string>("path.crashdump").value(),
- conf.value<std::string>("path.crashhandler").value());
+ QApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true);
- if(CrashHandler::install_handler(ctx)) {
- spdlog::info("Installed breakpad crash handler: {}", ctx.dumppath);
- } else {
- spdlog::warn("Failed to install breakpad crash handler: {}", ctx.dumppath);
- }
- }
+ spdlog::info("Loaded configuration: {}", Configuration::init_global(parser.value(cmd_config).toStdString()));
- // load plugins
- for(const QString &path : Util::files(conf.value<QString>("plugins.path").value(), { "*.so", "*.dll" })) {
- if(app.loadPlugin(path)) {
- spdlog::debug("Loaded plugin [{}]", qUtf8Printable(path));
- } else {
- spdlog::warn("Failed loading plugin [{}]", qUtf8Printable(path));
- }
- }
- }
+ Browser app(argc, argv);
+ parser.process(app);
const auto profile = []() {
- Configuration c;
- return c.value<QString>("profile.default").value();
+ Configuration conf;
+ return conf.value<QString>("profile/default").value();
}();
- QStringList urls;
- for(const auto &u : args::get(cmd_args)) {
- urls.append(QString::fromStdString(u));
- }
+ QStringList urls = parser.positionalArguments();
if(urls.isEmpty()) {
urls.append(QString());
}
// if app is primary, create new sessions from received messages
- if(app.isPrimary() && !cmd_noRemote) {
- QObject::connect(&app, &Browser::receivedMessage, &app, [&app](quint32 instanceId, QByteArray message) {
+ if(app.isPrimary() && !parser.isSet(cmd_no_remote)) {
+ QObject::connect(&app, &Browser::receivedMessage, &app, [&app](quint32 instanceId, const QByteArray &message) {
Q_UNUSED(instanceId);
JsonSession session(message);
app.open(session.get());
@@ -151,13 +97,13 @@ int main(int argc, char **argv)
{
const auto session = [&]() {
- if(cmd_session) {
- QFile sessionJson(QString::fromStdString(args::get(cmd_session)));
+ if(parser.isSet(cmd_session)) {
+ QFile sessionJson(parser.value(cmd_session));
if(sessionJson.open(QIODevice::ReadOnly | QIODevice::Text)) {
return JsonSession(sessionJson.readAll());
}
}
- if(cmd_pickSession) {
+ if(parser.isSet(cmd_pick_session)) {
SessionDialog dlg;
if(const auto pick = dlg.pickSession()) {
return JsonSession(pick.value());
@@ -166,13 +112,13 @@ int main(int argc, char **argv)
return JsonSession(profile, urls);
}();
- if(app.isPrimary() || cmd_noRemote) {
+ if(app.isPrimary() || parser.isSet(cmd_no_remote)) {
app.open(session.get());
} else {
// app is secondary and not standalone
- return app.sendMessage(session.serialize());
+ return app.sendMessage(session.serialize()) ? EXIT_SUCCESS : EXIT_FAILURE;
}
}
- return app.exec();
+ return QApplication::exec();
}
diff --git a/src/mainwindow/addressbar.cpp b/src/mainwindow/addressbar.cpp
index d37a6a7..ed1cb3e 100644
--- a/src/mainwindow/addressbar.cpp
+++ b/src/mainwindow/addressbar.cpp
@@ -19,9 +19,9 @@ AddressBar::AddressBar(QWidget *parent)
ui->setupUi(this);
Configuration conf;
- ui->urlBar->menuAction->setShortcut(QKeySequence(conf.value<QString>("shortcuts.address.menu").value()));
+ ui->urlBar->menuAction->setShortcut(QKeySequence(conf.value<QString>("shortcuts/address.menu").value()));
- auto *focusShortcut = new QShortcut(QKeySequence(conf.value<QString>("shortcuts.address.focus").value()), parent);
+ auto *focusShortcut = new QShortcut(QKeySequence(conf.value<QString>("shortcuts/address.focus").value()), parent);
connect(focusShortcut, &QShortcut::activated, ui->urlBar, [this]() {
ui->urlBar->setFocus();
ui->urlBar->selectAll();
diff --git a/src/mainwindow/mainwindow.cpp b/src/mainwindow/mainwindow.cpp
index 64c149c..bd5d0c2 100644
--- a/src/mainwindow/mainwindow.cpp
+++ b/src/mainwindow/mainwindow.cpp
@@ -30,16 +30,16 @@ MainWindow::MainWindow(const Session::MainWindow &mainwindow_data, QMenu *appMen
Configuration config;
// create UI
- defaultWindowTitle = config.value<QString>("mainwindow.title").value();
+ defaultWindowTitle = config.value<QString>("mainwindow/title").value();
setWindowTitle(defaultWindowTitle);
- resize(config.value<int>("mainwindow.width").value(), config.value<int>("mainwindow.height").value());
- if(config.value<bool>("mainwindow.maximized").value_or(false)) {
+ resize(config.value<int>("mainwindow/width").value(), config.value<int>("mainwindow/height").value());
+ if(config.value<bool>("mainwindow/maximized").value_or(false)) {
setWindowState(Qt::WindowMaximized);
}
show();
navigationToolBar = new NavigationBar(this);
- navigationToolBar->setMovable(config.value<bool>("navigation.movable").value_or(false));
+ navigationToolBar->setMovable(config.value<bool>("navigation/movable").value_or(false));
addToolBar(Qt::TopToolBarArea, navigationToolBar);
navigationToolBar->connectWebView(nullptr);
diff --git a/src/mainwindow/menubar.cpp b/src/mainwindow/menubar.cpp
index 5fc039a..e479e8d 100644
--- a/src/mainwindow/menubar.cpp
+++ b/src/mainwindow/menubar.cpp
@@ -79,30 +79,30 @@ MenuBar::MenuBar(QMenu *appMenu, MainWindow *parent)
auto *actionBookmarks = window->addAction(tr("Bookmarks"), browser, [browser, parent]() {
browser->showWidget(browser->bookmarks(), parent);
});
- conf.shortcut<QAction>(*actionBookmarks, "shortcuts.window.bookmarks.show");
+ conf.shortcut<QAction>(*actionBookmarks, "shortcuts/window.bookmarks.show");
auto *actionDownloads = window->addAction(tr("Downloads"), browser, [browser, parent]() {
browser->showWidget(browser->downloads(), parent);
});
- conf.shortcut<QAction>(*actionDownloads, "shortcuts.window.downloads.show");
+ conf.shortcut<QAction>(*actionDownloads, "shortcuts/window.downloads.show");
window->addSeparator();
auto *actionNewWindow = window->addAction(tr("New Window"), browser, [browser]() {
const Session::MainWindow window_data;
browser->open({ window_data }, false);
});
- conf.shortcut<QAction>(*actionNewWindow, "shortcuts.window.newwindow");
+ conf.shortcut<QAction>(*actionNewWindow, "shortcuts/window.newwindow");
auto *actionNewSubwindow = window->addAction(tr("New Subwindow"), parent, [parent]() {
const Session::SubWindow session;
parent->createSubWindow(session);
});
- conf.shortcut<QAction>(*actionNewSubwindow, "shortcuts.window.newgroup");
+ conf.shortcut<QAction>(*actionNewSubwindow, "shortcuts/window.newgroup");
auto *actionCloseSubwindow = window->addAction(tr("Close Subwindow"), parent, [parent]() {
parent->currentSubWindow()->close();
});
- conf.shortcut<QAction>(*actionCloseSubwindow, "shortcuts.subwindow.close");
+ conf.shortcut<QAction>(*actionCloseSubwindow, "shortcuts/subwindow.close");
window->addSeparator()->setText(tr("Toolbars"));
@@ -140,7 +140,7 @@ MenuBar::MenuBar(QMenu *appMenu, MainWindow *parent)
_subwindow->setCurrentTab(index);
});
});
- conf.shortcut<QAction>(*actionNewTab, "shortcuts.subwindow.newtab");
+ conf.shortcut<QAction>(*actionNewTab, "shortcuts/subwindow.newtab");
subwindow->addSeparator();
@@ -150,7 +150,7 @@ MenuBar::MenuBar(QMenu *appMenu, MainWindow *parent)
_subwindow->setCurrentTab(index);
});
});
- conf.shortcut<QAction>(*actionRestoreTab, "shortcuts.subwindow.restoretab");
+ conf.shortcut<QAction>(*actionRestoreTab, "shortcuts/subwindow.restoretab");
auto *restoreTabsMenu = subwindow->addMenu(tr("Restore previous tab"));
connect(restoreTabsMenu, &QMenu::aboutToShow, parent, [parent, restoreTabsMenu]() {
@@ -200,28 +200,28 @@ MenuBar::MenuBar(QMenu *appMenu, MainWindow *parent)
_subwindow->setCurrentTab(qMax(0, currentIdx - 1));
});
});
- conf.shortcut<QAction>(*leftTab, "shortcuts.subwindow.tableft");
+ conf.shortcut<QAction>(*leftTab, "shortcuts/subwindow.tableft");
auto *moveTabLeft = subwindow->addAction(tr("Move tab left"), parent, [parent]() {
run_if(parent->currentSubWindow(), [](SubWindow *_subwindow, int currentIdx) {
_subwindow->moveTab(currentIdx, currentIdx - 1);
});
});
- conf.shortcut<QAction>(*moveTabLeft, "shortcuts.subwindow.movetableft");
+ conf.shortcut<QAction>(*moveTabLeft, "shortcuts/subwindow.movetableft");
auto *rightTab = subwindow->addAction(tr("Switch to tab on the right"), parent, [parent]() {
run_if(parent->currentSubWindow(), [](SubWindow *_subwindow, int currentIdx) {
_subwindow->setCurrentTab(qMin(currentIdx + 1, _subwindow->tabCount() - 1));
});
});
- conf.shortcut<QAction>(*rightTab, "shortcuts.subwindow.tabright");
+ conf.shortcut<QAction>(*rightTab, "shortcuts/subwindow.tabright");
auto *moveTabRight = subwindow->addAction(tr("Move tab right"), parent, [parent]() {
run_if(parent->currentSubWindow(), [](SubWindow *_subwindow, int currentIdx) {
_subwindow->moveTab(currentIdx, currentIdx + 1);
});
});
- conf.shortcut<QAction>(*moveTabRight, "shortcuts.subwindow.movetabright");
+ conf.shortcut<QAction>(*moveTabRight, "shortcuts/subwindow.movetabright");
subwindow->addSeparator();
@@ -230,7 +230,7 @@ MenuBar::MenuBar(QMenu *appMenu, MainWindow *parent)
_subwindow->closeTab(currentIdx);
});
});
- conf.shortcut<QAction>(*closeTab, "shortcuts.subwindow.closetab");
+ conf.shortcut<QAction>(*closeTab, "shortcuts/subwindow.closetab");
subwindow->addAction(tr("Close tabs to the left"), parent, [parent]() {
run_if(parent->currentSubWindow(), [](SubWindow *_subwindow, int currentIdx) {
@@ -329,10 +329,7 @@ MenuBar::MenuBar(QMenu *appMenu, MainWindow *parent)
auto *printer = new QPrinter(QPrinterInfo::defaultPrinter());
QPrintDialog dlg(printer, parent);
if(dlg.exec() == QDialog::Accepted) {
- parent->currentView()->page()->print(printer, [printer](bool success) {
- Q_UNUSED(success);
- delete printer;
- });
+ parent->currentView()->print(printer);
}
}
});
diff --git a/src/mainwindow/widgets/navigationbar.cpp b/src/mainwindow/widgets/navigationbar.cpp
index 799ebec..6da6f6c 100644
--- a/src/mainwindow/widgets/navigationbar.cpp
+++ b/src/mainwindow/widgets/navigationbar.cpp
@@ -29,7 +29,7 @@ NavigationBar::NavigationBar(QWidget *parent)
// Back button
backAction = addAction(Util::icon(QStyle::SP_ArrowBack), tr("Back"));
- config.shortcut<QAction>(*backAction, "shortcuts.navigation.back");
+ config.shortcut<QAction>(*backAction, "shortcuts/navigation.back");
connect(backAction, &QAction::triggered, this, [this]() {
m_view->history()->back();
});
@@ -47,7 +47,7 @@ NavigationBar::NavigationBar(QWidget *parent)
});
backAction->setMenu(backMenu);
- auto *backMenuShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts.navigation.backmenu").value()), this);
+ auto *backMenuShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts/navigation.backmenu").value()), this);
connect(backMenuShortcut, &QShortcut::activated, backMenu, [this, backMenu]() {
if(backAction->isEnabled()) {
auto *widget = this->widgetForAction(backAction);
@@ -57,7 +57,7 @@ NavigationBar::NavigationBar(QWidget *parent)
// Forward button
forwardAction = addAction(Util::icon(QStyle::SP_ArrowForward), tr("Forward"));
- config.shortcut<QAction>(*forwardAction, "shortcuts.navigation.forward");
+ config.shortcut<QAction>(*forwardAction, "shortcuts/navigation.forward");
connect(forwardAction, &QAction::triggered, this, [this]() {
m_view->history()->forward();
});
@@ -75,7 +75,7 @@ NavigationBar::NavigationBar(QWidget *parent)
});
forwardAction->setMenu(forwardMenu);
- auto *forwardMenuShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts.navigation.forwardmenu").value()), this);
+ auto *forwardMenuShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts/navigation.forwardmenu").value()), this);
connect(forwardMenuShortcut, &QShortcut::activated, forwardMenu, [this, forwardMenu]() {
if(forwardAction->isEnabled()) {
auto *widget = this->widgetForAction(forwardAction);
@@ -85,7 +85,7 @@ NavigationBar::NavigationBar(QWidget *parent)
// Stop/Refresh button
stopReloadAction = addAction(Util::icon(QStyle::SP_BrowserReload), tr("Refresh"));
- config.shortcut<QAction>(*stopReloadAction, "shortcuts.navigation.refresh");
+ config.shortcut<QAction>(*stopReloadAction, "shortcuts/navigation.refresh");
connect(stopReloadAction, &QAction::triggered, this, [this]() {
if(m_view->isLoaded())
m_view->reload();
@@ -93,14 +93,14 @@ NavigationBar::NavigationBar(QWidget *parent)
m_view->stop();
});
- auto *reloadShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts.navigation.reload").value()), this);
+ auto *reloadShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts/navigation.reload").value()), this);
connect(reloadShortcut, &QShortcut::activated, this, [this]() {
m_view->triggerPageAction(QWebEnginePage::ReloadAndBypassCache);
});
// Home button
homeAction = addAction(Util::icon(QStyle::SP_DirHomeIcon), tr("Home"));
- config.shortcut<QAction>(*homeAction, "shortcuts.navigation.home");
+ config.shortcut<QAction>(*homeAction, "shortcuts/navigation.home");
connect(homeAction, &QAction::triggered, this, [this]() {
m_view->load(m_view->profile()->homepage());
});
diff --git a/src/mainwindow/widgets/searchform.cpp b/src/mainwindow/widgets/searchform.cpp
index e10933b..af54f5c 100644
--- a/src/mainwindow/widgets/searchform.cpp
+++ b/src/mainwindow/widgets/searchform.cpp
@@ -10,6 +10,7 @@
#include "ui_searchform.h"
#include <QHideEvent>
#include <QShowEvent>
+#include <QWebEngineFindTextResult>
#include <QWebEngineView>
SearchForm::SearchForm(QWidget *parent)
@@ -26,7 +27,8 @@ SearchForm::SearchForm(QWidget *parent)
QWebEnginePage::FindFlags searchFlags;
searchFlags.setFlag(QWebEnginePage::FindCaseSensitively, ui->caseSensitivity_checkBox->isChecked());
searchFlags.setFlag(QWebEnginePage::FindBackward, ui->reverseSearch_checkBox->isChecked());
- m_view->findText(ui->lineEdit->text(), searchFlags, [this](bool found) {
+ m_view->findText(ui->lineEdit->text(), searchFlags, [this](const QWebEngineFindTextResult &result) {
+ const bool found = result.numberOfMatches() > 0;
ui->result_label->setVisible(!found);
});
}
diff --git a/src/meson.build b/src/meson.build
deleted file mode 100644
index 6a4abd8..0000000
--- a/src/meson.build
+++ /dev/null
@@ -1,60 +0,0 @@
-python = import('python')
-python3 = python.find_installation('python3')
-
-poi_settings_h = custom_target('default_config_value',
- input: files('../scripts/gen-default-cfg.py', '../Kconfig', '..'/host_machine.system()/'.config', 'settings.h.in'),
- output: 'settings.h',
- command: [ python3, '@INPUT0@', '--kconfig=@INPUT1@', '--dotconfig=@INPUT2@', '--input=@INPUT3@', '--output=@OUTPUT@' ]
-)
-
-subdir('about')
-subdir('webengine')
-
-poi_sourceset.add(mod_qt5.preprocess(
- moc_headers: ['browser.h', 'applicationmenu.h',
- 'mainwindow/mainwindow.h', 'mainwindow/addressbar.h', 'mainwindow/menubar.h', 'mainwindow/widgets/completer.h', 'mainwindow/widgets/urllineedit.h', 'mainwindow/widgets/dockwidget.h', 'mainwindow/widgets/navigationbar.h', 'mainwindow/widgets/searchform.h',
- 'bookmarks/bookmarkswidget.h', 'bookmarks/editbookmarkdialog.h',
- 'session/savesessiondialog.h', 'session/sessiondialog.h',
- 'subwindow/subwindow.h', 'subwindow/tabwidget.h' ],
- ui_files: [
- 'mainwindow/addressbar.ui', 'mainwindow/widgets/searchform.ui',
- 'bookmarks/bookmarksform.ui', 'bookmarks/editbookmarkdialog.ui',
- 'session/savesessiondialog.ui', 'session/sessiondialog.ui' ],
- qresources: '../data/resources.qrc',
- rcc_extra_arguments: ['--format-version=1'],
- dependencies: dep_qt5
-))
-
-poi_sourceset.add(files(
- 'main.cpp', 'builtins.cpp',
- 'browser.cpp', 'applicationmenu.cpp',
- 'util.cpp', 'util.h',
-
- 'mainwindow/mainwindow.cpp',
- 'mainwindow/addressbar.cpp',
- 'mainwindow/menubar.cpp',
- 'mainwindow/widgets/completer.cpp',
- 'mainwindow/widgets/urllineedit.cpp',
- 'mainwindow/widgets/dockwidget.cpp',
- 'mainwindow/widgets/menusearch.cpp',
- 'mainwindow/widgets/navigationbar.cpp',
- 'mainwindow/widgets/searchform.cpp',
-
- 'bookmarks/builtins.cpp', 'bookmarks/bookmarkswidget.cpp', 'bookmarks/editbookmarkdialog.cpp', 'bookmarks/bookmarkstoolbar.cpp',
-
- 'session/savesessiondialog.cpp',
- 'session/sessiondialog.cpp',
-
- 'subwindow/subwindow.cpp',
- 'subwindow/tabwidget.cpp',
-
- 'wallet/wallet.cpp', 'wallet/wallet.h'
-),
- version_h, poi_settings_h
-)
-
-poi_sourceset.add(when: [dep_breakpad, dep_threads],
- if_true: files('crashhandler.cpp'),
- if_false: files('crashhandler_dummy.cpp')
-)
-
diff --git a/src/session/sessiondialog.h b/src/session/sessiondialog.h
index 0a04940..fc31aa4 100644
--- a/src/session/sessiondialog.h
+++ b/src/session/sessiondialog.h
@@ -11,6 +11,7 @@
#include "session.hpp"
#include <QDialog>
+#include <optional>
namespace Ui
{
diff --git a/src/settings.h.in b/src/settings.h.in
deleted file mode 100644
index 88fbcf5..0000000
--- a/src/settings.h.in
+++ /dev/null
@@ -1,32 +0,0 @@
-#pragma once
-
-#include <QStandardPaths>
-#include <configuration.h>
-#include <fstream>
-
-inline const std::string init_conf(const std::string &path)
-{
- auto value_map = std::make_unique<Configuration, std::initializer_list<std::pair<std::string, conf_value_t>>>({
- @__DEFAULT_CFG__
- });
-
- const std::string cfgpath = [&]() {
- if(path.empty())
- return value_map->value<std::string>("poi.cfg.path").value();
-
- auto p = path;
- if(p.front() == '~')
- p.replace(0, 1, QStandardPaths::writableLocation(QStandardPaths::HomeLocation).toStdString());
- return p;
- }();
-
- std::fstream fs;
- fs.open(cfgpath, std::fstream::in);
- if(fs.is_open()) {
- value_map->read(fs);
- fs.close();
- }
-
- Configuration::move_global(std::move(value_map));
- return cfgpath;
-}
diff --git a/src/subwindow/subwindow.cpp b/src/subwindow/subwindow.cpp
index 6e9a713..a2d6138 100644
--- a/src/subwindow/subwindow.cpp
+++ b/src/subwindow/subwindow.cpp
@@ -57,7 +57,6 @@ SubWindow::SubWindow(QWidget *parent, Qt::WindowFlags flags)
close();
} else {
auto *view = dynamic_cast<WebView *>(tabWidget->widget(index));
- Q_CHECK_PTR(view);
disconnect(titleConnection);
disconnect(linkHoveredConnection);
@@ -67,12 +66,10 @@ SubWindow::SubWindow(QWidget *parent, Qt::WindowFlags flags)
this->setWindowTitle(QString("%1 :%2").arg(title, v->profile()->name()));
});
setWindowTitle(QString("%1 :%2").arg(view->title(), view->profile()->name()));
-
linkHoveredConnection = connect(view->page(), &WebPage::linkHovered, this, [this](const QString &url) {
if(!url.isEmpty())
emit showStatusMessage(url, 3000);
});
-
emit currentViewChanged(view);
}
});
diff --git a/src/subwindow/tabwidget.cpp b/src/subwindow/tabwidget.cpp
index 6f1e348..69f3b8a 100644
--- a/src/subwindow/tabwidget.cpp
+++ b/src/subwindow/tabwidget.cpp
@@ -42,8 +42,11 @@ TabWidget::TabWidget(SubWindow *parent)
// when changing tabs, give focus to the widget
// otherwise when closing tabs, the tabwidget will retain focus
connect(this, &TabWidget::currentChanged, this, [this](int index) {
- if(widget(index))
+ previous = current;
+ current = index;
+ /*if(widget(index)) {
widget(index)->setFocus();
+ }*/
});
// context menu
@@ -68,12 +71,6 @@ TabWidget::TabWidget(SubWindow *parent)
removeTab(i);
}
});
-
- //
- connect(this, &TabWidget::currentChanged, this, [this](int index) {
- previous = current;
- current = index;
- });
}
TabWidget::~TabWidget()
@@ -85,7 +82,9 @@ TabWidget::~TabWidget()
int TabWidget::addTab(WebView *view)
{
- Q_ASSERT_X(view != nullptr, "TabWidget::addTab", "Tried to add null view");
+ if(view == nullptr) {
+ return -1;
+ }
const int idx = QTabWidget::addTab(view, view->title());
connect(view, &WebView::titleChanged, [this, view](const QString &title) {
@@ -100,7 +99,6 @@ int TabWidget::addTab(WebView *view)
setTabIcon(current_idx, icon);
}
});
-
tabBar()->setTabData(idx, QVariant::fromValue<SubWindow::TabData>(SubWindow::TabData{}));
return idx;
}
diff --git a/src/util.cpp b/src/util.cpp
index fe74175..3061c96 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -62,7 +62,7 @@ QIcon Util::icon(QStyle::StandardPixmap id) {
return QIcon::fromTheme("go-home", qApp->style()->standardIcon(id));
default:
- spdlog::warn("FIXME: unhandled StandardPixmap {}", id);
+ spdlog::warn("FIXME: unhandled StandardPixmap");
return qApp->style()->standardIcon(id);
}
}
diff --git a/src/version.h.in b/src/version.h.in
new file mode 100644
index 0000000..b387811
--- /dev/null
+++ b/src/version.h.in
@@ -0,0 +1,8 @@
+#ifndef SMOLBOTE_VERSION_H
+#define SMOLBOTE_VERSION_H
+
+// output of 'git describe --long --abbrev=40':
+// x.y.z-0-g0123456789012345678901234567890123456789
+#define poi_Version "@CMAKE_PROJECT_VERSION@"
+
+#endif // SMOLBOTE_VERSION_H
diff --git a/src/webengine/CMakeLists.txt b/src/webengine/CMakeLists.txt
new file mode 100644
index 0000000..704a6d0
--- /dev/null
+++ b/src/webengine/CMakeLists.txt
@@ -0,0 +1,10 @@
+add_library(webengine STATIC
+ urlinterceptor.cpp urlinterceptor.h
+ webpage.cpp webpage.h
+ webprofile.cpp webprofile.h
+ webprofilemanager.cpp webprofilemanager.h
+ webviewcontextmenu.cpp webviewcontextmenu.h
+ webview.cpp webview.h
+)
+target_link_libraries(webengine PUBLIC Qt6::WebEngineCore Qt6::WebEngineWidgets)
+target_include_directories(webengine PUBLIC ${CMAKE_CURRENT_LIST_DIR} ${PROJECT_SOURCE_DIR}/include)
diff --git a/src/webengine/webpage.cpp b/src/webengine/webpage.cpp
index b2b19b5..f8a8f7f 100644
--- a/src/webengine/webpage.cpp
+++ b/src/webengine/webpage.cpp
@@ -62,6 +62,7 @@ WebPage::WebPage(QWebEngineProfile *profile, QObject *parent)
connect(this, &QWebEnginePage::featurePermissionRequested, this, &WebPage::featurePermissionDialog);
connect(this, &QWebEnginePage::renderProcessTerminated, this, &WebPage::renderProcessCrashed);
+ connect(this, &QWebEnginePage::certificateError, this, &WebPage::certificateError);
}
bool WebPage::certificateError(const QWebEngineCertificateError &certificateError)
@@ -77,9 +78,8 @@ bool WebPage::certificateError(const QWebEngineCertificateError &certificateErro
messageBox.setText(tr("An SSL error has occurred on <strong>%1</strong>").arg(certificateError.url().toString()));
messageBox.setInformativeText(tr("<p>%1</p>"
"<p>This error %2 be overridden.</p>")
- .arg(certificateError.errorDescription(),
+ .arg(certificateError.description(),
certificateError.isOverridable() ? tr("can") : tr("cannot")));
- messageBox.setDetailedText(tr("Error code: %1").arg(certificateError.error()));
if(certificateError.isOverridable()) {
messageBox.setStandardButtons(QMessageBox::Ignore | QMessageBox::Abort);
diff --git a/src/webengine/webpage.h b/src/webengine/webpage.h
index 91ae4f3..bd7d54c 100644
--- a/src/webengine/webpage.h
+++ b/src/webengine/webpage.h
@@ -19,12 +19,10 @@ public:
WebPage(QWebEngineProfile *profile, QObject *parent = nullptr);
~WebPage() override = default;
-protected:
- bool certificateError(const QWebEngineCertificateError &certificateError) override;
-
protected slots:
void featurePermissionDialog(const QUrl &securityOrigin, QWebEnginePage::Feature feature);
void renderProcessCrashed(QWebEnginePage::RenderProcessTerminationStatus terminationStatus, int exitCode);
+ bool certificateError(const QWebEngineCertificateError &certificateError);
};
#endif // SMOLBOTE_WEBPAGE_H
diff --git a/src/webengine/webprofile.cpp b/src/webengine/webprofile.cpp
index 719ab34..f1e71fb 100644
--- a/src/webengine/webprofile.cpp
+++ b/src/webengine/webprofile.cpp
@@ -18,12 +18,10 @@ static WebProfile *s_profile = nullptr;
void WebProfile::setDefaultProfile(WebProfile *profile)
{
- Q_CHECK_PTR(profile);
s_profile = profile;
}
WebProfile *WebProfile::defaultProfile()
{
- Q_CHECK_PTR(s_profile);
return s_profile;
}
diff --git a/src/webengine/webprofilemanager.cpp b/src/webengine/webprofilemanager.cpp
index 5cc83f8..9ae2960 100644
--- a/src/webengine/webprofilemanager.cpp
+++ b/src/webengine/webprofilemanager.cpp
@@ -8,6 +8,7 @@
#include "webprofilemanager.h"
#include "webprofile.h"
+#include <QActionGroup>
static WebProfileManager<false> *s_instance = nullptr;
diff --git a/src/webengine/webprofilemanager.h b/src/webengine/webprofilemanager.h
index 91dcaf8..a356506 100644
--- a/src/webengine/webprofilemanager.h
+++ b/src/webengine/webprofilemanager.h
@@ -41,10 +41,11 @@ public:
}
if(!profiles.contains(default_id)) {
- Profile profile;
- profile.settings = WebProfile::load(QString(), search, homepage, newtab);
- profile.ptr = WebProfile::load(default_id, profile.settings, true);
- profiles[default_id] = profile;
+ auto *settings = WebProfile::load(QString(), search, homepage, newtab);
+ profiles[default_id] = Profile{
+ .settings = settings,
+ .ptr = WebProfile::load(default_id, settings, true),
+ };
}
WebProfile::setDefaultProfile(profiles[default_id].ptr);
}
@@ -73,7 +74,7 @@ public:
}
if(profile != nullptr && settings != nullptr) {
- profiles[id] = Profile{ profile, settings, false };
+ profiles[id] = Profile{ settings, profile, false };
}
}
@@ -101,8 +102,8 @@ private:
set_typestate(consumed) void consume() {}
struct Profile {
- WebProfile *ptr = nullptr;
QSettings *settings = nullptr;
+ WebProfile *ptr = nullptr;
bool selfDestruct = false;
};
diff --git a/src/webengine/webview.cpp b/src/webengine/webview.cpp
index 38e564a..bc52102 100644
--- a/src/webengine/webview.cpp
+++ b/src/webengine/webview.cpp
@@ -37,9 +37,7 @@ WebView::WebView(WebProfile *profile, cb_createWindow_t cb, QWidget *parent)
: WebView(parent)
{
cb_createWindow = cb;
- Q_CHECK_PTR(profile);
- m_profile = profile;
- setPage(new WebPage(profile, this));
+ setProfile(profile);
}
WebView::WebView(const Session::WebView &webview_data, cb_createWindow_t cb, QWidget *parent)
@@ -47,11 +45,7 @@ WebView::WebView(const Session::WebView &webview_data, cb_createWindow_t cb, QWi
{
cb_createWindow = cb;
WebProfileManager profileManager;
-
- auto *profile = profileManager.profile(webview_data.profile);
- if(profile != nullptr) {
- setProfile(profile);
- }
+ setProfile(profileManager.profile(webview_data.profile));
if(!webview_data.url.isEmpty())
load(QUrl::fromUserInput(webview_data.url));
@@ -64,9 +58,9 @@ WebView::WebView(const Session::WebView &webview_data, cb_createWindow_t cb, QWi
void WebView::setProfile(WebProfile *profile)
{
- m_profile = profile;
+ m_profile = (profile == nullptr) ? WebProfile::defaultProfile() : profile;
const auto url = this->url();
- setPage(new WebPage(profile, this));
+ setPage(new WebPage(m_profile, this));
this->load(url);
}
diff --git a/src/webengine/webviewcontextmenu.cpp b/src/webengine/webviewcontextmenu.cpp
index ea5e8c6..0de3b9f 100644
--- a/src/webengine/webviewcontextmenu.cpp
+++ b/src/webengine/webviewcontextmenu.cpp
@@ -17,7 +17,7 @@
#include <QStyle>
#include <QToolButton>
#include <QVBoxLayout>
-#include <QWebEngineContextMenuData>
+#include <QWebEngineContextMenuRequest>
#include <QWebEngineHistory>
#include <QWidgetAction>
@@ -94,100 +94,7 @@ WebViewContextMenu::WebViewContextMenu(WebView *view)
this->addAction(navButtons);
this->addSeparator();
- const auto ctxdata = view->page()->contextMenuData();
-
- if(ctxdata.mediaType() == QWebEngineContextMenuData::MediaTypeNone) {
- auto *backMenu = this->addMenu(tr("Back"));
- if(!view->history()->canGoBack()) {
- backMenu->setEnabled(false);
- } else {
- connect(backMenu, &QMenu::aboutToShow, view, [view, backMenu]() {
- backMenu->clear();
- const auto backItems = view->history()->backItems(10);
- for(const QWebEngineHistoryItem &item : backItems) {
- backMenu->addAction(historyAction(view, item));
- }
- });
- }
-
- auto *forwardMenu = this->addMenu(tr("Forward"));
- if(!view->history()->canGoForward()) {
- forwardMenu->setEnabled(false);
- } else {
- connect(forwardMenu, &QMenu::aboutToShow, view, [view, forwardMenu]() {
- forwardMenu->clear();
- const auto forwardItems = view->history()->forwardItems(10);
- for(const QWebEngineHistoryItem &item : forwardItems) {
- forwardMenu->addAction(historyAction(view, item));
- }
- });
- }
-
- connect(this->addAction(tr("Reload")), &QAction::triggered, view, [view]() {
- view->page()->triggerAction(QWebEnginePage::Reload);
- });
- connect(this->addAction(tr("Reload and bypass Cache")), &QAction::triggered, view, [view]() {
- view->page()->triggerAction(QWebEnginePage::ReloadAndBypassCache);
- });
-
- this->addSeparator();
-
- connect(this->addAction(tr("Select All")), &QAction::triggered, view, [view]() {
- view->page()->triggerAction(QWebEnginePage::SelectAll);
- });
- connect(this->addAction(tr("Clear Selection")), &QAction::triggered, view, [view]() {
- view->page()->triggerAction(QWebEnginePage::Unselect);
- });
- connect(this->addAction(tr("Copy to clipboard")), &QAction::triggered, view, [view]() {
- view->page()->triggerAction(QWebEnginePage::Copy);
- });
-
- } else if(ctxdata.mediaType() == QWebEngineContextMenuData::MediaTypeImage) {
- connect(this->addAction(tr("Copy image to clipboard")), &QAction::triggered, view, [view]() {
- view->page()->triggerAction(QWebEnginePage::CopyImageToClipboard);
- });
- connect(this->addAction(tr("Copy image URL to clipboard")), &QAction::triggered, view, [view]() {
- view->page()->triggerAction(QWebEnginePage::CopyImageUrlToClipboard);
- });
- if(!ctxdata.mediaUrl().isEmpty()) {
- if(view->url() != ctxdata.mediaUrl()) {
- connect(this->addAction(tr("Open image")), &QAction::triggered, view, [view, ctxdata]() {
- view->load(ctxdata.mediaUrl());
- });
- connect(this->addAction(tr("Open image in new tab")), &QAction::triggered, view, [view, ctxdata]() {
- view->createWindow(QWebEnginePage::WebBrowserTab)->load(ctxdata.mediaUrl());
- });
- }
- connect(this->addAction(tr("Save image")), &QAction::triggered, view, [view, ctxdata]() {
- view->page()->download(ctxdata.mediaUrl());
- });
- }
-
- } else {
- addMenu(view->page()->createStandardContextMenu());
- }
-
- if(!ctxdata.linkUrl().isEmpty()) {
- this->addSeparator();
- connect(this->addAction(tr("Open link in new tab")), &QAction::triggered, view, [view, ctxdata]() {
- view->createWindow(QWebEnginePage::WebBrowserTab)->load(ctxdata.linkUrl());
- });
-
- auto *newTabMenu = this->addMenu(tr("Open link in new tab with profile"));
- profileMenu(newTabMenu, [view, ctxdata](WebProfile *profile) {
- auto *v = view->createWindow(QWebEnginePage::WebBrowserTab);
- v->setProfile(profile);
- v->load(ctxdata.linkUrl());
- });
-
- connect(this->addAction(tr("Open link in new window")), &QAction::triggered, view, [view, ctxdata]() {
- view->createWindow(QWebEnginePage::WebBrowserWindow)->load(ctxdata.linkUrl());
- });
-
- connect(this->addAction(tr("Copy link address")), &QAction::triggered, view, [view]() {
- view->page()->triggerAction(QWebEnginePage::CopyLinkToClipboard);
- });
- }
+ addMenu(view->createStandardContextMenu());
// zoom widget
{