diff options
-rw-r--r-- | examples/webengine/quicknanobrowser/BrowserWindow.qml | 20 | ||||
-rw-r--r-- | src/core/certificate_error_controller.h | 7 | ||||
-rw-r--r-- | src/core/certificate_error_controller_p.h | 6 | ||||
-rw-r--r-- | src/core/content_browser_client_qt.cpp | 2 | ||||
-rw-r--r-- | src/core/web_contents_adapter_client.h | 4 | ||||
-rw-r--r-- | src/core/web_contents_delegate_qt.cpp | 2 | ||||
-rw-r--r-- | src/core/web_contents_delegate_qt.h | 5 | ||||
-rw-r--r-- | src/webengine/api/qquickwebenginecertificateerror.cpp | 173 | ||||
-rw-r--r-- | src/webengine/api/qquickwebenginecertificateerror_p.h | 97 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineview.cpp | 13 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineview_p.h | 2 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineview_p_p.h | 3 | ||||
-rw-r--r-- | src/webengine/plugin/plugin.cpp | 2 | ||||
-rw-r--r-- | src/webengine/webengine.pro | 2 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.cpp | 2 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage_p.h | 2 | ||||
-rw-r--r-- | tests/auto/quick/publicapi/tst_publicapi.cpp | 23 | ||||
-rw-r--r-- | tests/quicktestbrowser/BrowserWindow.qml | 22 |
18 files changed, 371 insertions, 16 deletions
diff --git a/examples/webengine/quicknanobrowser/BrowserWindow.qml b/examples/webengine/quicknanobrowser/BrowserWindow.qml index 8d9980746..0b8772791 100644 --- a/examples/webengine/quicknanobrowser/BrowserWindow.qml +++ b/examples/webengine/quicknanobrowser/BrowserWindow.qml @@ -45,6 +45,7 @@ import QtQuick.Controls.Styles 1.0 import QtQuick.Layouts 1.0 import QtQuick.Window 2.1 import QtQuick.Controls.Private 1.0 +import QtQuick.Dialogs 1.2 ApplicationWindow { id: browserWindow @@ -198,6 +199,14 @@ ApplicationWindow { statusText.text = hoveredUrl } } + + onCertificateError: { + sslDialog.certError = error + sslDialog.text = "Certificate Error: " + error.description + sslDialog.visible = true + error.defer() + } + onNewViewRequested: { if (!request.userInitiated) print("Warning: Blocked a popup window.") @@ -215,7 +224,18 @@ ApplicationWindow { } } } + MessageDialog { + id: sslDialog + property var certError + + standardButtons: StandardButton.Cancel | StandardButton.Ok + visible: false + title: "Do you want to accept this certificate?" + + onAccepted: certError.ignoreCertificateError() + onRejected: certError.rejectCertificate() + } Rectangle { id: statusBubble color: "oldlace" diff --git a/src/core/certificate_error_controller.h b/src/core/certificate_error_controller.h index f1e7c5bd8..6d364fc9f 100644 --- a/src/core/certificate_error_controller.h +++ b/src/core/certificate_error_controller.h @@ -40,12 +40,13 @@ #include "qtwebenginecoreglobal.h" #include <QtCore/QDateTime> -#include <QtCore/QSharedData> #include <QtCore/QUrl> +QT_BEGIN_NAMESPACE + class CertificateErrorControllerPrivate; -class QWEBENGINE_EXPORT CertificateErrorController : public QSharedData { +class QWEBENGINE_EXPORT CertificateErrorController { public: CertificateErrorController(CertificateErrorControllerPrivate *p); ~CertificateErrorController(); @@ -107,4 +108,6 @@ private: CertificateErrorControllerPrivate* d; }; +QT_END_NAMESPACE + #endif // CERTIFICATE_ERROR_CONTROLLER_H diff --git a/src/core/certificate_error_controller_p.h b/src/core/certificate_error_controller_p.h index b5a8bd2ef..308131eb5 100644 --- a/src/core/certificate_error_controller_p.h +++ b/src/core/certificate_error_controller_p.h @@ -41,6 +41,8 @@ #include "certificate_error_controller.h" +QT_BEGIN_NAMESPACE + class CertificateErrorControllerPrivate { public: CertificateErrorControllerPrivate(int cert_error, const net::SSLInfo& ssl_info, const GURL& request_url, content::ResourceType resource_type, bool overridable, bool strict_enforcement, const base::Callback<void(bool)>& callback); @@ -54,7 +56,9 @@ public: CertificateErrorController::ResourceType resourceType; bool overridable; bool strictEnforcement; - const base::Callback<void(bool)>& callback; + const base::Callback<void(bool)> callback; }; +QT_END_NAMESPACE + #endif // CERTIFICATE_ERROR_CONTROLLER_P_H diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp index 6ebaadd87..c83b28c1a 100644 --- a/src/core/content_browser_client_qt.cpp +++ b/src/core/content_browser_client_qt.cpp @@ -387,7 +387,7 @@ void ContentBrowserClientQt::AllowCertificateError(int render_process_id, int re if (content::WebContents *webContents = frameHost->GetRenderViewHost()->GetDelegate()->GetAsWebContents()) contentsDelegate = static_cast<WebContentsDelegateQt*>(webContents->GetDelegate()); - QExplicitlySharedDataPointer<CertificateErrorController> errorController(new CertificateErrorController(new CertificateErrorControllerPrivate(cert_error, ssl_info, request_url, resource_type, overridable, strict_enforcement, callback))); + QSharedPointer<CertificateErrorController> errorController(new CertificateErrorController(new CertificateErrorControllerPrivate(cert_error, ssl_info, request_url, resource_type, overridable, strict_enforcement, callback))); contentsDelegate->allowCertificateError(errorController); } diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h index 8252a73ca..b6d1ef5bb 100644 --- a/src/core/web_contents_adapter_client.h +++ b/src/core/web_contents_adapter_client.h @@ -47,9 +47,9 @@ #include <QUrl> QT_FORWARD_DECLARE_CLASS(QVariant) +QT_FORWARD_DECLARE_CLASS(CertificateErrorController) class BrowserContextAdapter; -class CertificateErrorController; class JavaScriptDialogController; class RenderWidgetHostViewQt; class RenderWidgetHostViewQtDelegate; @@ -179,7 +179,7 @@ public: virtual void runMouseLockPermissionRequest(const QUrl &securityOrigin) = 0; virtual WebEngineSettings *webEngineSettings() const = 0; - virtual void allowCertificateError(const QExplicitlySharedDataPointer<CertificateErrorController> &errorController) = 0; + virtual void allowCertificateError(const QSharedPointer<CertificateErrorController> &errorController) = 0; virtual BrowserContextAdapter* browserContextAdapter() = 0; diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp index 94c6a9a15..41bcfe609 100644 --- a/src/core/web_contents_delegate_qt.cpp +++ b/src/core/web_contents_delegate_qt.cpp @@ -307,7 +307,7 @@ WebContentsAdapter *WebContentsDelegateQt::createWindow(content::WebContents *ne return newAdapter; } -void WebContentsDelegateQt::allowCertificateError(const QExplicitlySharedDataPointer<CertificateErrorController> &errorController) +void WebContentsDelegateQt::allowCertificateError(const QSharedPointer<CertificateErrorController> &errorController) { m_viewClient->allowCertificateError(errorController); } diff --git a/src/core/web_contents_delegate_qt.h b/src/core/web_contents_delegate_qt.h index c57a2fc67..324a191fb 100644 --- a/src/core/web_contents_delegate_qt.h +++ b/src/core/web_contents_delegate_qt.h @@ -45,6 +45,8 @@ #include "javascript_dialog_manager_qt.h" #include <QtCore/qcompilerdetection.h> +QT_FORWARD_DECLARE_CLASS(CertificateErrorController) + namespace content { class BrowserContext; class SiteInstance; @@ -55,7 +57,6 @@ namespace content { } class WebContentsAdapterClient; -class CertificateErrorController; class WebContentsDelegateQt : public content::WebContentsDelegate , public content::WebContentsObserver @@ -90,7 +91,7 @@ public: virtual void RequestToLockMouse(content::WebContents *web_contents, bool user_gesture, bool last_unlocked_by_target) Q_DECL_OVERRIDE; void overrideWebPreferences(content::WebContents *, content::WebPreferences*); - void allowCertificateError(const QExplicitlySharedDataPointer<CertificateErrorController> &) ; + void allowCertificateError(const QSharedPointer<CertificateErrorController> &) ; void requestGeolocationPermission(const GURL &requestingFrameOrigin, base::Callback<void (bool)> resultCallback); void geolocationPermissionReply(const QUrl&, bool permission); diff --git a/src/webengine/api/qquickwebenginecertificateerror.cpp b/src/webengine/api/qquickwebenginecertificateerror.cpp new file mode 100644 index 000000000..37b92727a --- /dev/null +++ b/src/webengine/api/qquickwebenginecertificateerror.cpp @@ -0,0 +1,173 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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.LGPLv3 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.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 later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.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) + { + } + + const QWeakPointer<CertificateErrorController> weakRefCertErrorController; + QQuickWebEngineCertificateError::Error error; + QString description; + bool overridable; + bool async; +}; + + + +/*! + \qmltype WebEngineCertificateError + \instantiates QQuickWebEngineCertificateError + \inqmlmodule QtWebEngine 1.1 + \since QtWebEngine 1.1 + + \brief A utility class for accepting or denying certificate exceptions when a certificate error occurs. + + This class contains information about a certificate error that happened and provides a way to accept or + deny a certificate exception. + + \sa WebEngineView::certificateError +*/ +QQuickWebEngineCertificateError::QQuickWebEngineCertificateError(const QSharedPointer<CertificateErrorController> &controller, QObject *parent) + : QObject(parent) + , d_ptr(new QQuickWebEngineCertificateErrorPrivate(controller)) +{ +} + +QQuickWebEngineCertificateError::~QQuickWebEngineCertificateError() +{ + rejectCertificate(); +} + + +/*! + \qmlmethod void WebEngineCertificateError::defer() + + This function should be called when there is a need to postpone the decision to ignore or not the certificate error. This is useful to + wait for user input. When called it will pause 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 WebEngineView continues to load the requested url. + */ +void QQuickWebEngineCertificateError::ignoreCertificateError() +{ + Q_D(const QQuickWebEngineCertificateError); + + QSharedPointer<CertificateErrorController> strongRefCert = d->weakRefCertErrorController.toStrongRef(); + if (strongRefCert) + strongRefCert->accept(true); +} + +/*! + \qmlmethod void WebEngineCertificateError::rejectCertificate() + + The WebEngineView stops loading the requested url. + */ +void QQuickWebEngineCertificateError::rejectCertificate() +{ + Q_D(const QQuickWebEngineCertificateError); + + QSharedPointer<CertificateErrorController> strongRefCert = d->weakRefCertErrorController.toStrongRef(); + if (strongRefCert) + strongRefCert->accept(false); +} + +/*! + \qmlproperty url WebEngineCertificateError::url + \brief The URL of the certificate 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 +*/ +QQuickWebEngineCertificateError::Error QQuickWebEngineCertificateError::error() const +{ + Q_D(const QQuickWebEngineCertificateError); + return d->error; +} + +/*! + \qmlproperty string WebEngineCertificateError::description +*/ +QString QQuickWebEngineCertificateError::description() const +{ + Q_D(const QQuickWebEngineCertificateError); + return d->description; +} + +/*! + \qmlproperty bool WebEngineCertificateError::overridable +*/ +bool QQuickWebEngineCertificateError::overridable() const +{ + Q_D(const QQuickWebEngineCertificateError); + return d->overridable; +} + +bool QQuickWebEngineCertificateError::deferred() const +{ + Q_D(const QQuickWebEngineCertificateError); + return d->async; +} + +QT_END_NAMESPACE + diff --git a/src/webengine/api/qquickwebenginecertificateerror_p.h b/src/webengine/api/qquickwebenginecertificateerror_p.h new file mode 100644 index 000000000..735cc8705 --- /dev/null +++ b/src/webengine/api/qquickwebenginecertificateerror_p.h @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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.LGPLv3 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.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 later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKWEBENGINECERTIFICATEERROR_P_H +#define QQUICKWEBENGINECERTIFICATEERROR_P_H + +#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) + Q_PROPERTY(Error error READ error) + Q_PROPERTY(QString description READ description) + Q_PROPERTY(bool overridable READ overridable) + Q_ENUMS(Error) + +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, + }; + + 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; + +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 dbafd9655..460caa4d7 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -41,6 +41,7 @@ #include "certificate_error_controller.h" #include "javascript_dialog_controller.h" #include "qquickwebenginehistory_p.h" +#include "qquickwebenginecertificateerror_p.h" #include "qquickwebengineloadrequest_p.h" #include "qquickwebenginenavigationrequest_p.h" #include "qquickwebenginenewviewrequest_p.h" @@ -220,10 +221,16 @@ void QQuickWebEngineViewPrivate::javascriptDialog(QSharedPointer<JavaScriptDialo ui()->showDialog(dialog); } -void QQuickWebEngineViewPrivate::allowCertificateError(const QExplicitlySharedDataPointer<CertificateErrorController> &errorController) +void QQuickWebEngineViewPrivate::allowCertificateError(const QSharedPointer<CertificateErrorController> &errorController) { - // ### Implement a way to export this to QML - Q_UNUSED(errorController); + Q_Q(QQuickWebEngineView); + + m_certificateErrorController = errorController; + QQuickWebEngineCertificateError *quickController = new QQuickWebEngineCertificateError(errorController); + QQmlEngine::setObjectOwnership(quickController, QQmlEngine::JavaScriptOwnership); + Q_EMIT q->certificateError(quickController); + if (!quickController->deferred()) + quickController->rejectCertificate(); } void QQuickWebEngineViewPrivate::runGeolocationPermissionRequest(const QUrl &url) diff --git a/src/webengine/api/qquickwebengineview_p.h b/src/webengine/api/qquickwebengineview_p.h index 72620b0f7..983cc90a6 100644 --- a/src/webengine/api/qquickwebengineview_p.h +++ b/src/webengine/api/qquickwebengineview_p.h @@ -42,6 +42,7 @@ QT_BEGIN_NAMESPACE +class QQuickWebEngineCertificateError; class QQuickWebEngineLoadRequest; class QQuickWebEngineNavigationRequest; class QQuickWebEngineNewViewRequest; @@ -157,6 +158,7 @@ Q_SIGNALS: void navigationRequested(QQuickWebEngineNavigationRequest *request); void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString &message, int lineNumber, const QString &sourceID); void zoomFactorChanged(qreal arg); + void certificateError(QQuickWebEngineCertificateError *error); Q_REVISION(1) void newViewRequested(QQuickWebEngineNewViewRequest *request); protected: diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h index cdd6b1955..1c1334ee6 100644 --- a/src/webengine/api/qquickwebengineview_p_p.h +++ b/src/webengine/api/qquickwebengineview_p_p.h @@ -176,7 +176,7 @@ public: virtual QObject *accessibilityParentObject() Q_DECL_OVERRIDE; #endif // QT_NO_ACCESSIBILITY virtual WebEngineSettings *webEngineSettings() const Q_DECL_OVERRIDE; - virtual void allowCertificateError(const QExplicitlySharedDataPointer<CertificateErrorController> &errorController); + virtual void allowCertificateError(const QSharedPointer<CertificateErrorController> &errorController); virtual void runGeolocationPermissionRequest(QUrl const&) Q_DECL_OVERRIDE; virtual BrowserContextAdapter *browserContextAdapter() Q_DECL_OVERRIDE; @@ -200,6 +200,7 @@ public: bool isLoading; qreal devicePixelRatio; QMap<quint64, QJSValue> m_callbacks; + QSharedPointer<CertificateErrorController> m_certificateErrorController; private: QScopedPointer<UIDelegatesManager> m_uIDelegatesManager; diff --git a/src/webengine/plugin/plugin.cpp b/src/webengine/plugin/plugin.cpp index 465e626f7..163bb3567 100644 --- a/src/webengine/plugin/plugin.cpp +++ b/src/webengine/plugin/plugin.cpp @@ -36,6 +36,7 @@ #include <QtQml/qqmlextensionplugin.h> +#include "qquickwebenginecertificateerror_p.h" #include "qquickwebengineloadrequest_p.h" #include "qquickwebenginenavigationrequest_p.h" #include "qquickwebenginenewviewrequest_p.h" @@ -59,6 +60,7 @@ public: Q_ASSERT(QLatin1String(uri) == QLatin1String("QtWebEngine")); qmlRegisterType<QQuickWebEngineView>(uri, 1, 0, "WebEngineView"); + qmlRegisterUncreatableType<QQuickWebEngineCertificateError>(uri, 1, 1, "WebEngineCertificateError", QObject::tr("Cannot create separate instance of WebEngineCertificateError")); qmlRegisterUncreatableType<QQuickWebEngineLoadRequest>(uri, 1, 0, "WebEngineLoadRequest", QObject::tr("Cannot create separate instance of WebEngineLoadRequest")); qmlRegisterUncreatableType<QQuickWebEngineNavigationRequest>(uri, 1, 0, "WebEngineNavigationRequest", QObject::tr("Cannot create separate instance of WebEngineNavigationRequest")); diff --git a/src/webengine/webengine.pro b/src/webengine/webengine.pro index 15514e457..275867202 100644 --- a/src/webengine/webengine.pro +++ b/src/webengine/webengine.pro @@ -11,6 +11,7 @@ QMAKE_DOCS = $$PWD/doc/qtwebengine.qdocconf INCLUDEPATH += $$PWD api ../core SOURCES = \ + api/qquickwebenginecertificateerror.cpp \ api/qquickwebenginedownloaditem.cpp \ api/qquickwebenginehistory.cpp \ api/qquickwebengineloadrequest.cpp \ @@ -28,6 +29,7 @@ SOURCES = \ HEADERS = \ api/qtwebengineglobal.h \ api/qtwebengineglobal_p.h \ + api/qquickwebenginecertificateerror_p.h \ api/qquickwebenginedownloaditem_p.h \ api/qquickwebenginedownloaditem_p_p.h \ api/qquickwebenginehistory_p.h \ diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 5f1c06d0b..32c467c08 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -711,7 +711,7 @@ void QWebEnginePagePrivate::javascriptDialog(QSharedPointer<JavaScriptDialogCont controller->reject(); } -void QWebEnginePagePrivate::allowCertificateError(const QExplicitlySharedDataPointer<CertificateErrorController> &controller) +void QWebEnginePagePrivate::allowCertificateError(const QSharedPointer<CertificateErrorController> &controller) { Q_Q(QWebEnginePage); bool accepted = false; diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h index 1f44b6124..93b94bfa5 100644 --- a/src/webenginewidgets/api/qwebenginepage_p.h +++ b/src/webenginewidgets/api/qwebenginepage_p.h @@ -142,7 +142,7 @@ public: virtual QObject *accessibilityParentObject() Q_DECL_OVERRIDE; #endif // QT_NO_ACCESSIBILITY virtual WebEngineSettings *webEngineSettings() const Q_DECL_OVERRIDE; - virtual void allowCertificateError(const QExplicitlySharedDataPointer<CertificateErrorController> &controller) Q_DECL_OVERRIDE; + virtual void allowCertificateError(const QSharedPointer<CertificateErrorController> &controller) Q_DECL_OVERRIDE; virtual BrowserContextAdapter *browserContextAdapter() Q_DECL_OVERRIDE; diff --git a/tests/auto/quick/publicapi/tst_publicapi.cpp b/tests/auto/quick/publicapi/tst_publicapi.cpp index e5989f167..269bbf0b5 100644 --- a/tests/auto/quick/publicapi/tst_publicapi.cpp +++ b/tests/auto/quick/publicapi/tst_publicapi.cpp @@ -46,6 +46,7 @@ #include <QMetaType> #include <QtTest/QtTest> #include <private/qquickwebengineview_p.h> +#include <private/qquickwebenginecertificateerror_p.h> #include <private/qquickwebenginedownloaditem_p.h> #include <private/qquickwebengineloadrequest_p.h> #include <private/qquickwebenginenavigationrequest_p.h> @@ -60,6 +61,7 @@ private Q_SLOTS: static QList<const QMetaObject *> typesToCheck = QList<const QMetaObject *>() << &QQuickWebEngineView::staticMetaObject + << &QQuickWebEngineCertificateError::staticMetaObject << &QQuickWebEngineDownloadItem::staticMetaObject << &QQuickWebEngineLoadRequest::staticMetaObject << &QQuickWebEngineNavigationRequest::staticMetaObject @@ -80,6 +82,19 @@ static QStringList expectedAPI = QStringList() << "QQuickWebEngineView.LoadStoppedStatus --> LoadStatus" << "QQuickWebEngineView.LoadSucceededStatus --> LoadStatus" << "QQuickWebEngineView.LoadFailedStatus --> LoadStatus" + << "QQuickWebEngineCertificateError.SslPinnedKeyNotInCertificateChain --> Error" + << "QQuickWebEngineCertificateError.CertificateCommonNameInvalid --> Error" + << "QQuickWebEngineCertificateError.CertificateDateInvalid --> Error" + << "QQuickWebEngineCertificateError.CertificateAuthorityInvalid --> Error" + << "QQuickWebEngineCertificateError.CertificateContainsErrors --> Error" + << "QQuickWebEngineCertificateError.CertificateNoRevocationMechanism --> Error" + << "QQuickWebEngineCertificateError.CertificateUnableToCheckRevocation --> Error" + << "QQuickWebEngineCertificateError.CertificateRevoked --> Error" + << "QQuickWebEngineCertificateError.CertificateInvalid --> Error" + << "QQuickWebEngineCertificateError.CertificateWeakSignatureAlgorithm --> Error" + << "QQuickWebEngineCertificateError.CertificateNonUniqueName --> Error" + << "QQuickWebEngineCertificateError.CertificateWeakKey --> Error" + << "QQuickWebEngineCertificateError.CertificateNameConstraintViolation --> Error" << "QQuickWebEngineView.NoErrorDomain --> ErrorDomain" << "QQuickWebEngineView.InternalErrorDomain --> ErrorDomain" << "QQuickWebEngineView.ConnectionErrorDomain --> ErrorDomain" @@ -110,6 +125,7 @@ static QStringList expectedAPI = QStringList() << "QQuickWebEngineView.titleChanged() --> void" << "QQuickWebEngineView.navigationHistoryChanged() --> void" << "QQuickWebEngineView.loadingChanged(QQuickWebEngineLoadRequest*) --> void" + << "QQuickWebEngineView.certificateError(QQuickWebEngineCertificateError*) --> void" << "QQuickWebEngineView.loadProgressChanged() --> void" << "QQuickWebEngineView.javaScriptConsoleMessage(JavaScriptConsoleMessageLevel,QString,int,QString) --> void" << "QQuickWebEngineView.urlChanged() --> void" @@ -175,6 +191,13 @@ static QStringList expectedAPI = QStringList() << "QQuickWebEngineProfile.httpCacheTypeChanged() --> void" << "QQuickWebEngineProfile.persistentCookiesPolicyChanged() --> void" << "QQuickWebEngineProfile.httpCacheMaxSizeChanged() --> void" + << "QQuickWebEngineCertificateError.ignoreCertificateError() --> void" + << "QQuickWebEngineCertificateError.rejectCertificate() --> void" + << "QQuickWebEngineCertificateError.defer() --> void" + << "QQuickWebEngineCertificateError.url --> QUrl" + << "QQuickWebEngineCertificateError.error --> Error" + << "QQuickWebEngineCertificateError.description --> QString" + << "QQuickWebEngineCertificateError.overridable --> bool" << "QQuickWebEngineProfile.downloadStarted(QQuickWebEngineDownloadItem*) --> void" << "QQuickWebEngineProfile.downloadFinished(QQuickWebEngineDownloadItem*) --> void" ; diff --git a/tests/quicktestbrowser/BrowserWindow.qml b/tests/quicktestbrowser/BrowserWindow.qml index 7516d0a65..8d61ac590 100644 --- a/tests/quicktestbrowser/BrowserWindow.qml +++ b/tests/quicktestbrowser/BrowserWindow.qml @@ -48,7 +48,7 @@ import QtQuick.Layouts 1.0 import QtQuick.Window 2.1 import QtQuick.Controls.Private 1.0 import Qt.labs.settings 1.0 - +import QtQuick.Dialogs 1.2 ApplicationWindow { id: browserWindow @@ -355,6 +355,13 @@ ApplicationWindow { } ] + onCertificateError: { + sslDialog.certError = error + sslDialog.text = "Certificate Error: " + error.description + sslDialog.visible = true + error.defer() + } + onNewViewRequested: { if (!request.userInitiated) print("Warning: Blocked a popup window.") @@ -432,6 +439,19 @@ ApplicationWindow { } } + MessageDialog { + id: sslDialog + + property var certError + + standardButtons: StandardButton.Cancel | StandardButton.Ok + visible: false + title: "Do you want to accept this certificate?" + + onAccepted: certError.ignoreCertificateError() + onRejected: certError.rejectCertificate() + } + DownloadView { id: downloadView visible: false |