From 4e5979da9003280ad46b73e7fa9cc0e32ecb30e0 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Fri, 11 Dec 2015 13:32:30 +0100 Subject: Expose UrlSchemeHandler API in QQuickWebEngineProfile Task-number: QTBUG-49914 Change-Id: Idfe596db1ec9fab3728f6dbfa55d5e6d7e5415ff Reviewed-by: Allan Sandfeld Jensen --- src/webengine/api/qquickwebengineprofile.cpp | 85 ++++++++++++++++++++++++++++ src/webengine/api/qquickwebengineprofile.h | 10 ++++ 2 files changed, 95 insertions(+) (limited to 'src') diff --git a/src/webengine/api/qquickwebengineprofile.cpp b/src/webengine/api/qquickwebengineprofile.cpp index 6b2418218..27457729f 100644 --- a/src/webengine/api/qquickwebengineprofile.cpp +++ b/src/webengine/api/qquickwebengineprofile.cpp @@ -601,6 +601,91 @@ void QQuickWebEngineProfile::setRequestInterceptor(QWebEngineUrlRequestIntercept d->browserContext()->setRequestInterceptor(interceptor); } +/*! + Returns the custom URL scheme handler register for the URL scheme \a scheme. +*/ +const QWebEngineUrlSchemeHandler *QQuickWebEngineProfile::urlSchemeHandler(const QByteArray &scheme) const +{ + const Q_D(QQuickWebEngineProfile); + if (d->browserContext()->customUrlSchemeHandlers().contains(scheme)) + return d->browserContext()->customUrlSchemeHandlers().value(scheme); + return 0; +} + +static bool checkInternalScheme(const QByteArray &scheme) +{ + static QSet internalSchemes; + if (internalSchemes.isEmpty()) { + internalSchemes << QByteArrayLiteral("qrc") << QByteArrayLiteral("data") << QByteArrayLiteral("blob") + << QByteArrayLiteral("http") << QByteArrayLiteral("ftp") << QByteArrayLiteral("javascript"); + } + return internalSchemes.contains(scheme); +} + +/*! + Registers a handler \a handler for custom URL scheme \a scheme in the profile. +*/ +void QQuickWebEngineProfile::installUrlSchemeHandler(const QByteArray &scheme, QWebEngineUrlSchemeHandler *handler) +{ + Q_D(QQuickWebEngineProfile); + Q_ASSERT(handler); + if (checkInternalScheme(scheme)) { + qWarning("Cannot install a URL scheme handler overriding internal scheme: %s", scheme.constData()); + return; + } + + if (d->browserContext()->customUrlSchemeHandlers().contains(scheme)) { + if (d->browserContext()->customUrlSchemeHandlers().value(scheme) != handler) + qWarning("URL scheme handler already installed for the scheme: %s", scheme.constData()); + return; + } + d->browserContext()->addCustomUrlSchemeHandler(scheme, handler); + connect(handler, SIGNAL(_q_destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler*)), this, SLOT(destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler*))); +} + +/*! + Removes the custom URL scheme handler \a handler from the profile. + + \sa removeUrlScheme() +*/ +void QQuickWebEngineProfile::removeUrlSchemeHandler(QWebEngineUrlSchemeHandler *handler) +{ + Q_D(QQuickWebEngineProfile); + Q_ASSERT(handler); + if (!d->browserContext()->removeCustomUrlSchemeHandler(handler)) + return; + disconnect(handler, SIGNAL(_q_destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler*)), this, SLOT(destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler*))); +} + +/*! + Removes the custom URL scheme \a scheme from the profile. + + \sa removeUrlSchemeHandler() +*/ +void QQuickWebEngineProfile::removeUrlScheme(const QByteArray &scheme) +{ + Q_D(QQuickWebEngineProfile); + QWebEngineUrlSchemeHandler *handler = d->browserContext()->takeCustomUrlSchemeHandler(scheme); + if (!handler) + return; + disconnect(handler, SIGNAL(_q_destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler*)), this, SLOT(destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler*))); +} + +/*! + Removes all custom URL scheme handlers installed in the profile. +*/ +void QQuickWebEngineProfile::removeAllUrlSchemeHandlers() +{ + Q_D(QQuickWebEngineProfile); + d->browserContext()->customUrlSchemeHandlers().clear(); + d->browserContext()->updateCustomUrlSchemeHandlers(); +} + +void QQuickWebEngineProfile::destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler *obj) +{ + removeUrlSchemeHandler(obj); +} + QQuickWebEngineSettings *QQuickWebEngineProfile::settings() const { const Q_D(QQuickWebEngineProfile); diff --git a/src/webengine/api/qquickwebengineprofile.h b/src/webengine/api/qquickwebengineprofile.h index a6959916b..1850f52fa 100644 --- a/src/webengine/api/qquickwebengineprofile.h +++ b/src/webengine/api/qquickwebengineprofile.h @@ -55,6 +55,7 @@ class QQuickWebEngineProfilePrivate; class QQuickWebEngineSettings; class QWebEngineCookieStore; class QWebEngineUrlRequestInterceptor; +class QWebEngineUrlSchemeHandler; class Q_WEBENGINE_EXPORT QQuickWebEngineProfile : public QObject { Q_OBJECT @@ -115,6 +116,12 @@ public: void setRequestInterceptor(QWebEngineUrlRequestInterceptor *interceptor); + const QWebEngineUrlSchemeHandler *urlSchemeHandler(const QByteArray &) const; + void installUrlSchemeHandler(const QByteArray &scheme, QWebEngineUrlSchemeHandler *); + void removeUrlScheme(const QByteArray &scheme); + void removeUrlSchemeHandler(QWebEngineUrlSchemeHandler *); + void removeAllUrlSchemeHandlers(); + static QQuickWebEngineProfile *defaultProfile(); Q_SIGNALS: @@ -131,6 +138,9 @@ Q_SIGNALS: void downloadRequested(QQuickWebEngineDownloadItem *download); void downloadFinished(QQuickWebEngineDownloadItem *download); +private Q_SLOTS: + void destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler *obj); + private: Q_DECLARE_PRIVATE(QQuickWebEngineProfile) QQuickWebEngineProfile(QQuickWebEngineProfilePrivate *, QObject *parent = 0); -- cgit v1.2.3