From 2a972c4046bbee49ec9c770f2c1e12fb95500240 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> Date: Tue, 29 Sep 2015 15:41:46 +0200 Subject: [PATCH] Fix assert on deleting installed custom URL scheme handler When the QObject::destroyed signal is emitted the inherited class parts have already been destroyed and thus it is no longer a QWebEngineUrlSchemeHandler and qobject_cast will return 0, which is asserted against. Change-Id: I7130c60a26088067930499a30e0081ed297a92d9 Reviewed-by: Kai Koehne <kai.koehne@theqtcompany.com> --- src/core/api/qwebengineurlschemehandler.cpp | 1 + src/core/api/qwebengineurlschemehandler.h | 3 +++ src/webenginewidgets/api/qwebengineprofile.cpp | 8 ++++---- src/webenginewidgets/api/qwebengineprofile.h | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/core/api/qwebengineurlschemehandler.cpp b/src/core/api/qwebengineurlschemehandler.cpp index 330648893..e14da6fb5 100644 --- a/src/core/api/qwebengineurlschemehandler.cpp +++ b/src/core/api/qwebengineurlschemehandler.cpp @@ -84,6 +84,7 @@ QWebEngineUrlSchemeHandler::QWebEngineUrlSchemeHandler(const QByteArray &scheme, QWebEngineUrlSchemeHandler::~QWebEngineUrlSchemeHandler() { + Q_EMIT destroyed(this); delete d_ptr; } diff --git a/src/core/api/qwebengineurlschemehandler.h b/src/core/api/qwebengineurlschemehandler.h index b6f6a69f0..1ec32e46c 100644 --- a/src/core/api/qwebengineurlschemehandler.h +++ b/src/core/api/qwebengineurlschemehandler.h @@ -57,6 +57,9 @@ public: virtual void requestStarted(QWebEngineUrlRequestJob*) = 0; +Q_SIGNALS: + void destroyed(QWebEngineUrlSchemeHandler*); + private: Q_DISABLE_COPY(QWebEngineUrlSchemeHandler) Q_DECLARE_PRIVATE(QWebEngineUrlSchemeHandler) diff --git a/src/webenginewidgets/api/qwebengineprofile.cpp b/src/webenginewidgets/api/qwebengineprofile.cpp index 323659827..66cba9bc3 100644 --- a/src/webenginewidgets/api/qwebengineprofile.cpp +++ b/src/webenginewidgets/api/qwebengineprofile.cpp @@ -582,7 +582,7 @@ void QWebEngineProfile::installUrlSchemeHandler(QWebEngineUrlSchemeHandler *hand d->m_urlSchemeHandlers.insert(scheme, handler); d->browserContext()->customUrlSchemeHandlers().append(handler->d_func()); d->browserContext()->updateCustomUrlSchemeHandlers(); - connect(handler, SIGNAL(destroyed(QObject*)), this, SLOT(destroyedUrlSchemeHandler(QObject*))); + connect(handler, SIGNAL(destroyed(QWebEngineUrlSchemeHandler*)), this, SLOT(destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler*))); } /*! @@ -599,7 +599,7 @@ void QWebEngineProfile::removeUrlSchemeHandler(QWebEngineUrlSchemeHandler *handl int count = d->m_urlSchemeHandlers.remove(handler->scheme()); if (!count) return; - disconnect(handler, SIGNAL(destroyed(QObject*)), this, SLOT(destroyedUrlSchemeHandler(QObject*))); + disconnect(handler, SIGNAL(destroyed(QWebEngineUrlSchemeHandler*)), this, SLOT(destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler*))); d->browserContext()->removeCustomUrlSchemeHandler(handler->d_func()); d->browserContext()->updateCustomUrlSchemeHandlers(); } @@ -617,9 +617,9 @@ void QWebEngineProfile::clearUrlSchemeHandlers() d->browserContext()->updateCustomUrlSchemeHandlers(); } -void QWebEngineProfile::destroyedUrlSchemeHandler(QObject *obj) +void QWebEngineProfile::destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler *obj) { - removeUrlSchemeHandler(qobject_cast<QWebEngineUrlSchemeHandler*>(obj)); + removeUrlSchemeHandler(obj); } QT_END_NAMESPACE diff --git a/src/webenginewidgets/api/qwebengineprofile.h b/src/webenginewidgets/api/qwebengineprofile.h index 5532f12ee..82946a223 100644 --- a/src/webenginewidgets/api/qwebengineprofile.h +++ b/src/webenginewidgets/api/qwebengineprofile.h @@ -121,7 +121,7 @@ Q_SIGNALS: void downloadRequested(QWebEngineDownloadItem *download); private Q_SLOTS: - void destroyedUrlSchemeHandler(QObject *obj); + void destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler *obj); private: Q_DISABLE_COPY(QWebEngineProfile) -- GitLab