From a2a9ea11f95b4a5347f599d8a28151166ad00a71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCri=20Valdmann?= Date: Tue, 28 Apr 2020 14:45:18 +0200 Subject: Move QWebEngineCertificateError to core and use it in QML Update qml certificate error test. Task-number: QTBUG-74585 Change-Id: I9383052bd1e37160d03e3d66e8f2e4a749023736 Reviewed-by: Allan Sandfeld Jensen --- src/core/api/core_api.pro | 2 + src/core/api/qwebenginecertificateerror.cpp | 229 ++++++++++++++++++ src/core/api/qwebenginecertificateerror.h | 113 +++++++++ src/core/certificate_error_controller.cpp | 66 +++-- src/core/certificate_error_controller.h | 42 ++-- src/core/certificate_error_controller_p.h | 11 +- src/core/content_browser_client_qt.cpp | 30 +-- .../api/qquickwebenginecertificateerror.cpp | 251 ------------------- .../api/qquickwebenginecertificateerror_p.h | 115 --------- src/webengine/api/qquickwebengineview.cpp | 18 +- src/webengine/api/qquickwebengineview_p.h | 4 +- src/webengine/api/qquickwebengineview_p_p.h | 2 +- src/webengine/doc/src/webengineview_lgpl.qdoc | 107 ++++++++- src/webengine/module.pro | 2 - src/webengine/plugin/plugin.cpp | 5 +- src/webengine/plugin/plugins.qmltypes | 5 +- .../api/qwebenginecertificateerror.cpp | 266 --------------------- .../api/qwebenginecertificateerror.h | 104 -------- src/webenginewidgets/api/qwebenginepage.cpp | 3 +- src/webenginewidgets/api/qwebenginepage_p.h | 2 +- src/webenginewidgets/webenginewidgets.pro | 2 - tests/auto/quick/certificateerror/testhandler.cpp | 14 +- tests/auto/quick/certificateerror/testhandler.h | 11 +- .../certificateerror/tst_certificateerror.cpp | 31 ++- tests/auto/quick/publicapi/tst_publicapi.cpp | 54 +++-- 25 files changed, 605 insertions(+), 884 deletions(-) create mode 100644 src/core/api/qwebenginecertificateerror.cpp create mode 100644 src/core/api/qwebenginecertificateerror.h delete mode 100644 src/webengine/api/qquickwebenginecertificateerror.cpp delete mode 100644 src/webengine/api/qquickwebenginecertificateerror_p.h delete mode 100644 src/webenginewidgets/api/qwebenginecertificateerror.cpp delete mode 100644 src/webenginewidgets/api/qwebenginecertificateerror.h diff --git a/src/core/api/core_api.pro b/src/core/api/core_api.pro index 0ee13f0b5..aca83c7bb 100644 --- a/src/core/api/core_api.pro +++ b/src/core/api/core_api.pro @@ -36,6 +36,7 @@ HEADERS = \ qwebengineclientcertificatestore.h \ qtwebenginecoreglobal.h \ qtwebenginecoreglobal_p.h \ + qwebenginecertificateerror.h \ qwebenginecookiestore.h \ qwebenginecookiestore_p.h \ qwebenginefindtextresult.h \ @@ -55,6 +56,7 @@ HEADERS = \ SOURCES = \ qtwebenginecoreglobal.cpp \ + qwebenginecertificateerror.cpp \ qwebengineclientcertificatestore.cpp \ qwebenginecookiestore.cpp \ qwebenginefindtextresult.cpp \ diff --git a/src/core/api/qwebenginecertificateerror.cpp b/src/core/api/qwebenginecertificateerror.cpp new file mode 100644 index 000000000..2e5768a0c --- /dev/null +++ b/src/core/api/qwebenginecertificateerror.cpp @@ -0,0 +1,229 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwebenginecertificateerror.h" + +#include "certificate_error_controller.h" + +QT_BEGIN_NAMESPACE + +ASSERT_ENUMS_MATCH(CertificateErrorController::SslPinnedKeyNotInCertificateChain, QWebEngineCertificateError::SslPinnedKeyNotInCertificateChain); +ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateCommonNameInvalid, QWebEngineCertificateError::CertificateCommonNameInvalid); +ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateCommonNameInvalid, QWebEngineCertificateError::CertificateCommonNameInvalid); +ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateDateInvalid, QWebEngineCertificateError::CertificateDateInvalid); +ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateAuthorityInvalid, QWebEngineCertificateError::CertificateAuthorityInvalid); +ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateContainsErrors, QWebEngineCertificateError::CertificateContainsErrors); +ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateUnableToCheckRevocation, QWebEngineCertificateError::CertificateUnableToCheckRevocation); +ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateRevoked, QWebEngineCertificateError::CertificateRevoked); +ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateInvalid, QWebEngineCertificateError::CertificateInvalid); +ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateWeakSignatureAlgorithm, QWebEngineCertificateError::CertificateWeakSignatureAlgorithm); +ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateNonUniqueName, QWebEngineCertificateError::CertificateNonUniqueName); +ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateWeakKey, QWebEngineCertificateError::CertificateWeakKey); +ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateNameConstraintViolation, QWebEngineCertificateError::CertificateNameConstraintViolation); +ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateValidityTooLong, QWebEngineCertificateError::CertificateValidityTooLong); +ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateTransparencyRequired, QWebEngineCertificateError::CertificateTransparencyRequired); +ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateKnownInterceptionBlocked, QWebEngineCertificateError::CertificateKnownInterceptionBlocked); + +/*! + \class QWebEngineCertificateError + \brief The QWebEngineCertificateError class provides information about a certificate error. + \since 5.4 + \inmodule QtWebEngineCore + + Provides information about a certificate error. This class is used as a parameter of + QWebEnginePage::certificateError(). +*/ + +/*! \internal +*/ +QWebEngineCertificateError::QWebEngineCertificateError(const QSharedPointer &controller) + : d(controller) +{ +} + +QWebEngineCertificateError::QWebEngineCertificateError(const QWebEngineCertificateError &) = default; + +QWebEngineCertificateError& QWebEngineCertificateError::operator=(const QWebEngineCertificateError &) = default; + +/*! \internal +*/ +QWebEngineCertificateError::~QWebEngineCertificateError() = default; + +/*! + \enum QWebEngineCertificateError::Error + + This enum describes the type of certificate error encountered. + + The values of this enum type match the SSL errors Chromium provides. + QSslError::SslError values are not used directly, because the Qt error + categories cannot be mapped to the Chromium error categories. + + \value SslPinnedKeyNotInCertificateChain The certificate did not match the built-in public keys + pinned for the host name. + \value CertificateCommonNameInvalid The certificate's common name did not match the host name. + \value CertificateDateInvalid The certificate is not valid at the current date and time. + \value CertificateAuthorityInvalid The certificate is not signed by a trusted authority. + \value CertificateContainsErrors The certificate contains errors. + \value CertificateNoRevocationMechanism The certificate has no mechanism for determining if it has been revoked. + \value CertificateUnableToCheckRevocation Revocation information for the certificate is not available. + \value CertificateRevoked The certificate has been revoked. + \value CertificateInvalid The certificate is invalid. + \value CertificateWeakSignatureAlgorithm The certificate is signed using a weak signature algorithm. + \value CertificateNonUniqueName The host name specified in the certificate is not unique. + \value CertificateWeakKey The certificate contains a weak key. + \value CertificateNameConstraintViolation The certificate claimed DNS names that are in violation of name constraints. + \value CertificateValidityTooLong The certificate has a validity period that is too long. (Added in Qt 5.7) + \value CertificateTransparencyRequired Certificate Transparency was required for this connection, but the server + did not provide CT information that complied with the policy. (Added in Qt 5.8) + \value CertificateKnownInterceptionBlocked The certificate is known to be + used for interception by an entity other the device owner. (Added in + 5.15) +*/ + +/*! + Returns whether this error can be overridden and accepted. + + \sa error(), errorDescription() +*/ +bool QWebEngineCertificateError::isOverridable() const +{ + return d->overridable(); +} + +/*! + Returns the URL that triggered the error. + + \sa error(), errorDescription() +*/ +QUrl QWebEngineCertificateError::url() const +{ + return d->url(); +} + +/*! + Returns the type of the error. + + \sa errorDescription(), isOverridable() +*/ +QWebEngineCertificateError::Error QWebEngineCertificateError::error() const +{ + return Error(d->error()); +} + +/*! + Returns a short localized human-readable description of the error. + + \sa error(), url(), isOverridable() +*/ +QString QWebEngineCertificateError::errorDescription() const +{ + return d->errorString(); +} + +/*! + \since 5.14 + + Marks the certificate error for delayed handling. + + This function should be called when there is a need to postpone the decision whether to ignore a + certificate error, for example, while waiting for user input. When called, the function pauses the + URL request until ignoreCertificateError() or rejectCertificate() is called. + + \note It is only possible to defer overridable certificate errors. + + \sa isOverridable(), deferred() +*/ +void QWebEngineCertificateError::defer() +{ + d->defer(); +} + +/*! + \since 5.14 + + Returns whether the decision for error handling was delayed and the URL load was halted. +*/ +bool QWebEngineCertificateError::deferred() const +{ + return d->deferred(); +} + +/*! + \since 5.14 + + Ignores the certificate error and continues the loading of the requested URL. +*/ +void QWebEngineCertificateError::ignoreCertificateError() +{ + d->ignoreCertificateError(); +} + +/*! + \since 5.14 + + Rejects the certificate and aborts the loading of the requested URL. +*/ +void QWebEngineCertificateError::rejectCertificate() +{ + d->rejectCertificate(); +} + +/*! + \since 5.14 + + Returns \c true if the error was explicitly rejected or ignored. +*/ +bool QWebEngineCertificateError::answered() const +{ + return d->answered(); +} + +/*! + \since 5.14 + + Returns the peer's chain of digital certificates. + + Chain starts with the peer's immediate certificate and ending with the CA's certificate. +*/ +QList QWebEngineCertificateError::certificateChain() const +{ + return d->certificateChain(); +} + +QT_END_NAMESPACE diff --git a/src/core/api/qwebenginecertificateerror.h b/src/core/api/qwebenginecertificateerror.h new file mode 100644 index 000000000..67da69a78 --- /dev/null +++ b/src/core/api/qwebenginecertificateerror.h @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWEBENGINECERTIFICATEERROR_H +#define QWEBENGINECERTIFICATEERROR_H + +#include + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class CertificateErrorController; + +class Q_WEBENGINECORE_EXPORT QWebEngineCertificateError { + Q_GADGET + Q_PROPERTY(QUrl url READ url CONSTANT FINAL) + Q_PROPERTY(Error error READ error CONSTANT FINAL) + Q_PROPERTY(QString description READ errorDescription CONSTANT FINAL) + Q_PROPERTY(bool overridable READ isOverridable CONSTANT FINAL) + Q_PROPERTY(bool deferred READ deferred CONSTANT FINAL) + Q_PROPERTY(bool answered READ answered CONSTANT FINAL) + +public: + QWebEngineCertificateError(const QWebEngineCertificateError &other); + QWebEngineCertificateError& operator=(const QWebEngineCertificateError &other); + ~QWebEngineCertificateError(); + + // Keep this identical to CertificateErrorController::CertificateError, or add mapping layer. + enum Error { + SslPinnedKeyNotInCertificateChain = -150, + CertificateCommonNameInvalid = -200, + CertificateDateInvalid = -201, + CertificateAuthorityInvalid = -202, + CertificateContainsErrors = -203, + CertificateNoRevocationMechanism = -204, + CertificateUnableToCheckRevocation = -205, + CertificateRevoked = -206, + CertificateInvalid = -207, + CertificateWeakSignatureAlgorithm = -208, + CertificateNonUniqueName = -210, + CertificateWeakKey = -211, + CertificateNameConstraintViolation = -212, + CertificateValidityTooLong = -213, + CertificateTransparencyRequired = -214, + CertificateKnownInterceptionBlocked = -217, + }; + Q_ENUM(Error) + + Error error() const; + QUrl url() const; + bool isOverridable() const; + QString errorDescription() const; + + Q_INVOKABLE void defer(); + bool deferred() const; + + Q_INVOKABLE void rejectCertificate(); + Q_INVOKABLE void ignoreCertificateError(); + bool answered() const; + + QList certificateChain() const; + +private: + friend class QWebEnginePagePrivate; + friend class QQuickWebEngineViewPrivate; + QWebEngineCertificateError(const QSharedPointer &controller); + QSharedPointer d; +}; + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(QWebEngineCertificateError) + +#endif // QWEBENGINECERTIFICATEERROR_H diff --git a/src/core/certificate_error_controller.cpp b/src/core/certificate_error_controller.cpp index 353228c2d..79f6a8cf2 100644 --- a/src/core/certificate_error_controller.cpp +++ b/src/core/certificate_error_controller.cpp @@ -71,28 +71,45 @@ ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateSymantecLegacy, net::E ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateKnownInterceptionBlocked, net::ERR_CERT_KNOWN_INTERCEPTION_BLOCKED) ASSERT_ENUMS_MATCH(CertificateErrorController::CertificateErrorEnd, net::ERR_CERT_END) -void CertificateErrorControllerPrivate::accept(bool accepted) +// Copied from chrome/browser/ssl/ssl_error_handler.cc: +static int IsCertErrorFatal(int cert_error) { - std::move(callback).Run(accepted ? content::CERTIFICATE_REQUEST_RESULT_TYPE_CONTINUE : content::CERTIFICATE_REQUEST_RESULT_TYPE_DENY); + switch (cert_error) { + case net::ERR_CERT_COMMON_NAME_INVALID: + case net::ERR_CERT_DATE_INVALID: + case net::ERR_CERT_AUTHORITY_INVALID: + case net::ERR_CERT_WEAK_SIGNATURE_ALGORITHM: + case net::ERR_CERT_WEAK_KEY: + case net::ERR_CERT_NAME_CONSTRAINT_VIOLATION: + case net::ERR_CERT_VALIDITY_TOO_LONG: + case net::ERR_CERTIFICATE_TRANSPARENCY_REQUIRED: + case net::ERR_CERT_SYMANTEC_LEGACY: + return false; + case net::ERR_CERT_CONTAINS_ERRORS: + case net::ERR_CERT_REVOKED: + case net::ERR_CERT_INVALID: + case net::ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEY: + case net::ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN: + return true; + default: + NOTREACHED(); + } + return true; } + CertificateErrorControllerPrivate::CertificateErrorControllerPrivate(int cert_error, const net::SSLInfo& ssl_info, const GURL &request_url, - bool main_frame, - bool fatal_error, bool strict_enforcement, base::OnceCallback cb ) : certError(CertificateErrorController::CertificateError(cert_error)) , requestUrl(toQt(request_url)) - , resourceType(main_frame ? CertificateErrorController::ResourceTypeMainFrame : CertificateErrorController::ResourceTypeOther) - , fatalError(fatal_error) - , strictEnforcement(strict_enforcement) - , callback(std::move(cb)) + , overridable(!IsCertErrorFatal(cert_error) && !strict_enforcement) { + if (overridable) callback = std::move(cb); if (auto cert = ssl_info.cert.get()) { - validStart = toQt(cert->valid_start()); validExpiry = toQt(cert->valid_expiry()); certificateChain = toCertificateChain(cert); } @@ -104,8 +121,8 @@ CertificateErrorController::CertificateErrorController(CertificateErrorControlle CertificateErrorController::~CertificateErrorController() { - delete d; - d = 0; + if (!answered()) + rejectCertificate(); } CertificateErrorController::CertificateError CertificateErrorController::error() const @@ -120,22 +137,37 @@ QUrl CertificateErrorController::url() const bool CertificateErrorController::overridable() const { - return !d->fatalError && !d->strictEnforcement; + return d->overridable; +} + +bool CertificateErrorController::deferred() const +{ + return d->deferred; } -bool CertificateErrorController::strictEnforcement() const +void CertificateErrorController::defer() { - return d->strictEnforcement; + d->deferred = true; +} + +bool CertificateErrorController::answered() const +{ + return d->answered; } void CertificateErrorController::accept(bool accepted) { - d->accept(accepted); + if (answered()) + return; + + d->answered = true; + if (d->callback) + std::move(d->callback).Run(accepted ? content::CERTIFICATE_REQUEST_RESULT_TYPE_CONTINUE : content::CERTIFICATE_REQUEST_RESULT_TYPE_DENY); } -CertificateErrorController::ResourceType CertificateErrorController::resourceType() const +void CertificateErrorController::deactivate() { - return d->resourceType; + d->callback.Reset(); } static QString getQStringForMessageId(int message_id) { diff --git a/src/core/certificate_error_controller.h b/src/core/certificate_error_controller.h index dc1c3cf54..be5efd79d 100644 --- a/src/core/certificate_error_controller.h +++ b/src/core/certificate_error_controller.h @@ -54,6 +54,7 @@ #include "qtwebenginecoreglobal_p.h" #include +#include #include #include @@ -92,41 +93,30 @@ public: CertificateError error() const; QUrl url() const; bool overridable() const; - bool strictEnforcement() const; QString errorString() const; - QDateTime validStart() const; QDateTime validExpiry() const; QList certificateChain() const; + bool deferred() const; + void defer(); + + bool answered() const; void accept(bool); - // Note: The resource type should probably not be exported, since once accepted the certificate exception - // counts for all resource types. - // Keep up to date with webkit/common/resource_type.h - enum ResourceType { - ResourceTypeMainFrame = 0, // top level page - ResourceTypeSubFrame, // frame or iframe - ResourceTypeStylesheet, // a CSS stylesheet - ResourceTypeScript, // an external script - ResourceTypeImage, // an image (jpg/gif/png/etc) - ResourceTypeFont, // a font - ResourceTypeOther, // an "other" subresource. - ResourceTypeObject, // an object (or embed) tag for a plugin, - // or a resource that a plugin requested. - ResourceTypeMedia, // a media resource. - ResourceTypeWorker, // the main resource of a dedicated worker. - ResourceTypeSharedWorker, // the main resource of a shared worker. - ResourceTypePrefetch, // an explicitly requested prefetch - ResourceTypeFavicon, // a favicon - ResourceTypeXHR, // a XMLHttpRequest - ResourceTypePing, // a ping request for - ResourceTypeServiceWorker, // the main resource of a service worker. - }; + void ignoreCertificateError() { accept(true); } + void rejectCertificate() { accept(false); } - ResourceType resourceType() const; + void deactivate(); + static void clear(QList> &controllers) { + for (auto &&wc : controllers) + if (auto controller = wc.lock()) + controller->deactivate(); + controllers.clear(); + } private: - CertificateErrorControllerPrivate* d; + QScopedPointer d; + Q_DISABLE_COPY(CertificateErrorController) }; QT_END_NAMESPACE diff --git a/src/core/certificate_error_controller_p.h b/src/core/certificate_error_controller_p.h index b0b0bc658..f46670cf5 100644 --- a/src/core/certificate_error_controller_p.h +++ b/src/core/certificate_error_controller_p.h @@ -59,19 +59,16 @@ QT_BEGIN_NAMESPACE class CertificateErrorControllerPrivate { public: - CertificateErrorControllerPrivate(int cert_error, const net::SSLInfo& ssl_info, const GURL& request_url, bool main_frame, bool fatal_error, bool strict_enforcement, base::OnceCallback callback); - - void accept(bool accepted); + CertificateErrorControllerPrivate(int cert_error, const net::SSLInfo& ssl_info, const GURL& request_url, bool strict_enforcement, base::OnceCallback callback); CertificateErrorController::CertificateError certError; const QUrl requestUrl; - QDateTime validStart; QDateTime validExpiry; - CertificateErrorController::ResourceType resourceType; - bool fatalError; - bool strictEnforcement; + bool overridable; base::OnceCallback callback; QList certificateChain; + + bool answered = false, deferred = false; }; QT_END_NAMESPACE diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp index 32013849b..c39d28fef 100644 --- a/src/core/content_browser_client_qt.cpp +++ b/src/core/content_browser_client_qt.cpp @@ -302,37 +302,11 @@ void ContentBrowserClientQt::GetQuotaSettings(content::BrowserContext* context, storage::GetDefaultDeviceInfoHelper(), std::move(callback)); } -// Copied from chrome/browser/ssl/ssl_error_handler.cc: -static int IsCertErrorFatal(int cert_error) -{ - switch (cert_error) { - case net::ERR_CERT_COMMON_NAME_INVALID: - case net::ERR_CERT_DATE_INVALID: - case net::ERR_CERT_AUTHORITY_INVALID: - case net::ERR_CERT_WEAK_SIGNATURE_ALGORITHM: - case net::ERR_CERT_WEAK_KEY: - case net::ERR_CERT_NAME_CONSTRAINT_VIOLATION: - case net::ERR_CERT_VALIDITY_TOO_LONG: - case net::ERR_CERTIFICATE_TRANSPARENCY_REQUIRED: - case net::ERR_CERT_SYMANTEC_LEGACY: - return false; - case net::ERR_CERT_CONTAINS_ERRORS: - case net::ERR_CERT_REVOKED: - case net::ERR_CERT_INVALID: - case net::ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEY: - case net::ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN: - return true; - default: - NOTREACHED(); - } - return true; -} - void ContentBrowserClientQt::AllowCertificateError(content::WebContents *webContents, int cert_error, const net::SSLInfo &ssl_info, const GURL &request_url, - bool is_main_frame_request, + bool /* is_main_frame_request */, bool strict_enforcement, base::OnceCallback callback) { @@ -344,8 +318,6 @@ void ContentBrowserClientQt::AllowCertificateError(content::WebContents *webCont cert_error, ssl_info, request_url, - is_main_frame_request, - IsCertErrorFatal(cert_error), strict_enforcement, std::move(callback)))); contentsDelegate->allowCertificateError(errorController); diff --git a/src/webengine/api/qquickwebenginecertificateerror.cpp b/src/webengine/api/qquickwebenginecertificateerror.cpp deleted file mode 100644 index 63beb1bae..000000000 --- a/src/webengine/api/qquickwebenginecertificateerror.cpp +++ /dev/null @@ -1,251 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWebEngine module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include "certificate_error_controller.h" -QT_BEGIN_NAMESPACE - -class QQuickWebEngineCertificateErrorPrivate { -public: - QQuickWebEngineCertificateErrorPrivate(const QSharedPointer &controller) - : weakRefCertErrorController(controller), - error(static_cast(static_cast(controller->error()))), - description(controller->errorString()), - overridable(controller->overridable()), - async(false), - answered(false) - { - } - - const QWeakPointer weakRefCertErrorController; - QQuickWebEngineCertificateError::Error error; - QString description; - bool overridable; - bool async; - bool answered; -}; - -/*! - \qmltype WebEngineCertificateError - \instantiates QQuickWebEngineCertificateError - \inqmlmodule QtWebEngine - \since QtWebEngine 1.1 - - \brief A utility type for ignoring certificate errors or rejecting erroneous certificates. - - This QML type contains information about a certificate error that occurred. The \l error - property holds the reason that the error occurred and the \l description property holds a - short localized description of the error. The \l url property holds the URL that triggered - the error. - - The certificate can be rejected by calling \l rejectCertificate, which will stop loading the - web engine request. By default, an invalid certificate will be automatically rejected. - - The certificate error can be ignored by calling \l ignoreCertificateError, which will - resume loading the request. - - It is possible to defer the decision of rejecting a certificate by calling \l defer, - which is useful when waiting for user input. - - \sa WebEngineView::certificateError -*/ -QQuickWebEngineCertificateError::QQuickWebEngineCertificateError(const QSharedPointer &controller, QObject *parent) - : QObject(parent) - , d_ptr(new QQuickWebEngineCertificateErrorPrivate(controller)) -{ -} - -QQuickWebEngineCertificateError::~QQuickWebEngineCertificateError() -{ - Q_D(QQuickWebEngineCertificateError); - if (!d->answered) - rejectCertificate(); -} - - -/*! - \qmlmethod void WebEngineCertificateError::defer() - - This function should be called when there is a need to postpone the decision whether to ignore a - certificate error, for example, while waiting for user input. When called, the function pauses the - URL request until WebEngineCertificateError::ignoreCertificateError() or - WebEngineCertificateError::rejectCertificate() is called. - */ -void QQuickWebEngineCertificateError::defer() -{ - Q_D(QQuickWebEngineCertificateError); - d->async = true; -} -/*! - \qmlmethod void WebEngineCertificateError::ignoreCertificateError() - - The certificate error is ignored, and the web engine view continues to load the requested URL. - */ -void QQuickWebEngineCertificateError::ignoreCertificateError() -{ - Q_D(QQuickWebEngineCertificateError); - - d->answered = true; - - QSharedPointer strongRefCert = d->weakRefCertErrorController.toStrongRef(); - if (strongRefCert) - strongRefCert->accept(true); -} - -/*! - \qmlmethod void WebEngineCertificateError::rejectCertificate() - - The certificate is rejected, and the web engine view stops loading the requested URL. - */ -void QQuickWebEngineCertificateError::rejectCertificate() -{ - Q_D(QQuickWebEngineCertificateError); - - d->answered = true; - - QSharedPointer strongRefCert = d->weakRefCertErrorController.toStrongRef(); - if (strongRefCert) - strongRefCert->accept(false); -} - -/*! - \qmlproperty url WebEngineCertificateError::url - \readonly - - The URL that triggered the error. - */ -QUrl QQuickWebEngineCertificateError::url() const -{ - Q_D(const QQuickWebEngineCertificateError); - QSharedPointer strongRefCert = d->weakRefCertErrorController.toStrongRef(); - if (strongRefCert) - return strongRefCert->url(); - return QUrl(); -} - -/*! - \qmlproperty enumeration WebEngineCertificateError::error - \readonly - - The type of the error. - - \value WebEngineCertificateError.SslPinnedKeyNotInCertificateChain - The certificate did not match the built-in public keys pinned for - the host name. - \value WebEngineCertificateError.CertificateCommonNameInvalid - The certificate's common name did not match the host name. - \value WebEngineCertificateError.CertificateDateInvalid - The certificate is not valid at the current date and time. - \value WebEngineCertificateError.CertificateAuthorityInvalid - The certificate is not signed by a trusted authority. - \value WebEngineCertificateError.CertificateContainsErrors - The certificate contains errors. - \value WebEngineCertificateError.CertificateNoRevocationMechanism - The certificate has no mechanism for determining if it has been - revoked. - \value WebEngineCertificateError.CertificateUnableToCheckRevocation - Revocation information for the certificate is not available. - \value WebEngineCertificateError.CertificateRevoked - The certificate has been revoked. - \value WebEngineCertificateError.CertificateInvalid - The certificate is invalid. - \value WebEngineCertificateError.CertificateWeakSignatureAlgorithm - The certificate is signed using a weak signature algorithm. - \value WebEngineCertificateError.CertificateNonUniqueName - The host name specified in the certificate is not unique. - \value WebEngineCertificateError.CertificateWeakKey - The certificate contains a weak key. - \value WebEngineCertificateError.CertificateNameConstraintViolation - The certificate claimed DNS names that are in violation of name - constraints. - \value WebEngineCertificateError.CertificateValidityTooLong - The certificate has a validity period that is too long. - (Added in 5.7) - \value WebEngineCertificateError.CertificateTransparencyRequired - Certificate Transparency was required for this connection, but the server - did not provide CT information that complied with the policy. (Added in 5.8) - \value WebEngineCertificateError.CertificateKnownInterceptionBlocked - The certificate is known to be used for interception by an entity other - the device owner. (Added in 5.15) - -*/ -QQuickWebEngineCertificateError::Error QQuickWebEngineCertificateError::error() const -{ - Q_D(const QQuickWebEngineCertificateError); - return d->error; -} - -/*! - \qmlproperty string WebEngineCertificateError::description - \readonly - - A short localized human-readable description of the error. -*/ -QString QQuickWebEngineCertificateError::description() const -{ - Q_D(const QQuickWebEngineCertificateError); - return d->description; -} - -/*! - \qmlproperty bool WebEngineCertificateError::overridable - \readonly - - A boolean that indicates whether the certificate error can be overridden and ignored. -*/ -bool QQuickWebEngineCertificateError::overridable() const -{ - Q_D(const QQuickWebEngineCertificateError); - return d->overridable; -} - -bool QQuickWebEngineCertificateError::deferred() const -{ - Q_D(const QQuickWebEngineCertificateError); - return d->async; -} - -bool QQuickWebEngineCertificateError::answered() const -{ - Q_D(const QQuickWebEngineCertificateError); - return d->answered; -} - -QT_END_NAMESPACE - diff --git a/src/webengine/api/qquickwebenginecertificateerror_p.h b/src/webengine/api/qquickwebenginecertificateerror_p.h deleted file mode 100644 index 4a8ef6ae0..000000000 --- a/src/webengine/api/qquickwebenginecertificateerror_p.h +++ /dev/null @@ -1,115 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWebEngine module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QQUICKWEBENGINECERTIFICATEERROR_P_H -#define QQUICKWEBENGINECERTIFICATEERROR_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include -#include "qquickwebengineview_p.h" - -QT_BEGIN_NAMESPACE - -class QQuickWebEngineCertificateErrorPrivate; -class CertificateErrorController; - -class Q_WEBENGINE_EXPORT QQuickWebEngineCertificateError : public QObject { - Q_OBJECT - Q_PROPERTY(QUrl url READ url CONSTANT FINAL) - Q_PROPERTY(Error error READ error CONSTANT FINAL) - Q_PROPERTY(QString description READ description CONSTANT FINAL) - Q_PROPERTY(bool overridable READ overridable CONSTANT FINAL) - -public: - - // Keep this identical to CertificateErrorController::CertificateError, or add mapping layer. - enum Error { - SslPinnedKeyNotInCertificateChain = -150, - CertificateCommonNameInvalid = -200, - CertificateDateInvalid = -201, - CertificateAuthorityInvalid = -202, - CertificateContainsErrors = -203, - CertificateNoRevocationMechanism = -204, - CertificateUnableToCheckRevocation = -205, - CertificateRevoked = -206, - CertificateInvalid = -207, - CertificateWeakSignatureAlgorithm = -208, - CertificateNonUniqueName = -210, - CertificateWeakKey = -211, - CertificateNameConstraintViolation = -212, - CertificateValidityTooLong = -213, - CertificateTransparencyRequired = -214, - CertificateKnownInterceptionBlocked = -217, - }; - Q_ENUM(Error) - - QQuickWebEngineCertificateError(const QSharedPointer &controller, QObject *parent = 0); - ~QQuickWebEngineCertificateError(); - - Q_INVOKABLE void defer(); - Q_INVOKABLE void ignoreCertificateError(); - Q_INVOKABLE void rejectCertificate(); - QUrl url() const; - Error error() const; - QString description() const; - bool overridable() const; - bool deferred() const; - bool answered() const; - -private: - Q_DISABLE_COPY(QQuickWebEngineCertificateError) - Q_DECLARE_PRIVATE(QQuickWebEngineCertificateError) - QScopedPointer d_ptr; -}; - -QT_END_NAMESPACE - -QML_DECLARE_TYPE(QQuickWebEngineCertificateError) - -#endif // QQUICKWEBENGINECERTIFICATEERROR_P_H diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index e86f78e4d..7f0d1df84 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -50,7 +50,6 @@ #include "qquickwebengineaction_p.h" #include "qquickwebengineaction_p_p.h" #include "qquickwebenginehistory_p.h" -#include "qquickwebenginecertificateerror_p.h" #include "qquickwebengineclientcertificateselection_p.h" #include "qquickwebenginedialogrequests_p.h" #include "qquickwebenginefaviconprovider_p_p.h" @@ -61,6 +60,7 @@ #include "qquickwebenginesettings_p.h" #include "qquickwebenginescript_p.h" #include "qquickwebenginetouchhandleprovider_p_p.h" +#include "qwebenginecertificateerror.h" #include "qwebenginefindtextresult.h" #include "qwebenginequotarequest.h" #include "qwebengineregisterprotocolhandlerrequest.h" @@ -292,18 +292,16 @@ void QQuickWebEngineViewPrivate::javascriptDialog(QSharedPointershowDialog(dialog); } -void QQuickWebEngineViewPrivate::allowCertificateError(const QSharedPointer &errorController) +void QQuickWebEngineViewPrivate::allowCertificateError(const QSharedPointer &controller) { Q_Q(QQuickWebEngineView); - QQuickWebEngineCertificateError *quickController = new QQuickWebEngineCertificateError(errorController); - // mark the object for gc by creating temporary jsvalue - qmlEngine(q)->newQObject(quickController); - Q_EMIT q->certificateError(quickController); - if (!quickController->overridable() || (!quickController->deferred() && !quickController->answered())) - quickController->rejectCertificate(); + QWebEngineCertificateError error(controller); + Q_EMIT q->certificateError(error); + if (!error.isOverridable() || (!error.deferred() && !error.answered())) + error.rejectCertificate(); else - m_certificateErrorControllers.append(errorController); + m_certificateErrorControllers.append(controller); } void QQuickWebEngineViewPrivate::selectClientCert(const QSharedPointer &controller) @@ -470,7 +468,7 @@ void QQuickWebEngineViewPrivate::loadStarted(const QUrl &provisionalUrl, bool is isLoading = true; m_history->reset(); - m_certificateErrorControllers.clear(); + CertificateErrorController::clear(m_certificateErrorControllers); QTimer::singleShot(0, q, [q, provisionalUrl]() { QQuickWebEngineLoadRequest loadRequest(provisionalUrl, QQuickWebEngineView::LoadStartedStatus); diff --git a/src/webengine/api/qquickwebengineview_p.h b/src/webengine/api/qquickwebengineview_p.h index 1ac383ba6..e169d0490 100644 --- a/src/webengine/api/qquickwebengineview_p.h +++ b/src/webengine/api/qquickwebengineview_p.h @@ -69,7 +69,6 @@ class QQmlWebChannel; class QQuickContextMenuBuilder; class QQuickWebEngineAction; class QQuickWebEngineAuthenticationDialogRequest; -class QQuickWebEngineCertificateError; class QQuickWebEngineClientCertificateSelection; class QQuickWebEngineColorDialogRequest; class QQuickWebEngineFaviconProvider; @@ -83,6 +82,7 @@ class QQuickWebEngineSettings; class QQuickWebEngineTooltipRequest; class QQuickWebEngineFormValidationMessageRequest; class QQuickWebEngineViewPrivate; +class QWebEngineCertificateError; class QWebEngineFindTextResult; class QWebEngineQuotaRequest; class QWebEngineRegisterProtocolHandlerRequest; @@ -552,7 +552,7 @@ Q_SIGNALS: void linkHovered(const QUrl &hoveredUrl); void navigationRequested(QQuickWebEngineNavigationRequest *request); void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString &message, int lineNumber, const QString &sourceID); - Q_REVISION(1) void certificateError(QQuickWebEngineCertificateError *error); + Q_REVISION(1) void certificateError(const QWebEngineCertificateError &error); Q_REVISION(1) void fullScreenRequested(const QQuickWebEngineFullScreenRequest &request); Q_REVISION(1) void isFullScreenChanged(); Q_REVISION(1) void featurePermissionRequested(const QUrl &securityOrigin, Feature feature); diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h index 21f813a33..790853ebd 100644 --- a/src/webengine/api/qquickwebengineview_p_p.h +++ b/src/webengine/api/qquickwebengineview_p_p.h @@ -211,7 +211,7 @@ public: bool m_navigationActionTriggered; qreal devicePixelRatio; QMap m_callbacks; - QList > m_certificateErrorControllers; + QList > m_certificateErrorControllers; QQmlWebChannel *m_webChannel; QPointer inspectedView; QPointer devToolsView; diff --git a/src/webengine/doc/src/webengineview_lgpl.qdoc b/src/webengine/doc/src/webengineview_lgpl.qdoc index f55477fa2..fe31e74a9 100644 --- a/src/webengine/doc/src/webengineview_lgpl.qdoc +++ b/src/webengine/doc/src/webengineview_lgpl.qdoc @@ -1485,7 +1485,6 @@ \sa renderProcessPidChanged */ - /*! \qmlsignal WebEngineView::renderProcessPidChanged(qint64 pid) \since QtWebEngine 1.11 @@ -1497,3 +1496,109 @@ \sa renderProcessPid */ +/*! + \qmltype WebEngineCertificateError + \instantiates QWebEngineCertificateError + \inqmlmodule QtWebEngine + \since QtWebEngine 1.1 + + \brief A utility type for ignoring certificate errors or rejecting erroneous certificates. + + This QML type contains information about a certificate error that occurred. The \l error + property holds the reason that the error occurred and the \l description property holds a + short localized description of the error. The \l url property holds the URL that triggered + the error. + + The certificate can be rejected by calling \l rejectCertificate, which will stop loading the + web engine request. By default, an invalid certificate will be automatically rejected. + + The certificate error can be ignored by calling \l ignoreCertificateError, which will + resume loading the request. + + It is possible to defer the decision of rejecting a certificate by calling \l defer, + which is useful when waiting for user input. + + \sa WebEngineView::certificateError +*/ +/*! + \qmlmethod void WebEngineCertificateError::defer() + + This function should be called when there is a need to postpone the decision whether to ignore a + certificate error, for example, while waiting for user input. When called, the function pauses the + URL request until WebEngineCertificateError::ignoreCertificateError() or + WebEngineCertificateError::rejectCertificate() is called. + */ +/*! + \qmlmethod void WebEngineCertificateError::ignoreCertificateError() + + The certificate error is ignored, and the web engine view continues to load the requested URL. + */ +/*! + \qmlmethod void WebEngineCertificateError::rejectCertificate() + + The certificate is rejected, and the web engine view stops loading the requested URL. + */ +/*! + \qmlproperty url WebEngineCertificateError::url + \readonly + + The URL that triggered the error. + */ +/*! + \qmlproperty enumeration WebEngineCertificateError::error + \readonly + + The type of the error. + + \value WebEngineCertificateError.SslPinnedKeyNotInCertificateChain + The certificate did not match the built-in public keys pinned for + the host name. + \value WebEngineCertificateError.CertificateCommonNameInvalid + The certificate's common name did not match the host name. + \value WebEngineCertificateError.CertificateDateInvalid + The certificate is not valid at the current date and time. + \value WebEngineCertificateError.CertificateAuthorityInvalid + The certificate is not signed by a trusted authority. + \value WebEngineCertificateError.CertificateContainsErrors + The certificate contains errors. + \value WebEngineCertificateError.CertificateNoRevocationMechanism + The certificate has no mechanism for determining if it has been + revoked. + \value WebEngineCertificateError.CertificateUnableToCheckRevocation + Revocation information for the certificate is not available. + \value WebEngineCertificateError.CertificateRevoked + The certificate has been revoked. + \value WebEngineCertificateError.CertificateInvalid + The certificate is invalid. + \value WebEngineCertificateError.CertificateWeakSignatureAlgorithm + The certificate is signed using a weak signature algorithm. + \value WebEngineCertificateError.CertificateNonUniqueName + The host name specified in the certificate is not unique. + \value WebEngineCertificateError.CertificateWeakKey + The certificate contains a weak key. + \value WebEngineCertificateError.CertificateNameConstraintViolation + The certificate claimed DNS names that are in violation of name + constraints. + \value WebEngineCertificateError.CertificateValidityTooLong + The certificate has a validity period that is too long. + (Added in 5.7) + \value WebEngineCertificateError.CertificateTransparencyRequired + Certificate Transparency was required for this connection, but the server + did not provide CT information that complied with the policy. (Added in 5.8) + \value WebEngineCertificateError.CertificateKnownInterceptionBlocked + The certificate is known to be used for interception by an entity other + the device owner. (Added in 5.15) + +*/ +/*! + \qmlproperty string WebEngineCertificateError::description + \readonly + + A short localized human-readable description of the error. +*/ +/*! + \qmlproperty bool WebEngineCertificateError::overridable + \readonly + + A boolean that indicates whether the certificate error can be overridden and ignored. +*/ diff --git a/src/webengine/module.pro b/src/webengine/module.pro index 56bfce48f..40c0f57b8 100644 --- a/src/webengine/module.pro +++ b/src/webengine/module.pro @@ -16,7 +16,6 @@ INCLUDEPATH += $$PWD api ../core ../core/api SOURCES = \ api/qquickwebengineaction.cpp \ - api/qquickwebenginecertificateerror.cpp \ api/qquickwebengineclientcertificateselection.cpp \ api/qquickwebenginedialogrequests.cpp \ api/qquickwebenginedownloaditem.cpp \ @@ -41,7 +40,6 @@ HEADERS = \ api/qtwebengineglobal_p.h \ api/qquickwebengineaction_p.h \ api/qquickwebengineaction_p_p.h \ - api/qquickwebenginecertificateerror_p.h \ api/qquickwebengineclientcertificateselection_p.h \ api/qquickwebenginedialogrequests_p.h \ api/qquickwebenginedownloaditem_p.h \ diff --git a/src/webengine/plugin/plugin.cpp b/src/webengine/plugin/plugin.cpp index 2603e91ef..25cb375ad 100644 --- a/src/webengine/plugin/plugin.cpp +++ b/src/webengine/plugin/plugin.cpp @@ -40,7 +40,6 @@ #include #include -#include #include #include #include @@ -54,6 +53,7 @@ #include #include #include +#include #include #include #include @@ -105,7 +105,8 @@ public: qmlRegisterType(uri, 1, 5, "WebEngineProfile"); qmlRegisterType(uri, 1, 9, "WebEngineProfile"); qmlRegisterType(uri, 1, 1, "WebEngineScript"); - qmlRegisterUncreatableType(uri, 1, 1, "WebEngineCertificateError", msgUncreatableType("WebEngineCertificateError")); + qRegisterMetaType(); + qmlRegisterUncreatableType(uri, 1, 1, "WebEngineCertificateError", msgUncreatableType("WebEngineCertificateError")); qmlRegisterUncreatableType(uri, 1, 1, "WebEngineDownloadItem", msgUncreatableType("WebEngineDownloadItem")); qmlRegisterUncreatableType(uri, 1, 2, "WebEngineDownloadItem", diff --git a/src/webengine/plugin/plugins.qmltypes b/src/webengine/plugin/plugins.qmltypes index 24b073290..8f0a848d5 100644 --- a/src/webengine/plugin/plugins.qmltypes +++ b/src/webengine/plugin/plugins.qmltypes @@ -320,8 +320,7 @@ Module { Method { name: "dialogReject" } } Component { - name: "QQuickWebEngineCertificateError" - prototype: "QObject" + name: "QWebEngineCertificateError" exports: ["QtWebEngine/WebEngineCertificateError 1.1"] isCreatable: false exportMetaObjectRevisions: [0] @@ -1371,7 +1370,7 @@ Module { Signal { name: "certificateError" revision: 1 - Parameter { name: "error"; type: "QQuickWebEngineCertificateError"; isPointer: true } + Parameter { name: "error"; type: "QWebEngineCertificateError" } } Signal { name: "fullScreenRequested" diff --git a/src/webenginewidgets/api/qwebenginecertificateerror.cpp b/src/webenginewidgets/api/qwebenginecertificateerror.cpp deleted file mode 100644 index d86019af8..000000000 --- a/src/webenginewidgets/api/qwebenginecertificateerror.cpp +++ /dev/null @@ -1,266 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWebEngine module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qwebenginecertificateerror.h" - -#include "certificate_error_controller.h" - -QT_BEGIN_NAMESPACE - -/*! - \class QWebEngineCertificateError - \brief The QWebEngineCertificateError class provides information about a certificate error. - \since 5.4 - \inmodule QtWebEngineWidgets - - Provides information about a certificate error. This class is used as a parameter of - QWebEnginePage::certificateError(). -*/ - -class QWebEngineCertificateErrorPrivate : public QSharedData { -public: - QWebEngineCertificateErrorPrivate(int error, QUrl url, bool overridable, QString errorDescription); - - ~QWebEngineCertificateErrorPrivate() { - if (deferred && !answered) - rejectCertificate(); - } - - void resolveError(bool accept) { - if (answered) - return; - answered = true; - if (overridable) { - if (auto ctl = controller.lock()) - ctl->accept(accept); - } - } - - void ignoreCertificateError() { resolveError(true); } - void rejectCertificate() { resolveError(false); } - - QWebEngineCertificateError::Error error; - QUrl url; - bool overridable; - QString errorDescription; - QList certificateChain; - - bool answered = false, deferred = false; - QWeakPointer controller; - - Q_DISABLE_COPY(QWebEngineCertificateErrorPrivate) -}; - -QWebEngineCertificateErrorPrivate::QWebEngineCertificateErrorPrivate(int error, QUrl url, bool overridable, QString errorDescription) - : error(QWebEngineCertificateError::Error(error)) - , url(url) - , overridable(overridable) - , errorDescription(errorDescription) -{ } - -/*! \internal -*/ -QWebEngineCertificateError::QWebEngineCertificateError(int error, QUrl url, bool overridable, QString errorDescription) - : d(new QWebEngineCertificateErrorPrivate(error, url, overridable, errorDescription)) -{ } - -/*! \internal -*/ -QWebEngineCertificateError::QWebEngineCertificateError(const QSharedPointer &controller) - : d(new QWebEngineCertificateErrorPrivate(controller->error(), controller->url(), - controller->overridable(), controller->errorString())) -{ - d->controller = controller; - d->certificateChain = controller->certificateChain(); -} - -QWebEngineCertificateError::QWebEngineCertificateError(const QWebEngineCertificateError &) = default; - -QWebEngineCertificateError& QWebEngineCertificateError::operator=(const QWebEngineCertificateError &) = default; - -/*! \internal -*/ -QWebEngineCertificateError::~QWebEngineCertificateError() -{ - -} - -/*! - \enum QWebEngineCertificateError::Error - - This enum describes the type of certificate error encountered. - - The values of this enum type match the SSL errors Chromium provides. - QSslError::SslError values are not used directly, because the Qt error - categories cannot be mapped to the Chromium error categories. - - \value SslPinnedKeyNotInCertificateChain The certificate did not match the built-in public keys - pinned for the host name. - \value CertificateCommonNameInvalid The certificate's common name did not match the host name. - \value CertificateDateInvalid The certificate is not valid at the current date and time. - \value CertificateAuthorityInvalid The certificate is not signed by a trusted authority. - \value CertificateContainsErrors The certificate contains errors. - \value CertificateNoRevocationMechanism The certificate has no mechanism for determining if it has been revoked. - \value CertificateUnableToCheckRevocation Revocation information for the certificate is not available. - \value CertificateRevoked The certificate has been revoked. - \value CertificateInvalid The certificate is invalid. - \value CertificateWeakSignatureAlgorithm The certificate is signed using a weak signature algorithm. - \value CertificateNonUniqueName The host name specified in the certificate is not unique. - \value CertificateWeakKey The certificate contains a weak key. - \value CertificateNameConstraintViolation The certificate claimed DNS names that are in violation of name constraints. - \value CertificateValidityTooLong The certificate has a validity period that is too long. (Added in Qt 5.7) - \value CertificateTransparencyRequired Certificate Transparency was required for this connection, but the server - did not provide CT information that complied with the policy. (Added in Qt 5.8) - \value CertificateKnownInterceptionBlocked The certificate is known to be - used for interception by an entity other the device owner. (Added in - 5.15) -*/ - -/*! - Returns whether this error can be overridden and accepted. - - \sa error(), errorDescription() -*/ -bool QWebEngineCertificateError::isOverridable() const -{ - return d->overridable; -} - -/*! - Returns the URL that triggered the error. - - \sa error(), errorDescription() -*/ -QUrl QWebEngineCertificateError::url() const -{ - return d->url; -} - -/*! - Returns the type of the error. - - \sa errorDescription(), isOverridable() -*/ -QWebEngineCertificateError::Error QWebEngineCertificateError::error() const -{ - return d->error; -} - -/*! - Returns a short localized human-readable description of the error. - - \sa error(), url(), isOverridable() -*/ -QString QWebEngineCertificateError::errorDescription() const -{ - return d->errorDescription; -} - -/*! - \since 5.14 - - Marks the certificate error for delayed handling. - - This function should be called when there is a need to postpone the decision whether to ignore a - certificate error, for example, while waiting for user input. When called, the function pauses the - URL request until ignoreCertificateError() or rejectCertificate() is called. - - \note It is only possible to defer overridable certificate errors. - - \sa isOverridable(), deferred() -*/ -void QWebEngineCertificateError::defer() -{ - if (isOverridable()) - d->deferred = true; -} - -/*! - \since 5.14 - - Returns whether the decision for error handling was delayed and the URL load was halted. -*/ -bool QWebEngineCertificateError::deferred() const -{ - return d->deferred; -} - -/*! - \since 5.14 - - Ignores the certificate error and continues the loading of the requested URL. -*/ -void QWebEngineCertificateError::ignoreCertificateError() -{ - d->ignoreCertificateError(); -} - -/*! - \since 5.14 - - Rejects the certificate and aborts the loading of the requested URL. -*/ -void QWebEngineCertificateError::rejectCertificate() -{ - d->rejectCertificate(); -} - -/*! - \since 5.14 - - Returns \c true if the error was explicitly rejected or ignored. -*/ -bool QWebEngineCertificateError::answered() const -{ - return d->answered; -} - -/*! - \since 5.14 - - Returns the peer's chain of digital certificates. - - Chain starts with the peer's immediate certificate and ending with the CA's certificate. -*/ -QList QWebEngineCertificateError::certificateChain() const -{ - return d->certificateChain; -} - -QT_END_NAMESPACE diff --git a/src/webenginewidgets/api/qwebenginecertificateerror.h b/src/webenginewidgets/api/qwebenginecertificateerror.h deleted file mode 100644 index a32f7ab8e..000000000 --- a/src/webenginewidgets/api/qwebenginecertificateerror.h +++ /dev/null @@ -1,104 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWebEngine module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QWEBENGINECERTIFICATEERROR_H -#define QWEBENGINECERTIFICATEERROR_H - -#include - -#include -#include -#include - -QT_BEGIN_NAMESPACE - -class CertificateErrorController; -class QWebEngineCertificateErrorPrivate; - -class QWEBENGINEWIDGETS_EXPORT QWebEngineCertificateError { -public: - QWebEngineCertificateError(int error, QUrl url, bool overridable, QString errorDescription); - ~QWebEngineCertificateError(); - - // Keep this identical to CertificateErrorController::CertificateError, or add mapping layer. - enum Error { - SslPinnedKeyNotInCertificateChain = -150, - CertificateCommonNameInvalid = -200, - CertificateDateInvalid = -201, - CertificateAuthorityInvalid = -202, - CertificateContainsErrors = -203, - CertificateNoRevocationMechanism = -204, - CertificateUnableToCheckRevocation = -205, - CertificateRevoked = -206, - CertificateInvalid = -207, - CertificateWeakSignatureAlgorithm = -208, - CertificateNonUniqueName = -210, - CertificateWeakKey = -211, - CertificateNameConstraintViolation = -212, - CertificateValidityTooLong = -213, - CertificateTransparencyRequired = -214, - CertificateKnownInterceptionBlocked = -217, - }; - - Error error() const; - QUrl url() const; - bool isOverridable() const; - QString errorDescription() const; - - QWebEngineCertificateError(const QWebEngineCertificateError &other); - QWebEngineCertificateError& operator=(const QWebEngineCertificateError &other); - - void defer(); - bool deferred() const; - - void rejectCertificate(); - void ignoreCertificateError(); - bool answered() const; - - QList certificateChain() const; - -private: - friend class QWebEnginePagePrivate; - QWebEngineCertificateError(const QSharedPointer &controller); - QExplicitlySharedDataPointer d; -}; - -QT_END_NAMESPACE - -#endif // QWEBENGINECERTIFICATEERROR_H diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 3c8f6e488..3919366dc 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -278,7 +278,8 @@ void QWebEnginePagePrivate::loadStarted(const QUrl &provisionalUrl, bool isError return; isLoading = true; - m_certificateErrorControllers.clear(); + CertificateErrorController::clear(m_certificateErrorControllers); + QTimer::singleShot(0, q, &QWebEnginePage::loadStarted); } diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h index 50df343fd..4354fd2e2 100644 --- a/src/webenginewidgets/api/qwebenginepage_p.h +++ b/src/webenginewidgets/api/qwebenginepage_p.h @@ -204,7 +204,7 @@ public: QPrinter *currentPrinter; #endif - QList> m_certificateErrorControllers; + QList> m_certificateErrorControllers; }; QT_END_NAMESPACE diff --git a/src/webenginewidgets/webenginewidgets.pro b/src/webenginewidgets/webenginewidgets.pro index 401bd4f0e..088b152a8 100644 --- a/src/webenginewidgets/webenginewidgets.pro +++ b/src/webenginewidgets/webenginewidgets.pro @@ -13,7 +13,6 @@ INCLUDEPATH += $$PWD api ../core ../core/api ../webengine/api SOURCES = \ api/qtwebenginewidgetsglobal.cpp \ - api/qwebenginecertificateerror.cpp \ api/qwebengineclientcertificateselection.cpp \ api/qwebenginedownloaditem.cpp \ api/qwebenginefullscreenrequest.cpp \ @@ -29,7 +28,6 @@ SOURCES = \ HEADERS = \ api/qtwebenginewidgetsglobal.h \ - api/qwebenginecertificateerror.h \ api/qwebengineclientcertificateselection.h \ api/qwebenginedownloaditem.h \ api/qwebenginedownloaditem_p.h \ diff --git a/tests/auto/quick/certificateerror/testhandler.cpp b/tests/auto/quick/certificateerror/testhandler.cpp index 6fb55f44a..cb6710aa3 100644 --- a/tests/auto/quick/certificateerror/testhandler.cpp +++ b/tests/auto/quick/certificateerror/testhandler.cpp @@ -46,16 +46,18 @@ void TestHandler::setLoadSuccess(bool success) } } -QQuickWebEngineCertificateError *TestHandler::certificateError() const +bool TestHandler::loadSuccess() const { - return m_error; + return m_loadSuccess; } -void TestHandler::setCertificateError(QQuickWebEngineCertificateError *error) +QWebEngineCertificateError TestHandler::certificateError() const { - if (m_error == error) - return; - m_error = error; + return *m_error; +} +void TestHandler::setCertificateError(QWebEngineCertificateError error) +{ + m_error = new QWebEngineCertificateError(error); emit certificateErrorChanged(); } diff --git a/tests/auto/quick/certificateerror/testhandler.h b/tests/auto/quick/certificateerror/testhandler.h index d954ed5fc..a6d95d9a9 100644 --- a/tests/auto/quick/certificateerror/testhandler.h +++ b/tests/auto/quick/certificateerror/testhandler.h @@ -29,19 +29,19 @@ #ifndef TESTHANDLER_H #define TESTHANDLER_H -#include +#include class TestHandler : public QObject { Q_OBJECT - Q_PROPERTY(QQuickWebEngineCertificateError *certificateError READ certificateError WRITE + Q_PROPERTY(QWebEngineCertificateError certificateError READ certificateError WRITE setCertificateError NOTIFY certificateErrorChanged) Q_PROPERTY(bool loadSuccess READ loadSuccess WRITE setLoadSuccess NOTIFY loadSuccessChanged) public: explicit TestHandler(QObject *parent = nullptr); - QQuickWebEngineCertificateError *certificateError() const; + QWebEngineCertificateError certificateError() const; - void setCertificateError(QQuickWebEngineCertificateError *error); + void setCertificateError(QWebEngineCertificateError error); void setLoadSuccess(bool success); bool loadSuccess() const; void load(const QUrl &page); @@ -49,9 +49,10 @@ public: signals: void loadPage(const QUrl &page); void certificateErrorChanged(); + void loadSuccessChanged(); private: - QQuickWebEngineCertificateError *m_error = nullptr; + QWebEngineCertificateError *m_error = nullptr; bool m_loadSuccess = false; }; diff --git a/tests/auto/quick/certificateerror/tst_certificateerror.cpp b/tests/auto/quick/certificateerror/tst_certificateerror.cpp index 6201800bd..6652fd511 100644 --- a/tests/auto/quick/certificateerror/tst_certificateerror.cpp +++ b/tests/auto/quick/certificateerror/tst_certificateerror.cpp @@ -28,7 +28,7 @@ #include "testhandler.h" #include #include -#include +#include #include #include #include @@ -91,20 +91,37 @@ void tst_CertificateError::handleError() QSignalSpy certificateErrorSpy(m_handler, &TestHandler::certificateErrorChanged); m_handler->load(server.url()); QTRY_COMPARE(certificateErrorSpy.count(), 1); - QQuickWebEngineCertificateError *error = m_handler->certificateError(); - QVERIFY(error); + QWebEngineCertificateError error = m_handler->certificateError(); if (deferError) { - error->defer(); + error.defer(); return; } if (acceptCertificate) - error->ignoreCertificateError(); + error.ignoreCertificateError(); else - error->rejectCertificate(); + error.rejectCertificate(); - QVERIFY(error->overridable()); + QVERIFY(error.isOverridable()); + auto chain = error.certificateChain(); + QCOMPARE(chain.size(), 2); + QCOMPARE(chain[0].serialNumber(), "3b:dd:1a:b7:2f:40:32:3b:c1:bf:37:d4:86:bd:56:c1:d0:6b:2a:43"); + QCOMPARE(chain[1].serialNumber(), "6d:52:fb:b4:57:3b:b2:03:c8:62:7b:7e:44:45:5c:d3:08:87:74:17"); + + if (deferError) { + QVERIFY(error.deferred()); + QVERIFY(!error.answered()); + QVERIFY(!m_handler->loadSuccess()); + + if (acceptCertificate) + error.ignoreCertificateError(); + else + error.rejectCertificate(); + + QVERIFY(error.answered()); + } + QTRY_COMPARE_WITH_TIMEOUT(m_handler->loadSuccess(), acceptCertificate, 3000); } static QByteArrayList params; diff --git a/tests/auto/quick/publicapi/tst_publicapi.cpp b/tests/auto/quick/publicapi/tst_publicapi.cpp index 936d1e948..47ba7b2de 100644 --- a/tests/auto/quick/publicapi/tst_publicapi.cpp +++ b/tests/auto/quick/publicapi/tst_publicapi.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -42,7 +43,6 @@ #include #include #include -#include #include #include #include @@ -62,7 +62,6 @@ private Q_SLOTS: static const QList typesToCheck = QList() << &QQuickWebEngineView::staticMetaObject << &QQuickWebEngineAction::staticMetaObject - << &QQuickWebEngineCertificateError::staticMetaObject << &QQuickWebEngineClientCertificateOption::staticMetaObject << &QQuickWebEngineClientCertificateSelection::staticMetaObject << &QQuickWebEngineDownloadItem::staticMetaObject @@ -83,6 +82,7 @@ static const QList typesToCheck = QList QString" << "QQuickWebEngineAuthenticationDialogRequest.type --> AuthenticationType" << "QQuickWebEngineAuthenticationDialogRequest.url --> QUrl" - << "QQuickWebEngineCertificateError.CertificateAuthorityInvalid --> Error" - << "QQuickWebEngineCertificateError.CertificateCommonNameInvalid --> Error" - << "QQuickWebEngineCertificateError.CertificateContainsErrors --> Error" - << "QQuickWebEngineCertificateError.CertificateDateInvalid --> Error" - << "QQuickWebEngineCertificateError.CertificateInvalid --> Error" - << "QQuickWebEngineCertificateError.CertificateKnownInterceptionBlocked --> Error" - << "QQuickWebEngineCertificateError.CertificateNameConstraintViolation --> Error" - << "QQuickWebEngineCertificateError.CertificateNoRevocationMechanism --> Error" - << "QQuickWebEngineCertificateError.CertificateNonUniqueName --> Error" - << "QQuickWebEngineCertificateError.CertificateRevoked --> Error" - << "QQuickWebEngineCertificateError.CertificateTransparencyRequired --> Error" - << "QQuickWebEngineCertificateError.CertificateUnableToCheckRevocation --> Error" - << "QQuickWebEngineCertificateError.CertificateValidityTooLong --> Error" - << "QQuickWebEngineCertificateError.CertificateWeakKey --> Error" - << "QQuickWebEngineCertificateError.CertificateWeakSignatureAlgorithm --> Error" - << "QQuickWebEngineCertificateError.SslPinnedKeyNotInCertificateChain --> Error" - << "QQuickWebEngineCertificateError.defer() --> void" - << "QQuickWebEngineCertificateError.description --> QString" - << "QQuickWebEngineCertificateError.error --> Error" - << "QQuickWebEngineCertificateError.ignoreCertificateError() --> void" - << "QQuickWebEngineCertificateError.overridable --> bool" - << "QQuickWebEngineCertificateError.rejectCertificate() --> void" - << "QQuickWebEngineCertificateError.url --> QUrl" + << "QWebEngineCertificateError.CertificateAuthorityInvalid --> Error" + << "QWebEngineCertificateError.CertificateCommonNameInvalid --> Error" + << "QWebEngineCertificateError.CertificateContainsErrors --> Error" + << "QWebEngineCertificateError.CertificateDateInvalid --> Error" + << "QWebEngineCertificateError.CertificateInvalid --> Error" + << "QWebEngineCertificateError.CertificateKnownInterceptionBlocked --> Error" + << "QWebEngineCertificateError.CertificateNameConstraintViolation --> Error" + << "QWebEngineCertificateError.CertificateNoRevocationMechanism --> Error" + << "QWebEngineCertificateError.CertificateNonUniqueName --> Error" + << "QWebEngineCertificateError.CertificateRevoked --> Error" + << "QWebEngineCertificateError.CertificateTransparencyRequired --> Error" + << "QWebEngineCertificateError.CertificateUnableToCheckRevocation --> Error" + << "QWebEngineCertificateError.CertificateValidityTooLong --> Error" + << "QWebEngineCertificateError.CertificateWeakKey --> Error" + << "QWebEngineCertificateError.CertificateWeakSignatureAlgorithm --> Error" + << "QWebEngineCertificateError.SslPinnedKeyNotInCertificateChain --> Error" + << "QWebEngineCertificateError.answered --> bool" + << "QWebEngineCertificateError.deferred --> bool" + << "QWebEngineCertificateError.defer() --> void" + << "QWebEngineCertificateError.description --> QString" + << "QWebEngineCertificateError.error --> Error" + << "QWebEngineCertificateError.ignoreCertificateError() --> void" + << "QWebEngineCertificateError.overridable --> bool" + << "QWebEngineCertificateError.rejectCertificate() --> void" + << "QWebEngineCertificateError.url --> QUrl" << "QQuickWebEngineClientCertificateOption.issuer --> QString" << "QQuickWebEngineClientCertificateOption.subject --> QString" << "QQuickWebEngineClientCertificateOption.effectiveDate --> QDateTime" @@ -687,7 +689,7 @@ static const QStringList expectedAPI = QStringList() << "QQuickWebEngineView.backgroundColorChanged() --> void" << "QQuickWebEngineView.canGoBack --> bool" << "QQuickWebEngineView.canGoForward --> bool" - << "QQuickWebEngineView.certificateError(QQuickWebEngineCertificateError*) --> void" + << "QQuickWebEngineView.certificateError(QWebEngineCertificateError) --> void" << "QQuickWebEngineView.colorDialogRequested(QQuickWebEngineColorDialogRequest*) --> void" << "QQuickWebEngineView.contentsSize --> QSizeF" << "QQuickWebEngineView.contentsSizeChanged(QSizeF) --> void" -- cgit v1.2.3