1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
/*
* 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: git://neueland.iserlohn-fortress.net/smolbote.git
*
* SPDX-License-Identifier: GPL-3.0
*/
#include "browser.h"
#include "mainwindow.h"
#include "webengine/urlinterceptor.h"
#include <QDir>
#include <bookmarks/bookmarkswidget.h>
#include <downloads/downloadswidget.h>
Browser::Browser(int &argc, char *argv[])
: SingleApplication(argc, argv)
{
setApplicationName("smolbote");
setWindowIcon(QIcon(":/icon.svg"));
connect(this, &Browser::messageAvailable, this, &Browser::createSession);
}
Browser::~Browser()
{
if(m_config) {
m_config->writeIfNeeded();
}
if(m_bookmarksManager) {
m_bookmarksManager->save();
}
}
void Browser::setConfiguration(std::shared_ptr<Configuration> &config)
{
m_config = config;
m_bookmarksManager = std::make_shared<BookmarksWidget>(QString::fromStdString(m_config->value<std::string>("bookmarks.path").value()));
m_downloadManager = std::make_shared<DownloadsWidget>(QString::fromStdString(m_config->value<std::string>("downloads.path").value()));
m_urlRequestInterceptor = std::make_shared<UrlRequestInterceptor>(QString::fromStdString(m_config->value<std::string>("filter.path").value()));
// set default profile
m_defaultProfile = profile(QString::fromStdString(m_config->value<std::string>("browser.profile").value()));
}
MainWindow *Browser::createWindow()
{
// the window will delete itself when it closes, so we don't need to delete it
MainWindow *window = new MainWindow(m_config);
window->setBookmarksWidget(m_bookmarksManager);
window->setDownloadsWidget(m_downloadManager);
window->setProfile(m_defaultProfile);
m_windows.append(window);
// has to be window.get(), but can't be *window
connect(window, &MainWindow::destroyed, this, [this, window]() {
m_windows.removeOne(window);
});
window->show();
return window;
}
MainWindow *Browser::createSession(const QString &profileName, bool newWindow, const QStringList &urls)
{
MainWindow *window = nullptr;
// if we need to open in a new window, or there are no windows, make one
if(newWindow || m_windows.isEmpty()) {
window = createWindow();
window->setProfile(profile(profileName));
} else {
// reverse-iterate through windows to check for window with the same profile
for(auto it = m_windows.rbegin(); it != m_windows.rend(); ++it) {
if((*it)->profile()->storageName() == profileName) {
window = *it;
break;
}
}
// if none is found, create one
if(window == nullptr) {
window = createWindow();
window->setProfile(profile(profileName));
}
}
Q_CHECK_PTR(window);
if(urls.isEmpty()) {
// no URLs were given
window->newTab(QUrl::fromUserInput(m_config->value<std::string>("profile.homepage").value().c_str()));
} else {
for(const QString &url : urls) {
window->newTab(QUrl::fromUserInput(url));
}
}
return window;
}
std::shared_ptr<WebEngineProfile> Browser::profile(const QString storageName)
{
if(m_profiles.contains(storageName)) {
return m_profiles[storageName];
}
// profile with name storageName has not been loaded
Q_ASSERT(m_config);
const QString &path = QString::fromStdString(m_config->value<std::string>("profile.path").value());
std::shared_ptr<WebEngineProfile> _profile = std::shared_ptr<WebEngineProfile>(createProfile(storageName, path, nullptr));
_profile->setRequestInterceptor(m_urlRequestInterceptor.get());
connect(_profile.get(), &WebEngineProfile::downloadRequested, m_downloadManager.get(), &DownloadsWidget::addDownload);
m_profiles.insert(storageName, _profile);
return _profile;
}
QStringList Browser::profiles() const
{
return m_profiles.keys();
}
|