From 61dec11a8bc36d37ed36acc6ad897653735d4564 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> Date: Fri, 20 Feb 2015 11:59:02 +0100 Subject: [PATCH] Fix crashes and ownership issues in Custom URL scheme handling Fixes crashes exposed by implementing the qthelp protocol handler for Qt assistant. Change-Id: I0b1153bc52ff82838cde009f1fe1ac46edc43210 Reviewed-by: Andras Becsi <andras.becsi@theqtcompany.com> --- src/core/custom_url_scheme_handler.cpp | 6 +++--- src/core/custom_url_scheme_handler.h | 3 +-- src/core/url_request_context_getter_qt.cpp | 4 +++- src/core/url_request_custom_job.cpp | 2 +- src/webenginewidgets/api/qwebengineurlschemehandler.cpp | 9 ++++----- src/webenginewidgets/api/qwebengineurlschemehandler_p.h | 2 +- .../api/qwebengineurlschemehandler_p_p.h | 4 +++- 7 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/core/custom_url_scheme_handler.cpp b/src/core/custom_url_scheme_handler.cpp index a8701a5d4..edc8000c9 100644 --- a/src/core/custom_url_scheme_handler.cpp +++ b/src/core/custom_url_scheme_handler.cpp @@ -39,7 +39,6 @@ CustomUrlSchemeHandler::CustomUrlSchemeHandler(const QByteArray &scheme) : m_scheme(scheme) - , m_protocolHandler(new CustomProtocolHandler(this)) { } @@ -57,7 +56,8 @@ void CustomUrlSchemeHandler::setScheme(const QByteArray &scheme) m_scheme = scheme; } -CustomProtocolHandler *CustomUrlSchemeHandler::protocolHandler() +CustomProtocolHandler *CustomUrlSchemeHandler::createProtocolHandler() { - return m_protocolHandler.data(); + // Will be owned by the JobFactory. + return new CustomProtocolHandler(this); } diff --git a/src/core/custom_url_scheme_handler.h b/src/core/custom_url_scheme_handler.h index fef29c98a..dbcdf2a60 100644 --- a/src/core/custom_url_scheme_handler.h +++ b/src/core/custom_url_scheme_handler.h @@ -55,13 +55,12 @@ public: QByteArray scheme() const; void setScheme(const QByteArray &); - CustomProtocolHandler *protocolHandler(); + CustomProtocolHandler *createProtocolHandler(); virtual bool handleJob(URLRequestCustomJobDelegate*) = 0; private: QByteArray m_scheme; - QScopedPointer<CustomProtocolHandler> m_protocolHandler; }; #endif // CUSTOM_URL_SCHEME_HANDLER_H_ diff --git a/src/core/url_request_context_getter_qt.cpp b/src/core/url_request_context_getter_qt.cpp index 41af37e5d..0a604eaaa 100644 --- a/src/core/url_request_context_getter_qt.cpp +++ b/src/core/url_request_context_getter_qt.cpp @@ -122,6 +122,8 @@ void URLRequestContextGetterQt::generateStorage() { Q_ASSERT(m_urlRequestContext); Q_ASSERT(m_proxyConfigService); + if (!m_proxyConfigService) + return; m_updateStorageSettings = false; m_storage.reset(new net::URLRequestContextStorage(m_urlRequestContext.get())); @@ -285,7 +287,7 @@ void URLRequestContextGetterQt::generateJobFactory() new net::FtpProtocolHandler(new net::FtpNetworkLayer(m_urlRequestContext->host_resolver()))); Q_FOREACH (CustomUrlSchemeHandler* handler, m_browserContext->customUrlSchemeHandlers()) { - m_jobFactory->SetProtocolHandler(handler->scheme().toStdString(), handler->protocolHandler()); + m_jobFactory->SetProtocolHandler(handler->scheme().toStdString(), handler->createProtocolHandler()); } m_urlRequestContext->set_job_factory(m_jobFactory.get()); diff --git a/src/core/url_request_custom_job.cpp b/src/core/url_request_custom_job.cpp index e97804c2f..f206955f1 100644 --- a/src/core/url_request_custom_job.cpp +++ b/src/core/url_request_custom_job.cpp @@ -72,7 +72,7 @@ void URLRequestCustomJob::Start() void URLRequestCustomJob::Kill() { - if (m_device->isOpen()) + if (m_device && m_device->isOpen()) m_device->close(); m_weakFactory.InvalidateWeakPtrs(); diff --git a/src/webenginewidgets/api/qwebengineurlschemehandler.cpp b/src/webenginewidgets/api/qwebengineurlschemehandler.cpp index b52912b7c..ccb92258b 100644 --- a/src/webenginewidgets/api/qwebengineurlschemehandler.cpp +++ b/src/webenginewidgets/api/qwebengineurlschemehandler.cpp @@ -41,8 +41,6 @@ #include "qwebengineprofile_p.h" #include "qwebengineurlrequestjob_p.h" -#include <QSharedPointer> - QT_BEGIN_NAMESPACE QWebEngineUrlSchemeHandlerPrivate::QWebEngineUrlSchemeHandlerPrivate(const QByteArray &scheme, QWebEngineUrlSchemeHandler *q, QWebEngineProfile *profile) @@ -63,8 +61,8 @@ bool QWebEngineUrlSchemeHandlerPrivate::handleJob(URLRequestCustomJobDelegate *j return true; } -QWebEngineUrlSchemeHandler::QWebEngineUrlSchemeHandler(const QByteArray &scheme, QWebEngineProfile *profile) - : QObject(profile) +QWebEngineUrlSchemeHandler::QWebEngineUrlSchemeHandler(const QByteArray &scheme, QWebEngineProfile *profile, QObject *parent) + : QObject(parent) , d_ptr(new QWebEngineUrlSchemeHandlerPrivate(scheme, this, profile)) { profile->d_func()->installUrlSchemeHandler(this); @@ -72,7 +70,8 @@ QWebEngineUrlSchemeHandler::QWebEngineUrlSchemeHandler(const QByteArray &scheme, QWebEngineUrlSchemeHandler::~QWebEngineUrlSchemeHandler() { - d_ptr->m_profile->d_func()->removeUrlSchemeHandler(this); + if (d_ptr->m_profile) + d_ptr->m_profile->d_func()->removeUrlSchemeHandler(this); } QByteArray QWebEngineUrlSchemeHandler::scheme() const diff --git a/src/webenginewidgets/api/qwebengineurlschemehandler_p.h b/src/webenginewidgets/api/qwebengineurlschemehandler_p.h index 0455128c7..153b78f81 100644 --- a/src/webenginewidgets/api/qwebengineurlschemehandler_p.h +++ b/src/webenginewidgets/api/qwebengineurlschemehandler_p.h @@ -54,7 +54,7 @@ class QWebEngineUrlSchemeHandlerPrivate; class QWEBENGINEWIDGETS_EXPORT QWebEngineUrlSchemeHandler : public QObject { Q_OBJECT public: - QWebEngineUrlSchemeHandler(const QByteArray &scheme, QWebEngineProfile *profile); + QWebEngineUrlSchemeHandler(const QByteArray &scheme, QWebEngineProfile *profile, QObject *parent = 0); virtual ~QWebEngineUrlSchemeHandler(); QByteArray scheme() const; diff --git a/src/webenginewidgets/api/qwebengineurlschemehandler_p_p.h b/src/webenginewidgets/api/qwebengineurlschemehandler_p_p.h index e880bf000..6146cc05e 100644 --- a/src/webenginewidgets/api/qwebengineurlschemehandler_p_p.h +++ b/src/webenginewidgets/api/qwebengineurlschemehandler_p_p.h @@ -41,6 +41,8 @@ #include "custom_url_scheme_handler.h" +#include <QPointer> + QT_BEGIN_NAMESPACE class QWebEngineProfile; @@ -58,7 +60,7 @@ public: private: QWebEngineUrlSchemeHandler *q_ptr; - QWebEngineProfile* m_profile; + QPointer<QWebEngineProfile> m_profile; }; QT_END_NAMESPACE -- GitLab