diff --git a/src/core/api/core_api.pro b/src/core/api/core_api.pro index d72b27229854d5a9e984ae67202578f26212c4c3..1f82c7e217643c110d07441e63f2c8b54c6c51a3 100644 --- a/src/core/api/core_api.pro +++ b/src/core/api/core_api.pro @@ -37,8 +37,13 @@ HEADERS = \ qwebenginecookiestoreclient_p.h \ qwebengineurlrequestinterceptor.h \ qwebengineurlrequestinfo.h \ - qwebengineurlrequestinfo_p.h + qwebengineurlrequestinfo_p.h \ + qwebengineurlrequestjob.h \ + qwebengineurlschemehandler.h \ + qwebengineurlschemehandler_p.h SOURCES = \ qwebenginecookiestoreclient.cpp \ - qwebengineurlrequestinfo.cpp + qwebengineurlrequestinfo.cpp \ + qwebengineurlrequestjob.cpp \ + qwebengineurlschemehandler.cpp diff --git a/src/webenginewidgets/api/qwebengineurlrequestjob.cpp b/src/core/api/qwebengineurlrequestjob.cpp similarity index 94% rename from src/webenginewidgets/api/qwebengineurlrequestjob.cpp rename to src/core/api/qwebengineurlrequestjob.cpp index 2bff572365578c2f729339875cb0100269a1cafd..f2a7f16190e85995349942a4ba72b104e093a046 100644 --- a/src/webenginewidgets/api/qwebengineurlrequestjob.cpp +++ b/src/core/api/qwebengineurlrequestjob.cpp @@ -34,9 +34,7 @@ ** ****************************************************************************/ -#include "qwebengineurlrequestjob_p.h" - -#include "qwebengineprofile.h" +#include "qwebengineurlrequestjob.h" #include "url_request_custom_job_delegate.h" @@ -47,11 +45,10 @@ QT_BEGIN_NAMESPACE /*! \class QWebEngineUrlRequestJob \brief The QWebEngineUrlRequestJob class represents a custom URL request. - \since 5.5 - \internal + \since 5.6 A QWebEngineUrlRequestJob is given to QWebEngineUrlSchemeHandler::requestStarted() and must - be handled by the derived implementations of class. + be handled by the derived implementations of the class. A job can be handled by calling either setReply(), redirect() or setError(). @@ -59,7 +56,7 @@ QT_BEGIN_NAMESPACE the job when it is no longer needed, so the signal QObject::destroyed() must be monitored if a pointer to the object is stored. - \inmodule QtWebEngineWidgets + \inmodule QtWebEngineCore */ /*! diff --git a/src/webenginewidgets/api/qwebengineurlrequestjob_p.h b/src/core/api/qwebengineurlrequestjob.h similarity index 93% rename from src/webenginewidgets/api/qwebengineurlrequestjob_p.h rename to src/core/api/qwebengineurlrequestjob.h index 32e2498faad2ee871e34dbb095c0d7ae09923fd7..1be3808fad8cb493075f7b63cdb23393ab84a767 100644 --- a/src/webenginewidgets/api/qwebengineurlrequestjob_p.h +++ b/src/core/api/qwebengineurlrequestjob.h @@ -48,11 +48,11 @@ // We mean it. // -#include "qtwebenginewidgetsglobal.h" +#include "qtwebenginecoreglobal.h" -#include <QtCore/QByteArray> -#include <QtCore/QObject> -#include <QtCore/QUrl> +#include <QtCore/qbytearray.h> +#include <QtCore/qobject.h> +#include <QtCore/qurl.h> namespace QtWebEngineCore { class URLRequestCustomJobDelegate; @@ -62,7 +62,7 @@ QT_BEGIN_NAMESPACE class QIODevice; -class QWEBENGINEWIDGETS_EXPORT QWebEngineUrlRequestJob : public QObject { +class QWEBENGINE_EXPORT QWebEngineUrlRequestJob : public QObject { Q_OBJECT public: ~QWebEngineUrlRequestJob(); @@ -75,6 +75,7 @@ public: RequestDenied, RequestFailed }; + Q_ENUM(Error) QUrl requestUrl() const; void setReply(const QByteArray &contentType, QIODevice *device); diff --git a/src/webenginewidgets/api/qwebengineurlschemehandler.cpp b/src/core/api/qwebengineurlschemehandler.cpp similarity index 74% rename from src/webenginewidgets/api/qwebengineurlschemehandler.cpp rename to src/core/api/qwebengineurlschemehandler.cpp index a0e751c24a890d0234a60d418a0859590cb7fdd3..33064889389d5a35d98d15da16503b5a8de2dc31 100644 --- a/src/webenginewidgets/api/qwebengineurlschemehandler.cpp +++ b/src/core/api/qwebengineurlschemehandler.cpp @@ -34,36 +34,28 @@ ** ****************************************************************************/ +#include "qwebengineurlschemehandler.h" #include "qwebengineurlschemehandler_p.h" -#include "qwebengineurlschemehandler_p_p.h" -#include "qwebengineprofile.h" -#include "qwebengineprofile_p.h" -#include "qwebengineurlrequestjob_p.h" +#include "qwebengineurlrequestjob.h" QT_BEGIN_NAMESPACE /*! \class QWebEngineUrlSchemeHandler - \brief The QWebEngineUrlSchemeHandler Base class for handling custom URL schemes. - \since 5.5 - \internal + \brief The QWebEngineUrlSchemeHandler base class for handling custom URL schemes. + \since 5.6 To implement a custom URL scheme for QtWebEngine you must write a class derived from this class, and reimplement requestStarted(). - To install a custom URL scheme handler into a QtWebProfile, you only need to call the constructor - with the correct profile. Each instance of a QWebEngineUrlSchemeHandler can only handle requests - from a single profile. - - \inmodule QtWebEngineWidgets + \inmodule QtWebEngineCore */ -QWebEngineUrlSchemeHandlerPrivate::QWebEngineUrlSchemeHandlerPrivate(const QByteArray &scheme, QWebEngineUrlSchemeHandler *q, QWebEngineProfile *profile) +QWebEngineUrlSchemeHandlerPrivate::QWebEngineUrlSchemeHandlerPrivate(const QByteArray &scheme, QWebEngineUrlSchemeHandler *q) : CustomUrlSchemeHandler(scheme) , q_ptr(q) - , m_profile(profile) { } @@ -81,20 +73,18 @@ bool QWebEngineUrlSchemeHandlerPrivate::handleJob(QtWebEngineCore::URLRequestCus /*! Constructs a new URL scheme handler. - The handler is created for \a scheme and for the \a profile. + The handler is created for \a scheme with the parent \a parent. */ -QWebEngineUrlSchemeHandler::QWebEngineUrlSchemeHandler(const QByteArray &scheme, QWebEngineProfile *profile, QObject *parent) +QWebEngineUrlSchemeHandler::QWebEngineUrlSchemeHandler(const QByteArray &scheme, QObject *parent) : QObject(parent) - , d_ptr(new QWebEngineUrlSchemeHandlerPrivate(scheme, this, profile)) + , d_ptr(new QWebEngineUrlSchemeHandlerPrivate(scheme, this)) { - profile->d_func()->installUrlSchemeHandler(this); } QWebEngineUrlSchemeHandler::~QWebEngineUrlSchemeHandler() { - if (d_ptr->m_profile) - d_ptr->m_profile->d_func()->removeUrlSchemeHandler(this); + delete d_ptr; } /*! @@ -108,7 +98,7 @@ QByteArray QWebEngineUrlSchemeHandler::scheme() const /*! \fn void QWebEngineUrlSchemeHandler::requestStarted(QWebEngineUrlRequestJob *request) - This method is called whenever a request for the registered scheme is started. + This method is called whenever a request \a request for the registered scheme is started. This method must be reimplemented by all custom URL scheme handlers. The request is asynchronous and does not need to be handled right away. diff --git a/src/webenginewidgets/api/qwebengineurlschemehandler_p.h b/src/core/api/qwebengineurlschemehandler.h similarity index 73% rename from src/webenginewidgets/api/qwebengineurlschemehandler_p.h rename to src/core/api/qwebengineurlschemehandler.h index 7de87dff2f3d2679103a361b1c4342ec249002ed..b6f6a69f071f492f3ae0edc599c55952c9b65f50 100644 --- a/src/webenginewidgets/api/qwebengineurlschemehandler_p.h +++ b/src/core/api/qwebengineurlschemehandler.h @@ -37,45 +37,32 @@ #ifndef QWEBENGINEURLSCHEMEHANDLER_H #define QWEBENGINEURLSCHEMEHANDLER_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 "qtwebenginecoreglobal.h" -#include "qtwebenginewidgetsglobal.h" - -#include <QtCore/QByteArray> -#include <QtCore/QIODevice> -#include <QtCore/QObject> -#include <QtCore/QScopedPointer> -#include <QtCore/QUrl> +#include <QtCore/qbytearray.h> +#include <QtCore/qobject.h> QT_BEGIN_NAMESPACE -class QWebEngineProfile; class QWebEngineUrlRequestJob; class QWebEngineUrlSchemeHandlerPrivate; -class QWEBENGINEWIDGETS_EXPORT QWebEngineUrlSchemeHandler : public QObject { +class QWEBENGINE_EXPORT QWebEngineUrlSchemeHandler : public QObject { Q_OBJECT public: - QWebEngineUrlSchemeHandler(const QByteArray &scheme, QWebEngineProfile *profile, QObject *parent = 0); - virtual ~QWebEngineUrlSchemeHandler(); + QWebEngineUrlSchemeHandler(const QByteArray &scheme, QObject *parent = 0); + ~QWebEngineUrlSchemeHandler(); QByteArray scheme() const; virtual void requestStarted(QWebEngineUrlRequestJob*) = 0; private: + Q_DISABLE_COPY(QWebEngineUrlSchemeHandler) Q_DECLARE_PRIVATE(QWebEngineUrlSchemeHandler) - friend class QWebEngineProfilePrivate; - QScopedPointer<QWebEngineUrlSchemeHandlerPrivate> d_ptr; + friend class QWebEngineProfile; + friend class QQuickWebEngineProfile; + QWebEngineUrlSchemeHandlerPrivate *d_ptr; }; QT_END_NAMESPACE diff --git a/src/webenginewidgets/api/qwebengineurlschemehandler_p_p.h b/src/core/api/qwebengineurlschemehandler_p.h similarity index 91% rename from src/webenginewidgets/api/qwebengineurlschemehandler_p_p.h rename to src/core/api/qwebengineurlschemehandler_p.h index d349d7d8c2407f670cd57535ff861063818330e5..dc4b272b328895ae9c18e78ca7c9b0b5c96c81b9 100644 --- a/src/webenginewidgets/api/qwebengineurlschemehandler_p_p.h +++ b/src/core/api/qwebengineurlschemehandler_p.h @@ -48,30 +48,27 @@ // We mean it. // -#include "qwebengineurlschemehandler_p.h" +#include "qwebengineurlschemehandler.h" #include "custom_url_scheme_handler.h" -#include <QPointer> - QT_BEGIN_NAMESPACE class QWebEngineProfile; class QWebEngineUrlRequestJob; class QWebEngineUrlSchemeHandler; -class QWebEngineUrlSchemeHandlerPrivate : public QtWebEngineCore::CustomUrlSchemeHandler { +class QWEBENGINE_EXPORT QWebEngineUrlSchemeHandlerPrivate : public QtWebEngineCore::CustomUrlSchemeHandler { public: Q_DECLARE_PUBLIC(QWebEngineUrlSchemeHandler) - QWebEngineUrlSchemeHandlerPrivate(const QByteArray &, QWebEngineUrlSchemeHandler *, QWebEngineProfile *); + QWebEngineUrlSchemeHandlerPrivate(const QByteArray &, QWebEngineUrlSchemeHandler *); virtual ~QWebEngineUrlSchemeHandlerPrivate(); virtual bool handleJob(QtWebEngineCore::URLRequestCustomJobDelegate*) Q_DECL_OVERRIDE; private: QWebEngineUrlSchemeHandler *q_ptr; - QPointer<QWebEngineProfile> m_profile; }; QT_END_NAMESPACE diff --git a/src/core/browser_context_adapter.cpp b/src/core/browser_context_adapter.cpp index 75a906b35a07682b91608729d66ba901ef9c8c8f..48d05ae1df02ebcd6f3ac22f1a4ada2d35a8da92 100644 --- a/src/core/browser_context_adapter.cpp +++ b/src/core/browser_context_adapter.cpp @@ -358,6 +358,12 @@ void BrowserContextAdapter::updateCustomUrlSchemeHandlers() m_browserContext->url_request_getter_->updateStorageSettings(); } +void BrowserContextAdapter::removeCustomUrlSchemeHandler(CustomUrlSchemeHandler *handler) +{ + m_customUrlSchemeHandlers.removeOne(handler); + Q_ASSERT(!m_customUrlSchemeHandlers.contains(handler)); +} + UserScriptControllerHost *BrowserContextAdapter::userScriptController() { if (!m_userScriptController) diff --git a/src/core/browser_context_adapter.h b/src/core/browser_context_adapter.h index 896743f4bd8f6c25043c1c35c16ea2d7983aa022..0bca1bf8b0b40ed1bd2de577cdb852570b7b6877 100644 --- a/src/core/browser_context_adapter.h +++ b/src/core/browser_context_adapter.h @@ -147,6 +147,7 @@ public: QVector<CustomUrlSchemeHandler*> &customUrlSchemeHandlers(); void updateCustomUrlSchemeHandlers(); + void removeCustomUrlSchemeHandler(CustomUrlSchemeHandler*); UserScriptControllerHost *userScriptController(); void permissionRequestReply(const QUrl &origin, PermissionType type, bool reply); diff --git a/src/core/custom_url_scheme_handler.cpp b/src/core/custom_url_scheme_handler.cpp index b9fcf9c3698eaa0e0caf5b6f107b2ecc4965655e..29791b55590e72b26000d2dc619422034d54fe2c 100644 --- a/src/core/custom_url_scheme_handler.cpp +++ b/src/core/custom_url_scheme_handler.cpp @@ -44,10 +44,6 @@ CustomUrlSchemeHandler::CustomUrlSchemeHandler(const QByteArray &scheme) { } -CustomUrlSchemeHandler::~CustomUrlSchemeHandler() -{ -} - QByteArray CustomUrlSchemeHandler::scheme() const { return m_scheme; diff --git a/src/core/custom_url_scheme_handler.h b/src/core/custom_url_scheme_handler.h index 745f0eb4cf2d62f20cf69ef578dd7e4e85788db1..d866628dea73254e4551e822356085f938ee305d 100644 --- a/src/core/custom_url_scheme_handler.h +++ b/src/core/custom_url_scheme_handler.h @@ -53,7 +53,7 @@ class URLRequestCustomJobDelegate; class QWEBENGINE_EXPORT CustomUrlSchemeHandler { public: explicit CustomUrlSchemeHandler(const QByteArray &); - ~CustomUrlSchemeHandler(); + virtual ~CustomUrlSchemeHandler() { } QByteArray scheme() const; void setScheme(const QByteArray &); diff --git a/src/webenginewidgets/api/qwebengineprofile.cpp b/src/webenginewidgets/api/qwebengineprofile.cpp index db8c0dc89f3fd2c761bfa40fce41b18b55b108b8..a38a78cf73e7fe83b3dda6d163a4ab683c4416c8 100644 --- a/src/webenginewidgets/api/qwebengineprofile.cpp +++ b/src/webenginewidgets/api/qwebengineprofile.cpp @@ -42,7 +42,7 @@ #include "qwebenginepage.h" #include "qwebengineprofile_p.h" #include "qwebenginesettings.h" -#include "qwebengineurlschemehandler_p_p.h" +#include "qwebengineurlschemehandler_p.h" #include "qwebenginescriptcollection_p.h" #include "browser_context_adapter.h" @@ -536,10 +536,16 @@ QWebEngineSettings *QWebEngineProfile::settings() const return d->settings(); } -QWebEngineUrlSchemeHandler *QWebEngineProfilePrivate::urlSchemeHandler(const QByteArray &protocol) +/*! + \since 5.6 + + Returns the custom URL scheme handler register for the URL scheme \a scheme. +*/ +const QWebEngineUrlSchemeHandler *QWebEngineProfile::urlSchemeHandler(const QByteArray &scheme) const { - if (m_urlSchemeHandlers.contains(protocol)) - return m_urlSchemeHandlers.value(protocol); + const Q_D(QWebEngineProfile); + if (d->m_urlSchemeHandlers.contains(scheme)) + return d->m_urlSchemeHandlers.value(scheme); return 0; } @@ -553,8 +559,14 @@ static bool checkInternalScheme(const QByteArray &scheme) return internalSchemes.contains(scheme); } -void QWebEngineProfilePrivate::installUrlSchemeHandler(QWebEngineUrlSchemeHandler *handler) +/*! + \since 5.6 + + Installs the custom URL scheme handler \a handler in the profile. +*/ +void QWebEngineProfile::installUrlSchemeHandler(QWebEngineUrlSchemeHandler *handler) { + Q_D(QWebEngineProfile); Q_ASSERT(handler); QByteArray scheme = handler->scheme(); if (checkInternalScheme(scheme)) { @@ -562,29 +574,51 @@ void QWebEngineProfilePrivate::installUrlSchemeHandler(QWebEngineUrlSchemeHandle return; } - if (m_urlSchemeHandlers.contains(scheme)) { + if (d->m_urlSchemeHandlers.contains(scheme)) { qWarning() << "URL scheme handler already installed for the scheme: " << scheme; return; } - m_urlSchemeHandlers.insert(scheme, handler); - browserContext()->customUrlSchemeHandlers().append(handler->d_func()); - browserContext()->updateCustomUrlSchemeHandlers(); + 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*))); } -void QWebEngineProfilePrivate::removeUrlSchemeHandler(QWebEngineUrlSchemeHandler *handler) +/*! + \since 5.6 + + Removes the custom URL scheme handler \a handler from the profile +*/ +void QWebEngineProfile::removeUrlSchemeHandler(QWebEngineUrlSchemeHandler *handler) { - int count = m_urlSchemeHandlers.remove(handler->scheme()); + Q_D(QWebEngineProfile); + Q_ASSERT(handler); + if (!handler) + return; + int count = d->m_urlSchemeHandlers.remove(handler->scheme()); if (!count) return; - browserContext()->customUrlSchemeHandlers().removeOne(handler->d_func()); - browserContext()->updateCustomUrlSchemeHandlers(); + disconnect(handler, SIGNAL(destroyed(QObject*)), this, SLOT(destroyedUrlSchemeHandler(QObject*))); + d->browserContext()->removeCustomUrlSchemeHandler(handler->d_func()); + d->browserContext()->updateCustomUrlSchemeHandlers(); +} + +/*! + \since 5.6 + + Removes all custom URL scheme handlers installed in the profile. +*/ +void QWebEngineProfile::clearUrlSchemeHandlers() +{ + Q_D(QWebEngineProfile); + d->m_urlSchemeHandlers.clear(); + d->browserContext()->customUrlSchemeHandlers().clear(); + d->browserContext()->updateCustomUrlSchemeHandlers(); } -void QWebEngineProfilePrivate::clearUrlSchemeHandlers() +void QWebEngineProfile::destroyedUrlSchemeHandler(QObject *obj) { - m_urlSchemeHandlers.clear(); - browserContext()->customUrlSchemeHandlers().clear(); - browserContext()->updateCustomUrlSchemeHandlers(); + removeUrlSchemeHandler(qobject_cast<QWebEngineUrlSchemeHandler*>(obj)); } QT_END_NAMESPACE diff --git a/src/webenginewidgets/api/qwebengineprofile.h b/src/webenginewidgets/api/qwebengineprofile.h index c617fe36138a01bc316ef70dc7d0ac3916a91fe8..5532f12ee8eeadcba9b6ea279af0557f4516eaf8 100644 --- a/src/webenginewidgets/api/qwebengineprofile.h +++ b/src/webenginewidgets/api/qwebengineprofile.h @@ -55,6 +55,7 @@ class QWebEngineProfilePrivate; class QWebEngineSettings; class QWebEngineScriptCollection; class QWebEngineUrlRequestInterceptor; +class QWebEngineUrlSchemeHandler; class QWEBENGINEWIDGETS_EXPORT QWebEngineProfile : public QObject { Q_OBJECT @@ -109,11 +110,19 @@ public: QWebEngineSettings *settings() const; QWebEngineScriptCollection *scripts() const; + const QWebEngineUrlSchemeHandler *urlSchemeHandler(const QByteArray &) const; + void installUrlSchemeHandler(QWebEngineUrlSchemeHandler *); + void removeUrlSchemeHandler(QWebEngineUrlSchemeHandler *); + void clearUrlSchemeHandlers(); + static QWebEngineProfile *defaultProfile(); Q_SIGNALS: void downloadRequested(QWebEngineDownloadItem *download); +private Q_SLOTS: + void destroyedUrlSchemeHandler(QObject *obj); + private: Q_DISABLE_COPY(QWebEngineProfile) Q_DECLARE_PRIVATE(QWebEngineProfile) diff --git a/src/webenginewidgets/api/qwebengineprofile_p.h b/src/webenginewidgets/api/qwebengineprofile_p.h index ee3ea57d8e4ba28c00cd86d500aedefc41fabc02..8ba64c43849c4e30f0fbd36411e5ea4f4d4bc668 100644 --- a/src/webenginewidgets/api/qwebengineprofile_p.h +++ b/src/webenginewidgets/api/qwebengineprofile_p.h @@ -79,18 +79,13 @@ public: void downloadRequested(DownloadItemInfo &info) Q_DECL_OVERRIDE; void downloadUpdated(const DownloadItemInfo &info) Q_DECL_OVERRIDE; - QWebEngineUrlSchemeHandler *urlSchemeHandler(const QByteArray &); - void installUrlSchemeHandler(QWebEngineUrlSchemeHandler *); - void removeUrlSchemeHandler(QWebEngineUrlSchemeHandler *); - void clearUrlSchemeHandlers(); - private: QWebEngineProfile *q_ptr; QWebEngineSettings *m_settings; QScopedPointer<QWebEngineScriptCollection> m_scriptCollection; QExplicitlySharedDataPointer<QtWebEngineCore::BrowserContextAdapter> m_browserContextRef; QMap<quint32, QPointer<QWebEngineDownloadItem> > m_ongoingDownloads; - QMap<QByteArray, QPointer<QWebEngineUrlSchemeHandler> > m_urlSchemeHandlers; + QMap<QByteArray, QWebEngineUrlSchemeHandler *> m_urlSchemeHandlers; }; QT_END_NAMESPACE diff --git a/src/webenginewidgets/webenginewidgets.pro b/src/webenginewidgets/webenginewidgets.pro index 0d92767c1bd54ca2e0e2335b2f5391630b00cee6..c321855632b311a0b9565f62aa4148e5aaf019f5 100644 --- a/src/webenginewidgets/webenginewidgets.pro +++ b/src/webenginewidgets/webenginewidgets.pro @@ -20,8 +20,6 @@ SOURCES = \ api/qwebenginescript.cpp \ api/qwebenginescriptcollection.cpp \ api/qwebenginesettings.cpp \ - api/qwebengineurlrequestjob.cpp \ - api/qwebengineurlschemehandler.cpp \ api/qwebengineview.cpp \ render_widget_host_view_qt_delegate_widget.cpp @@ -38,9 +36,6 @@ HEADERS = \ api/qwebenginescriptcollection.h \ api/qwebenginescriptcollection_p.h \ api/qwebenginesettings.h \ - api/qwebengineurlrequestjob_p.h \ - api/qwebengineurlschemehandler_p.h \ - api/qwebengineurlschemehandler_p_p.h \ api/qwebengineview.h \ api/qwebengineview_p.h \ render_widget_host_view_qt_delegate_widget.h