aboutsummaryrefslogtreecommitdiff
path: root/src/browser.cpp
blob: bd1f841a9d0d4f86cf25cfca23d759eed24e8ce9 (plain)
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();
}