Falkon Develop
Cross-platform Qt-based web browser
protocolhandlermanager.cpp
Go to the documentation of this file.
1/* ============================================================
2* Falkon - Qt web browser
3* Copyright (C) 2019 David Rosca <nowrep@gmail.com>
4*
5* This program is free software: you can redistribute it and/or modify
6* it under the terms of the GNU General Public License as published by
7* the Free Software Foundation, either version 3 of the License, or
8* (at your option) any later version.
9*
10* This program is distributed in the hope that it will be useful,
11* but WITHOUT ANY WARRANTY; without even the implied warranty of
12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13* GNU General Public License for more details.
14*
15* You should have received a copy of the GNU General Public License
16* along with this program. If not, see <http://www.gnu.org/licenses/>.
17* ============================================================ */
19#include "settings.h"
20
21#include <QWebEnginePage>
22#include <QtWebEngineWidgetsVersion>
23
24#include <QWebEngineRegisterProtocolHandlerRequest>
25
27 : QObject(parent)
28{
29 init();
30}
31
32QHash<QString, QUrl> ProtocolHandlerManager::protocolHandlers() const
33{
34 return m_protocolHandlers;
35}
36
37void ProtocolHandlerManager::addProtocolHandler(const QString &scheme, const QUrl &url)
38{
39 if (scheme.isEmpty() || url.isEmpty()) {
40 return;
41 }
42 m_protocolHandlers[scheme] = url;
43 registerHandler(scheme, url);
44 save();
45}
46
48{
49 m_protocolHandlers.remove(scheme);
50 save();
51}
52
53void ProtocolHandlerManager::init()
54{
55 Settings settings;
56 settings.beginGroup(QSL("ProtocolHandlers"));
57 const QStringList keys = settings.childKeys();
58 for (const QString &scheme : keys) {
59 const QUrl url = settings.value(scheme).toUrl();
60 m_protocolHandlers[scheme] = url;
61 registerHandler(scheme, url);
62 }
63 settings.endGroup();
64}
65
66void ProtocolHandlerManager::save()
67{
68 Settings settings;
69 settings.remove(QSL("ProtocolHandlers"));
70 settings.beginGroup(QSL("ProtocolHandlers"));
71 for (auto it = m_protocolHandlers.cbegin(); it != m_protocolHandlers.cend(); ++it) {
72 settings.setValue(it.key(), it.value());
73 }
74 settings.endGroup();
75}
76
77void ProtocolHandlerManager::registerHandler(const QString &scheme, const QUrl &url)
78{
79 QString urlString = url.toString();
80 urlString.replace(QL1S("%25s"), QL1S("%s"));
81
82 auto *page = new QWebEnginePage(this);
83 connect(page, &QWebEnginePage::loadFinished, page, &QObject::deleteLater);
84 connect(page, &QWebEnginePage::registerProtocolHandlerRequested, this, [](QWebEngineRegisterProtocolHandlerRequest request) {
85 request.accept();
86 });
87 page->setHtml(QSL("<script>navigator.registerProtocolHandler('%1', '%2', '')</script>").arg(scheme, urlString), url);
88}
void removeProtocolHandler(const QString &scheme)
void addProtocolHandler(const QString &scheme, const QUrl &url)
ProtocolHandlerManager(QObject *parent=nullptr)
QHash< QString, QUrl > protocolHandlers() const
void beginGroup(const QString &prefix)
Definition: settings.cpp:79
void endGroup()
Definition: settings.cpp:84
void remove(const QString &key)
Definition: settings.cpp:64
QStringList childKeys() const
Definition: settings.cpp:49
QVariant value(const QString &key, const QVariant &defaultValue=QVariant())
Definition: settings.cpp:74
void setValue(const QString &key, const QVariant &defaultValue=QVariant())
Definition: settings.cpp:69
#define QL1S(x)
Definition: qzcommon.h:44
#define QSL(x)
Definition: qzcommon.h:40