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