summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJüri Valdmann <juri.valdmann@qt.io>2020-04-28 14:45:18 +0200
committerMichal Klocek <michal.klocek@qt.io>2020-08-14 16:34:37 +0200
commita2a9ea11f95b4a5347f599d8a28151166ad00a71 (patch)
tree609329b16e7e3febfe600f10c4ec776aa05e9eb2
parent4c78cf32fc302a29a61d2fb50551333b5f79051c (diff)
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 <allan.jensen@qt.io>
-rw-r--r--src/core/api/core_api.pro2
-rw-r--r--src/core/api/qwebenginecertificateerror.cpp (renamed from src/webenginewidgets/api/qwebenginecertificateerror.cpp)93
-rw-r--r--src/core/api/qwebenginecertificateerror.h (renamed from src/webenginewidgets/api/qwebenginecertificateerror.h)31
-rw-r--r--src/core/certificate_error_controller.cpp66
-rw-r--r--src/core/certificate_error_controller.h42
-rw-r--r--src/core/certificate_error_controller_p.h11
-rw-r--r--src/core/content_browser_client_qt.cpp30
-rw-r--r--src/webengine/api/qquickwebenginecertificateerror.cpp251
-rw-r--r--src/webengine/api/qquickwebenginecertificateerror_p.h115
-rw-r--r--src/webengine/api/qquickwebengineview.cpp18
-rw-r--r--src/webengine/api/qquickwebengineview_p.h4
-rw-r--r--src/webengine/api/qquickwebengineview_p_p.h2
-rw-r--r--src/webengine/doc/src/webengineview_lgpl.qdoc107
-rw-r--r--src/webengine/module.pro2
-rw-r--r--src/webengine/plugin/plugin.cpp5
-rw-r--r--src/webengine/plugin/plugins.qmltypes5
-rw-r--r--src/webenginewidgets/api/qwebenginepage.cpp3
-rw-r--r--src/webenginewidgets/api/qwebenginepage_p.h2
-rw-r--r--src/webenginewidgets/webenginewidgets.pro2
-rw-r--r--tests/auto/quick/certificateerror/testhandler.cpp14
-rw-r--r--tests/auto/quick/certificateerror/testhandler.h11
-rw-r--r--tests/auto/quick/certificateerror/tst_certificateerror.cpp31
-rw-r--r--tests/auto/quick/publicapi/tst_publicapi.cpp54
23 files changed, 311 insertions, 590 deletions
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/webenginewidgets/api/qwebenginecertificateerror.cpp b/src/core/api/qwebenginecertificateerror.cpp
index d86019af8..2e5768a0c 100644
--- a/src/webenginewidgets/api/qwebenginecertificateerror.cpp
+++ b/src/core/api/qwebenginecertificateerror.cpp
@@ -43,71 +43,38 @@
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 QtWebEngineWidgets
+ \inmodule QtWebEngineCore
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<QSslCertificate> certificateChain;
-
- bool answered = false, deferred = false;
- QWeakPointer<CertificateErrorController> 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<CertificateErrorController> &controller)
- : d(new QWebEngineCertificateErrorPrivate(controller->error(), controller->url(),
- controller->overridable(), controller->errorString()))
+ : d(controller)
{
- d->controller = controller;
- d->certificateChain = controller->certificateChain();
}
QWebEngineCertificateError::QWebEngineCertificateError(const QWebEngineCertificateError &) = default;
@@ -116,10 +83,7 @@ QWebEngineCertificateError& QWebEngineCertificateError::operator=(const QWebEngi
/*! \internal
*/
-QWebEngineCertificateError::~QWebEngineCertificateError()
-{
-
-}
+QWebEngineCertificateError::~QWebEngineCertificateError() = default;
/*!
\enum QWebEngineCertificateError::Error
@@ -159,7 +123,7 @@ QWebEngineCertificateError::~QWebEngineCertificateError()
*/
bool QWebEngineCertificateError::isOverridable() const
{
- return d->overridable;
+ return d->overridable();
}
/*!
@@ -169,7 +133,7 @@ bool QWebEngineCertificateError::isOverridable() const
*/
QUrl QWebEngineCertificateError::url() const
{
- return d->url;
+ return d->url();
}
/*!
@@ -179,7 +143,7 @@ QUrl QWebEngineCertificateError::url() const
*/
QWebEngineCertificateError::Error QWebEngineCertificateError::error() const
{
- return d->error;
+ return Error(d->error());
}
/*!
@@ -189,7 +153,7 @@ QWebEngineCertificateError::Error QWebEngineCertificateError::error() const
*/
QString QWebEngineCertificateError::errorDescription() const
{
- return d->errorDescription;
+ return d->errorString();
}
/*!
@@ -207,8 +171,7 @@ QString QWebEngineCertificateError::errorDescription() const
*/
void QWebEngineCertificateError::defer()
{
- if (isOverridable())
- d->deferred = true;
+ d->defer();
}
/*!
@@ -218,7 +181,7 @@ void QWebEngineCertificateError::defer()
*/
bool QWebEngineCertificateError::deferred() const
{
- return d->deferred;
+ return d->deferred();
}
/*!
@@ -248,7 +211,7 @@ void QWebEngineCertificateError::rejectCertificate()
*/
bool QWebEngineCertificateError::answered() const
{
- return d->answered;
+ return d->answered();
}
/*!
@@ -260,7 +223,7 @@ bool QWebEngineCertificateError::answered() const
*/
QList<QSslCertificate> QWebEngineCertificateError::certificateChain() const
{
- return d->certificateChain;
+ return d->certificateChain();
}
QT_END_NAMESPACE
diff --git a/src/webenginewidgets/api/qwebenginecertificateerror.h b/src/core/api/qwebenginecertificateerror.h
index a32f7ab8e..67da69a78 100644
--- a/src/webenginewidgets/api/qwebenginecertificateerror.h
+++ b/src/core/api/qwebenginecertificateerror.h
@@ -40,7 +40,7 @@
#ifndef QWEBENGINECERTIFICATEERROR_H
#define QWEBENGINECERTIFICATEERROR_H
-#include <QtWebEngineWidgets/qtwebenginewidgetsglobal.h>
+#include <QtWebEngineCore/qtwebenginecoreglobal.h>
#include <QtCore/qsharedpointer.h>
#include <QtCore/qurl.h>
@@ -49,11 +49,19 @@
QT_BEGIN_NAMESPACE
class CertificateErrorController;
-class QWebEngineCertificateErrorPrivate;
-class QWEBENGINEWIDGETS_EXPORT QWebEngineCertificateError {
+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(int error, QUrl url, bool overridable, QString errorDescription);
+ QWebEngineCertificateError(const QWebEngineCertificateError &other);
+ QWebEngineCertificateError& operator=(const QWebEngineCertificateError &other);
~QWebEngineCertificateError();
// Keep this identical to CertificateErrorController::CertificateError, or add mapping layer.
@@ -75,30 +83,31 @@ public:
CertificateTransparencyRequired = -214,
CertificateKnownInterceptionBlocked = -217,
};
+ Q_ENUM(Error)
Error error() const;
QUrl url() const;
bool isOverridable() const;
QString errorDescription() const;
- QWebEngineCertificateError(const QWebEngineCertificateError &other);
- QWebEngineCertificateError& operator=(const QWebEngineCertificateError &other);
-
- void defer();
+ Q_INVOKABLE void defer();
bool deferred() const;
- void rejectCertificate();
- void ignoreCertificateError();
+ Q_INVOKABLE void rejectCertificate();
+ Q_INVOKABLE void ignoreCertificateError();
bool answered() const;
QList<QSslCertificate> certificateChain() const;
private:
friend class QWebEnginePagePrivate;
+ friend class QQuickWebEngineViewPrivate;
QWebEngineCertificateError(const QSharedPointer<CertificateErrorController> &controller);
- QExplicitlySharedDataPointer<QWebEngineCertificateErrorPrivate> d;
+ QSharedPointer<CertificateErrorController> 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<void(content::CertificateRequestResultType)> 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 <QtCore/QDateTime>
+#include <QtCore/QScopedPointer>
#include <QtCore/QUrl>
#include <QtNetwork/QSslCertificate>
@@ -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<QSslCertificate> 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 <a ping>
- 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<QWeakPointer<CertificateErrorController>> &controllers) {
+ for (auto &&wc : controllers)
+ if (auto controller = wc.lock())
+ controller->deactivate();
+ controllers.clear();
+ }
private:
- CertificateErrorControllerPrivate* d;
+ QScopedPointer<CertificateErrorControllerPrivate> 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<void(content::CertificateRequestResultType)> callback);
-
- void accept(bool accepted);
+ CertificateErrorControllerPrivate(int cert_error, const net::SSLInfo& ssl_info, const GURL& request_url, bool strict_enforcement, base::OnceCallback<void(content::CertificateRequestResultType)> callback);
CertificateErrorController::CertificateError certError;
const QUrl requestUrl;
- QDateTime validStart;
QDateTime validExpiry;
- CertificateErrorController::ResourceType resourceType;
- bool fatalError;
- bool strictEnforcement;
+ bool overridable;
base::OnceCallback<void(content::CertificateRequestResultType)> callback;
QList<QSslCertificate> 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<void(content::CertificateRequestResultType)> 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 <qquickwebenginecertificateerror_p.h>
-#include "certificate_error_controller.h"
-QT_BEGIN_NAMESPACE
-
-class QQuickWebEngineCertificateErrorPrivate {
-public:
- QQuickWebEngineCertificateErrorPrivate(const QSharedPointer<CertificateErrorController> &controller)
- : weakRefCertErrorController(controller),
- error(static_cast<QQuickWebEngineCertificateError::Error>(static_cast<int>(controller->error()))),
- description(controller->errorString()),
- overridable(controller->overridable()),
- async(false),
- answered(false)
- {
- }
-
- const QWeakPointer<CertificateErrorController> 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<CertificateErrorController> &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<CertificateErrorController> 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<CertificateErrorController> 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<CertificateErrorController> 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 <QObject>
-#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<CertificateErrorController> &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<QQuickWebEngineCertificateErrorPrivate> 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(QSharedPointer<JavaScriptDialo
ui()->showDialog(dialog);
}
-void QQuickWebEngineViewPrivate::allowCertificateError(const QSharedPointer<CertificateErrorController> &errorController)
+void QQuickWebEngineViewPrivate::allowCertificateError(const QSharedPointer<CertificateErrorController> &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<ClientCertSelectController> &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<quint64, QJSValue> m_callbacks;
- QList<QSharedPointer<CertificateErrorController> > m_certificateErrorControllers;
+ QList<QWeakPointer<CertificateErrorController> > m_certificateErrorControllers;
QQmlWebChannel *m_webChannel;
QPointer<QQuickWebEngineView> inspectedView;
QPointer<QQuickWebEngineView> 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 <QtQml/qqmlextensionplugin.h>
#include <QtWebEngine/QQuickWebEngineProfile>
-#include <QtWebEngine/private/qquickwebenginecertificateerror_p.h>
#include <QtWebEngine/private/qquickwebengineclientcertificateselection_p.h>
#include <QtWebEngine/private/qquickwebenginedialogrequests_p.h>
#include <QtWebEngine/private/qquickwebenginedownloaditem_p.h>
@@ -54,6 +53,7 @@
#include <QtWebEngine/private/qquickwebenginetouchhandleprovider_p_p.h>
#include <QtWebEngine/private/qquickwebengineview_p.h>
#include <QtWebEngine/private/qquickwebengineaction_p.h>
+#include <QtWebEngineCore/qwebenginecertificateerror.h>
#include <QtWebEngineCore/qwebenginefindtextresult.h>
#include <QtWebEngineCore/qwebenginenotification.h>
#include <QtWebEngineCore/qwebenginequotarequest.h>
@@ -105,7 +105,8 @@ public:
qmlRegisterType<QQuickWebEngineProfile, 4>(uri, 1, 5, "WebEngineProfile");
qmlRegisterType<QQuickWebEngineProfile, 5>(uri, 1, 9, "WebEngineProfile");
qmlRegisterType<QQuickWebEngineScript>(uri, 1, 1, "WebEngineScript");
- qmlRegisterUncreatableType<QQuickWebEngineCertificateError>(uri, 1, 1, "WebEngineCertificateError", msgUncreatableType("WebEngineCertificateError"));
+ qRegisterMetaType<QWebEngineCertificateError>();
+ qmlRegisterUncreatableType<QWebEngineCertificateError>(uri, 1, 1, "WebEngineCertificateError", msgUncreatableType("WebEngineCertificateError"));
qmlRegisterUncreatableType<QQuickWebEngineDownloadItem>(uri, 1, 1, "WebEngineDownloadItem",
msgUncreatableType("WebEngineDownloadItem"));
qmlRegisterUncreatableType<QQuickWebEngineDownloadItem, 1>(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/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<QSharedPointer<CertificateErrorController>> m_certificateErrorControllers;
+ QList<QWeakPointer<CertificateErrorController>> 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 <QtWebEngine/private/qquickwebenginecertificateerror_p.h>
+#include <QWebEngineCertificateError>
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 <httpsserver.h>
#include <util.h>
-#include <QtWebEngine/private/qquickwebenginecertificateerror_p.h>
+#include <QWebEngineCertificateError>
#include <QQuickWebEngineProfile>
#include <QQmlApplicationEngine>
#include <QQuickWindow>
@@ -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 <QtTest/QtTest>
#include <QtWebEngine/QQuickWebEngineProfile>
#include <QtWebEngine/QQuickWebEngineScript>
+#include <QtWebEngineCore/QWebEngineCertificateError>
#include <QtWebEngineCore/QWebEngineFindTextResult>
#include <QtWebEngineCore/QWebEngineNotification>
#include <QtWebEngineCore/QWebEngineQuotaRequest>
@@ -42,7 +43,6 @@
#include <QtWebEngineCore/QWebEngineContextMenuRequest>
#include <private/qquickwebengineview_p.h>
#include <private/qquickwebengineaction_p.h>
-#include <private/qquickwebenginecertificateerror_p.h>
#include <private/qquickwebengineclientcertificateselection_p.h>
#include <private/qquickwebenginedialogrequests_p.h>
#include <private/qquickwebenginedownloaditem_p.h>
@@ -62,7 +62,6 @@ private Q_SLOTS:
static const QList<const QMetaObject *> typesToCheck = QList<const QMetaObject *>()
<< &QQuickWebEngineView::staticMetaObject
<< &QQuickWebEngineAction::staticMetaObject
- << &QQuickWebEngineCertificateError::staticMetaObject
<< &QQuickWebEngineClientCertificateOption::staticMetaObject
<< &QQuickWebEngineClientCertificateSelection::staticMetaObject
<< &QQuickWebEngineDownloadItem::staticMetaObject
@@ -83,6 +82,7 @@ static const QList<const QMetaObject *> typesToCheck = QList<const QMetaObject *
<< &QQuickWebEngineFormValidationMessageRequest::staticMetaObject
<< &QQuickWebEngineTooltipRequest::staticMetaObject
<< &QWebEngineContextMenuRequest::staticMetaObject
+ << &QWebEngineCertificateError::staticMetaObject
<< &QWebEngineQuotaRequest::staticMetaObject
<< &QWebEngineRegisterProtocolHandlerRequest::staticMetaObject
<< &QWebEngineNotification::staticMetaObject
@@ -121,29 +121,31 @@ static const QStringList expectedAPI = QStringList()
<< "QQuickWebEngineAuthenticationDialogRequest.realm --> 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"