diff options
author | Michal Klocek <michal.klocek@qt.io> | 2023-09-04 09:40:41 +0200 |
---|---|---|
committer | Michal Klocek <michal.klocek@qt.io> | 2023-09-09 00:29:52 +0200 |
commit | 09e224c57c085457dbc5c2896aacb868a19c2ce6 (patch) | |
tree | b1e8d0f05691937dceebdf69cfd6541ceacb390e | |
parent | 71a5993239354454c4f1c1428406022ae17eb32d (diff) |
Update qwebengineglobalsettings api
Do comments from api review:
* use static setDnsMode
* use struct for mode and server templates
* remove QObject
* do not use QScopedPointer
* use the namespace instead of the class
Pick-to: 6.6
Change-Id: I766626330e4cc190a170fcd6b5e32b1f60ad675c
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
-rw-r--r-- | src/core/api/qwebengineglobalsettings.cpp | 117 | ||||
-rw-r--r-- | src/core/api/qwebengineglobalsettings.h | 35 | ||||
-rw-r--r-- | src/core/api/qwebengineglobalsettings_p.h | 5 | ||||
-rw-r--r-- | src/core/net/system_network_context_manager.cpp | 2 | ||||
-rw-r--r-- | tests/auto/core/qwebengineglobalsettings/tst_qwebengineglobalsettings.cpp | 26 |
5 files changed, 95 insertions, 90 deletions
diff --git a/src/core/api/qwebengineglobalsettings.cpp b/src/core/api/qwebengineglobalsettings.cpp index 0f2472c47..5eeff9fc5 100644 --- a/src/core/api/qwebengineglobalsettings.cpp +++ b/src/core/api/qwebengineglobalsettings.cpp @@ -15,82 +15,90 @@ QT_BEGIN_NAMESPACE -ASSERT_ENUMS_MATCH(net::SecureDnsMode::kSecure, QWebEngineGlobalSettings::DnsMode::SecureOnly) +ASSERT_ENUMS_MATCH(net::SecureDnsMode::kSecure, QWebEngineGlobalSettings::SecureDnsMode::SecureOnly) ASSERT_ENUMS_MATCH(net::SecureDnsMode::kAutomatic, - QWebEngineGlobalSettings::DnsMode::SecureWithFallback) -ASSERT_ENUMS_MATCH(net::SecureDnsMode::kOff, QWebEngineGlobalSettings::DnsMode::SystemOnly) + QWebEngineGlobalSettings::SecureDnsMode::SecureWithFallback) +ASSERT_ENUMS_MATCH(net::SecureDnsMode::kOff, QWebEngineGlobalSettings::SecureDnsMode::SystemOnly) /*! - \class QWebEngineGlobalSettings - \brief The QWebEngineGlobalSettings class configures global properties of the web engine. + \namespace QWebEngineGlobalSettings + \brief The QWebEngineGlobalSettings namespace holds global settings of the web engine. \since 6.6 \inmodule QtWebEngineCore - The QWebEngineGlobalSettings class is a singleton that configures global properties - of the web engine. + The QWebEngineGlobalSettings namespace holds global properties of the web engine. - Invoke setDnsMode() and setDnsServerTemplates() to configure DNS-over-HTTPS. + Invoke setDnsMode() to configure DNS-over-HTTPS. - \sa QWebEngineGlobalSettings::setDnsMode(), QWebEngineGlobalSettings::setDnsServerTemplates() + \sa QWebEngineGlobalSettings::setDnsMode() */ -QWebEngineGlobalSettings::QWebEngineGlobalSettings(QObject *p) - : QObject(p), d_ptr(new QWebEngineGlobalSettingsPrivate) -{ -} +/*! + \enum QWebEngineGlobalSettings::SecureDnsMode -QWebEngineGlobalSettings::~QWebEngineGlobalSettings() { } + This enum sets the DNS-over-HTTPS mode used by the DnsMode structure: + + \value SystemOnly This is the default. Use the system DNS host resolution. + \value SecureWithFallback Enable DNS-over-HTTPS (DoH). DoH servers have to be + provided through \l {QWebEngineGlobalSettings::DnsMode::serverTemplates}{serverTemplates} in + the DnsMode structure. If a host cannot be resolved via the provided servers, + the system DNS host resolution is used. + \value SecureOnly Enable DNS-over-HTTPS and only allow hosts to be resolved + this way. DoH servers have to be provided through + \l {QWebEngineGlobalSettings::DnsMode::serverTemplates}{serverTemplates} in the DnsMode + structure. If the DNS-over-HTTPS resolution fails, there is no fallback and the DNS host + resolution fails completely. +*/ /*! - \fn QWebEngineGlobalSettings *QWebEngineGlobalSettings::GetInstance() + \class QWebEngineGlobalSettings::DnsMode + \brief The DnsMode struct provides means to specify the DNS host resolution mode. + \since 6.6 + \inmodule QtWebEngineCore - Gets the global instance of QWebEngineGlobalSettings. + The QWebEngineGlobalSettings::DnsMode structure describes the DNS mode and + the associated DNS server template used for the DNS host resolution. */ -QWebEngineGlobalSettings *QWebEngineGlobalSettings::instance() -{ - static QWebEngineGlobalSettings settings; - return &settings; -} /*! - \enum QWebEngineGlobalSettings::DnsMode + \variable QWebEngineGlobalSettings::DnsMode::secureMode + \brief The DNS mode used for the host resolution. - This enum sets the DNS-over-HTTPS mode: + Set \a secureMode to SecureDnsMode::SecureOnly to only allow DNS-over-HTTPS host resolution + using servers from \a serverTemplates. - \value SystemOnly This is the default. Use the system DNS host resolution. - \value SecureWithFallback Enable DNS-over-HTTPS (DoH). DoH servers have to be - provided through QWebEngineGlobalSettings::setDnsServerTemplates(). If a host can't be resolved - via the provided servers, the system DNS host resolution is used. - \value SecureOnly Enable DNS-over-HTTPS and only allow hosts to be resolved this way. - DoH servers have to be provided through QWebEngineGlobalSettings::setDnsServerTemplates(). - If the DNS-over-HTTPS resolution fails, there is no fallback and DNS host resolution - fails completely. + Set \a secureMode to SecureDnsMode::SecureWithFallback to enable DNS-over-HTTPS host resolution + using servers from \a serverTemplates, with a fallback to the system DNS. + + \sa QWebEngineGlobalSettings::SecureDnsMode */ /*! - \fn void QWebEngineGlobalSettings::setDnsMode(DnsMode dnsMode, const QStringList - &dnsServerTemplates) + \variable QWebEngineGlobalSettings::DnsMode::serverTemplates + \brief A list of server URI templates used for secure DNS-over-HTTPS host resolution. - Set \a dnsMode to DnsMode::SystemOnly to use the system DNS resolution. - - Set \a dnsMode to DnsMode::SecureOnly to only allow DNS-over-HTTPS host resolution using servers - from \a dnsServerTemplates. + The \c serverTemplates structure member lists + \l{https://datatracker.ietf.org/d7oc/html/rfc6570}{URI templates}. + An example of a URI template is https://dns.google/dns-query{?dns}. +*/ - Set \a dnsMode to DnsMode::SecureWithFallback to enable DNS-over-HTTPS host resolution using - servers from \a dnsServerTemplates,with a fallback to the system DNS. +/*! + \fn void QWebEngineGlobalSettings::setDnsMode(DnsMode dnsMode) - A list \a dnsServerTemplates is a list of \l{https://datatracker.ietf.org/d7oc/html/rfc6570}{URI - templates}. One example URI template is https://dns.google/dns-query{?dns}. + Sets \a dnsMode for DNS-over-HTTPS host resolution. - This function returns \c false if the \a dnsServerTemplates list is empty or contains URI - templates that cannot be parsed for DnsMode::SecureOnly or DnsMode::SecureWithFallback. - Otherwise, it returns \c true meaning the DNS mode change is triggered. + This function returns \c false if the \l {QWebEngineGlobalSettings::DnsMode::serverTemplates} + {serverTemplates} list in the \l {QWebEngineGlobalSettings::DnsMode}{DnsMode} structure is empty + or contains URI templates that cannot be parsed for SecureDnsMode::SecureOnly or + SecureDnsMode::SecureWithFallback. Otherwise, it returns \c true meaning that the DNS mode + change is triggered. */ -bool QWebEngineGlobalSettings::setDnsMode(DnsMode dnsMode, const QStringList &dnsServerTemplates) + +bool QWebEngineGlobalSettings::setDnsMode(DnsMode dnsMode) { - Q_D(QWebEngineGlobalSettings); - if (dnsMode != DnsMode::SystemOnly) { - const QString servers = dnsServerTemplates.join(QChar::Space); + QWebEngineGlobalSettingsPrivate *d = QWebEngineGlobalSettingsPrivate::instance(); + if (dnsMode.secureMode != SecureDnsMode::SystemOnly) { + const QString servers = dnsMode.serverTemplates.join(QChar::Space); const std::string templates = servers.toStdString(); absl::optional<net::DnsOverHttpsConfig> dnsOverHttpsConfig = net::DnsOverHttpsConfig::FromString(templates); @@ -98,7 +106,7 @@ bool QWebEngineGlobalSettings::setDnsMode(DnsMode dnsMode, const QStringList &dn return false; d->dnsOverHttpsTemplates = templates; } - d->dnsMode = dnsMode; + d->dnsMode = dnsMode.secureMode; d->configureStubHostResolver(); return true; } @@ -106,6 +114,12 @@ bool QWebEngineGlobalSettings::setDnsMode(DnsMode dnsMode, const QStringList &dn /*! \internal */ +QWebEngineGlobalSettingsPrivate *QWebEngineGlobalSettingsPrivate::instance() +{ + static QWebEngineGlobalSettingsPrivate settings; + return &settings; +} + void QWebEngineGlobalSettingsPrivate::configureStubHostResolver() { if (content::GetNetworkServiceAvailability() @@ -113,8 +127,9 @@ void QWebEngineGlobalSettingsPrivate::configureStubHostResolver() network::mojom::NetworkService *networkService = content::GetNetworkService(); if (networkService) { qDebug() << "doh set to" << dnsOverHttpsTemplates << " -- " - << (dnsMode == QWebEngineGlobalSettings::DnsMode::SecureOnly ? "SecureOnly" - : dnsMode == QWebEngineGlobalSettings::DnsMode::SystemOnly + << (dnsMode == QWebEngineGlobalSettings::SecureDnsMode::SecureOnly + ? "SecureOnly" + : dnsMode == QWebEngineGlobalSettings::SecureDnsMode::SystemOnly ? "SystemOnly" : "SecureWithFallback"); absl::optional<net::DnsOverHttpsConfig> dohConfig = dnsOverHttpsTemplates.empty() diff --git a/src/core/api/qwebengineglobalsettings.h b/src/core/api/qwebengineglobalsettings.h index deef5941f..a9eff6d12 100644 --- a/src/core/api/qwebengineglobalsettings.h +++ b/src/core/api/qwebengineglobalsettings.h @@ -4,37 +4,26 @@ #ifndef QWEBENGINEGLOBALSETTINGS_H #define QWEBENGINEGLOBALSETTINGS_H +#if 0 +#pragma qt_class(QWebEngineGlobalSettings) +#endif + #include <QtWebEngineCore/qtwebenginecoreglobal.h> #include <QtCore/QObject> #include <QtCore/QScopedPointer> -namespace QtWebEngineCore { -class SystemNetworkContextManager; -} - QT_BEGIN_NAMESPACE -class QWebEngineGlobalSettingsPrivate; - -class Q_WEBENGINECORE_EXPORT QWebEngineGlobalSettings : public QObject +namespace QWebEngineGlobalSettings { +// Mapping net::SecureDnsMode +enum class SecureDnsMode : quint8 { SystemOnly = 0, SecureWithFallback = 1, SecureOnly = 2 }; +struct DnsMode { - Q_OBJECT -public: - static QWebEngineGlobalSettings *instance(); - - // Mapping net::SecureDnsMode - enum class DnsMode : quint8 { SystemOnly = 0, SecureWithFallback = 1, SecureOnly = 2 }; - bool setDnsMode(DnsMode dnsMode, const QStringList &dnsServerTemplates); - -private: - QWebEngineGlobalSettings(QObject *p = nullptr); - ~QWebEngineGlobalSettings() override; - - friend class QtWebEngineCore::SystemNetworkContextManager; - Q_DECLARE_PRIVATE(QWebEngineGlobalSettings) - // can't re-use base d_ptr: need to maintain compat with last Qt LTS - QScopedPointer<QWebEngineGlobalSettingsPrivate> d_ptr; + SecureDnsMode secureMode = SecureDnsMode::SystemOnly; + QStringList serverTemplates; }; +Q_WEBENGINECORE_EXPORT bool setDnsMode(DnsMode dnsMode); +} QT_END_NAMESPACE diff --git a/src/core/api/qwebengineglobalsettings_p.h b/src/core/api/qwebengineglobalsettings_p.h index 412697c0f..10ae502f0 100644 --- a/src/core/api/qwebengineglobalsettings_p.h +++ b/src/core/api/qwebengineglobalsettings_p.h @@ -25,12 +25,13 @@ class Q_WEBENGINECORE_PRIVATE_EXPORT QWebEngineGlobalSettingsPrivate { public: QWebEngineGlobalSettingsPrivate() - : dnsMode(QWebEngineGlobalSettings::DnsMode::SystemOnly) + : dnsMode(QWebEngineGlobalSettings::SecureDnsMode::SystemOnly) , dnsOverHttpsTemplates("") , insecureDnsClientEnabled(false) , additionalInsecureDnsTypesEnabled(false){}; - QWebEngineGlobalSettings::DnsMode dnsMode; + static QWebEngineGlobalSettingsPrivate *instance(); + QWebEngineGlobalSettings::SecureDnsMode dnsMode; std::string dnsOverHttpsTemplates; const bool insecureDnsClientEnabled; const bool additionalInsecureDnsTypesEnabled; diff --git a/src/core/net/system_network_context_manager.cpp b/src/core/net/system_network_context_manager.cpp index ed676fcbc..65b5d9c97 100644 --- a/src/core/net/system_network_context_manager.cpp +++ b/src/core/net/system_network_context_manager.cpp @@ -265,7 +265,7 @@ void SystemNetworkContextManager::OnNetworkServiceCreated(network::mojom::Networ // resolver of the network service here, each time it is instantiated, with our global // DNS-Over-HTTPS settings. This ensures that the global settings don't get lost // on reinstantiation and are in effect upon initial instantiation. - QWebEngineGlobalSettings::instance()->d_ptr->configureStubHostResolver(); + QWebEngineGlobalSettingsPrivate::instance()->configureStubHostResolver(); } void SystemNetworkContextManager::AddSSLConfigToNetworkContextParams(network::mojom::NetworkContextParams *network_context_params) diff --git a/tests/auto/core/qwebengineglobalsettings/tst_qwebengineglobalsettings.cpp b/tests/auto/core/qwebengineglobalsettings/tst_qwebengineglobalsettings.cpp index e3986674f..0af85a711 100644 --- a/tests/auto/core/qwebengineglobalsettings/tst_qwebengineglobalsettings.cpp +++ b/tests/auto/core/qwebengineglobalsettings/tst_qwebengineglobalsettings.cpp @@ -34,23 +34,23 @@ Q_LOGGING_CATEGORY(lc, "qt.webengine.tests") void tst_QWebEngineGlobalSettings::dnsOverHttps_data() { - QTest::addColumn<QWebEngineGlobalSettings::DnsMode>("dnsMode"); + QTest::addColumn<QWebEngineGlobalSettings::SecureDnsMode>("dnsMode"); QTest::addColumn<QString>("uriTemplate"); QTest::addColumn<bool>("isMockDnsServerCalledExpected"); QTest::addColumn<bool>("isDnsResolutionSuccessExpected"); QTest::addColumn<bool>("isConfigurationSuccessExpected"); QTest::newRow("DnsMode::SystemOnly (no DoH server)") - << QWebEngineGlobalSettings::DnsMode::SystemOnly << QStringLiteral("") << false << true - << true; + << QWebEngineGlobalSettings::SecureDnsMode::SystemOnly << QStringLiteral("") << false + << true << true; QTest::newRow("DnsMode::SecureOnly (mock DoH server)") - << QWebEngineGlobalSettings::DnsMode::SecureOnly + << QWebEngineGlobalSettings::SecureDnsMode::SecureOnly << QStringLiteral("https://127.0.0.1:3000/dns-query{?dns}") << true << false << true; QTest::newRow("DnsMode::SecureOnly (real DoH server)") - << QWebEngineGlobalSettings::DnsMode::SecureOnly + << QWebEngineGlobalSettings::SecureDnsMode::SecureOnly << QStringLiteral("https://dns.google/dns-query{?dns}") << false << true << true; QTest::newRow("DnsMode::SecureOnly (Empty URI Templates)") - << QWebEngineGlobalSettings::DnsMode::SecureOnly << QStringLiteral("") << false << false - << false; + << QWebEngineGlobalSettings::SecureDnsMode::SecureOnly << QStringLiteral("") << false + << false << false; // Note: In the following test, we can't verify that the DoH server is called first and // afterwards insecure DNS is tried, because for the DoH server to ever be used when the DNS // mode is set to DnsMode::WithFallback, Chromium starts an asynchronous DoH server DnsProbe and @@ -59,16 +59,16 @@ void tst_QWebEngineGlobalSettings::dnsOverHttps_data() // non-self-signed certificates are used for correct encryption. Instead of implementing // all of that, this test verifies that Chromium tries probing the configured DoH server only. QTest::newRow("DnsMode::SecureWithFallback (mock DoH server)") - << QWebEngineGlobalSettings::DnsMode::SecureWithFallback + << QWebEngineGlobalSettings::SecureDnsMode::SecureWithFallback << QStringLiteral("https://127.0.0.1:3000/dns-query{?dns}") << true << true << true; QTest::newRow("DnsMode::SecureWithFallback (Empty URI Templates)") - << QWebEngineGlobalSettings::DnsMode::SecureWithFallback << QStringLiteral("") << false - << false << false; + << QWebEngineGlobalSettings::SecureDnsMode::SecureWithFallback << QStringLiteral("") + << false << false << false; } void tst_QWebEngineGlobalSettings::dnsOverHttps() { - QFETCH(QWebEngineGlobalSettings::DnsMode, dnsMode); + QFETCH(QWebEngineGlobalSettings::SecureDnsMode, dnsMode); QFETCH(QString, uriTemplate); QFETCH(bool, isMockDnsServerCalledExpected); QFETCH(bool, isDnsResolutionSuccessExpected); @@ -76,8 +76,8 @@ void tst_QWebEngineGlobalSettings::dnsOverHttps() bool isMockDnsServerCalled = false; bool isLoadSuccessful = false; - QWebEngineGlobalSettings *globalSettings = QWebEngineGlobalSettings::instance(); - bool configurationSuccess = globalSettings->setDnsMode(dnsMode, QStringList() << uriTemplate); + bool configurationSuccess = + QWebEngineGlobalSettings::setDnsMode({ dnsMode, QStringList{ uriTemplate } }); QCOMPARE(configurationSuccess, isConfigurationSuccessExpected); if (!configurationSuccess) { |