summaryrefslogtreecommitdiffstats
path: root/src/webenginewidgets
diff options
context:
space:
mode:
authorKirill Burtsev <kirill.burtsev@qt.io>2019-01-31 13:08:21 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-02-06 15:18:18 +0000
commitf4ca67aa7f70f58d39ef8689ddd5910e215ed6cd (patch)
treeebb9937672b14c725de14fd7da6e3eeac269e861 /src/webenginewidgets
parent7aa06a1614b7ca6508d96ee2e8ef0f4c49038a6f (diff)
Web Notifications API
Implements API for end-user notifications. Co-authored by Allan Sandfeld Jensen [ChangeLog][Profile] Support for Web Notifications API for end-user notifications through QWebEngineNotification Task-number: QTBUG-50995 Fixes: QTBUG-51191 Change-Id: Icebaaa05275a713e801f1f8ecdaaec725fa264c8 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/webenginewidgets')
-rw-r--r--src/webenginewidgets/api/qwebenginenotificationpresenter.cpp101
-rw-r--r--src/webenginewidgets/api/qwebenginenotificationpresenter_p.h83
-rw-r--r--src/webenginewidgets/api/qwebenginepage.cpp10
-rw-r--r--src/webenginewidgets/api/qwebenginepage.h2
-rw-r--r--src/webenginewidgets/api/qwebenginepage_p.h1
-rw-r--r--src/webenginewidgets/api/qwebengineprofile.cpp30
-rw-r--r--src/webenginewidgets/api/qwebengineprofile.h6
-rw-r--r--src/webenginewidgets/api/qwebengineprofile_p.h6
-rw-r--r--src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc2
-rw-r--r--src/webenginewidgets/webenginewidgets.pro2
10 files changed, 241 insertions, 2 deletions
diff --git a/src/webenginewidgets/api/qwebenginenotificationpresenter.cpp b/src/webenginewidgets/api/qwebenginenotificationpresenter.cpp
new file mode 100644
index 000000000..c15a80373
--- /dev/null
+++ b/src/webenginewidgets/api/qwebenginenotificationpresenter.cpp
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwebenginenotificationpresenter_p.h"
+
+#include <QSystemTrayIcon>
+
+QT_BEGIN_NAMESPACE
+
+DefaultNotificationPresenter::DefaultNotificationPresenter(QObject *parent) : QObject(parent)
+{
+#ifndef QT_NO_SYSTEMTRAYICON
+ m_systemTrayIcon = new QSystemTrayIcon(this);
+ connect(m_systemTrayIcon, &QSystemTrayIcon::messageClicked, this, &DefaultNotificationPresenter::messageClicked);
+#endif
+}
+
+DefaultNotificationPresenter::~DefaultNotificationPresenter()
+{
+}
+
+void DefaultNotificationPresenter::show(const QWebEngineNotification &notification)
+{
+ if (!m_activeNotification.isNull())
+ m_activeNotification.close();
+ m_activeNotification = notification;
+#ifndef QT_NO_SYSTEMTRAYICON
+ if (m_systemTrayIcon) {
+ m_systemTrayIcon->show();
+ QIcon icon = notification.icon();
+ if (!icon.isNull())
+ m_systemTrayIcon->showMessage(notification.title(), notification.message(), icon);
+ else
+ m_systemTrayIcon->showMessage(notification.title(), notification.message());
+ notification.show();
+ connect(&m_activeNotification, &QWebEngineNotification::closed, this, &DefaultNotificationPresenter::closeNotification);
+ }
+#endif
+}
+
+void DefaultNotificationPresenter::messageClicked()
+{
+ if (!m_activeNotification.isNull())
+ m_activeNotification.click();
+}
+
+void DefaultNotificationPresenter::closeNotification()
+{
+#ifndef QT_NO_SYSTEMTRAYICON
+ const QWebEngineNotification *canceled = static_cast<const QWebEngineNotification *>(QObject::sender());
+ if (m_systemTrayIcon && canceled->matches(m_activeNotification))
+ m_systemTrayIcon->hide();
+#endif
+}
+
+void defaultNotificationPresenter(const QWebEngineNotification &notification)
+{
+ static DefaultNotificationPresenter *presenter = nullptr;
+ if (!presenter)
+ presenter = new DefaultNotificationPresenter();
+ presenter->show(notification);
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/webenginewidgets/api/qwebenginenotificationpresenter_p.h b/src/webenginewidgets/api/qwebenginenotificationpresenter_p.h
new file mode 100644
index 000000000..a66dbc1b2
--- /dev/null
+++ b/src/webenginewidgets/api/qwebenginenotificationpresenter_p.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWEBENGINENOTIFICATIONPRESENTER_P_H
+#define QWEBENGINENOTIFICATIONPRESENTER_P_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 <QtWebEngineCore/QWebEngineNotification>
+
+#include <QtCore/QObject>
+
+QT_BEGIN_NAMESPACE
+
+class QSystemTrayIcon;
+
+class DefaultNotificationPresenter : public QObject {
+ Q_OBJECT
+public:
+ DefaultNotificationPresenter(QObject *parent = nullptr);
+ virtual ~DefaultNotificationPresenter();
+
+ void show(const QWebEngineNotification &notification);
+
+private Q_SLOTS:
+ void messageClicked();
+ void closeNotification();
+
+private:
+ QSystemTrayIcon *m_systemTrayIcon;
+ QWebEngineNotification m_activeNotification;
+};
+
+void defaultNotificationPresenter(const QWebEngineNotification &notification);
+
+QT_END_NAMESPACE
+
+#endif // QWEBENGINENOTIFICATIONPRESENTER_P_H
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index 22ef8fffe..790d802f0 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -54,6 +54,7 @@
#include "qwebenginefullscreenrequest.h"
#include "qwebenginehistory.h"
#include "qwebenginehistory_p.h"
+#include "qwebenginenotification.h"
#include "qwebengineprofile.h"
#include "qwebengineprofile_p.h"
#include "qwebenginequotarequest.h"
@@ -62,6 +63,7 @@
#include "qwebenginesettings.h"
#include "qwebengineview.h"
#include "qwebengineview_p.h"
+#include "user_notification_controller.h"
#include "render_widget_host_view_qt_delegate_widget.h"
#include "web_contents_adapter.h"
#include "web_engine_settings.h"
@@ -538,6 +540,12 @@ void QWebEnginePagePrivate::runRegisterProtocolHandlerRequest(QWebEngineRegister
Q_EMIT q->registerProtocolHandlerRequested(request);
}
+void QWebEnginePagePrivate::runUserNotificationPermissionRequest(const QUrl &securityOrigin)
+{
+ Q_Q(QWebEnginePage);
+ Q_EMIT q->featurePermissionRequested(securityOrigin, QWebEnginePage::Notifications);
+}
+
QObject *QWebEnginePagePrivate::accessibilityParentObject()
{
return view;
@@ -1874,6 +1882,7 @@ void QWebEnginePage::setFeaturePermission(const QUrl &securityOrigin, QWebEngine
d->adapter->grantMouseLockPermission(true);
break;
case Notifications:
+ d->adapter->runUserNotificationRequestCallback(securityOrigin, true);
break;
}
} else { // if (policy == PermissionDeniedByUser)
@@ -1892,6 +1901,7 @@ void QWebEnginePage::setFeaturePermission(const QUrl &securityOrigin, QWebEngine
d->adapter->grantMouseLockPermission(false);
break;
case Notifications:
+ d->adapter->runUserNotificationRequestCallback(securityOrigin, false);
break;
}
}
diff --git a/src/webenginewidgets/api/qwebenginepage.h b/src/webenginewidgets/api/qwebenginepage.h
index 55450e438..4956877a9 100644
--- a/src/webenginewidgets/api/qwebenginepage.h
+++ b/src/webenginewidgets/api/qwebenginepage.h
@@ -185,9 +185,7 @@ public:
Q_ENUM(NavigationType)
enum Feature {
-#ifndef Q_QDOC
Notifications = 0,
-#endif
Geolocation = 1,
MediaAudioCapture = 2,
MediaVideoCapture,
diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h
index bf2f43f80..d597383e2 100644
--- a/src/webenginewidgets/api/qwebenginepage_p.h
+++ b/src/webenginewidgets/api/qwebenginepage_p.h
@@ -132,6 +132,7 @@ public:
void authenticationRequired(QSharedPointer<QtWebEngineCore::AuthenticationDialogController>) override;
void runMediaAccessPermissionRequest(const QUrl &securityOrigin, MediaRequestFlags requestFlags) override;
void runGeolocationPermissionRequest(const QUrl &securityOrigin) override;
+ void runUserNotificationPermissionRequest(const QUrl &securityOrigin) override;
void runMouseLockPermissionRequest(const QUrl &securityOrigin) override;
void runQuotaRequest(QWebEngineQuotaRequest) override;
void runRegisterProtocolHandlerRequest(QWebEngineRegisterProtocolHandlerRequest) override;
diff --git a/src/webenginewidgets/api/qwebengineprofile.cpp b/src/webenginewidgets/api/qwebengineprofile.cpp
index e9703ffe8..74dc14da0 100644
--- a/src/webenginewidgets/api/qwebengineprofile.cpp
+++ b/src/webenginewidgets/api/qwebengineprofile.cpp
@@ -43,6 +43,7 @@
#include "qwebenginecookiestore.h"
#include "qwebenginedownloaditem.h"
#include "qwebenginedownloaditem_p.h"
+#include "qwebenginenotificationpresenter_p.h"
#include "qwebenginepage.h"
#include "qwebenginepage_p.h"
#include "qwebenginesettings.h"
@@ -140,6 +141,12 @@ using QtWebEngineCore::ProfileAdapter;
Both session and persistent cookies are saved to and restored from disk.
*/
+void QWebEngineProfilePrivate::showNotification(QSharedPointer<QtWebEngineCore::UserNotificationController> &notification)
+{
+ if (m_notificationPresenter)
+ m_notificationPresenter(QWebEngineNotification(notification));
+}
+
/*!
\fn QWebEngineProfile::downloadRequested(QWebEngineDownloadItem *download)
@@ -634,6 +641,27 @@ QWebEngineScriptCollection *QWebEngineProfile::scripts() const
}
/*!
+ Sets the function \a notificationPresenter as responsible for presenting sent notifications.
+
+ \since 5.13
+ \sa QWebEngineNotification
+*/
+void QWebEngineProfile::setNotificationPresenter(const std::function<void(const QWebEngineNotification &)> &notificationPresenter)
+{
+ Q_D(QWebEngineProfile);
+ d->m_notificationPresenter = notificationPresenter;
+}
+
+/*!
+ \overload
+*/
+void QWebEngineProfile::setNotificationPresenter(std::function<void(const QWebEngineNotification &)> &&notificationPresenter)
+{
+ Q_D(QWebEngineProfile);
+ d->m_notificationPresenter = std::move(notificationPresenter);
+}
+
+/*!
Returns the default profile.
The default profile uses the storage name "Default".
@@ -645,6 +673,8 @@ QWebEngineProfile *QWebEngineProfile::defaultProfile()
static QWebEngineProfile* profile = new QWebEngineProfile(
new QWebEngineProfilePrivate(ProfileAdapter::createDefaultProfileAdapter()),
ProfileAdapter::globalQObjectRoot());
+ if (!profile->d_ptr->m_notificationPresenter)
+ profile->setNotificationPresenter(&defaultNotificationPresenter);
return profile;
}
diff --git a/src/webenginewidgets/api/qwebengineprofile.h b/src/webenginewidgets/api/qwebengineprofile.h
index 79e83c377..5ad999c00 100644
--- a/src/webenginewidgets/api/qwebengineprofile.h
+++ b/src/webenginewidgets/api/qwebengineprofile.h
@@ -46,12 +46,15 @@
#include <QtCore/qscopedpointer.h>
#include <QtCore/qstring.h>
+#include <functional>
+
QT_BEGIN_NAMESPACE
class QObject;
class QUrl;
class QWebEngineCookieStore;
class QWebEngineDownloadItem;
+class QWebEngineNotification;
class QWebEnginePage;
class QWebEnginePagePrivate;
class QWebEngineProfilePrivate;
@@ -137,6 +140,9 @@ public:
QString downloadPath() const;
void setDownloadPath(const QString &path);
+ void setNotificationPresenter(const std::function<void(const QWebEngineNotification &)> &notificationPresenter);
+ void setNotificationPresenter(std::function<void(const QWebEngineNotification &)> &&notificationPresenter);
+
static QWebEngineProfile *defaultProfile();
Q_SIGNALS:
diff --git a/src/webenginewidgets/api/qwebengineprofile_p.h b/src/webenginewidgets/api/qwebengineprofile_p.h
index 9ff8df849..3dd024ffd 100644
--- a/src/webenginewidgets/api/qwebengineprofile_p.h
+++ b/src/webenginewidgets/api/qwebengineprofile_p.h
@@ -60,6 +60,8 @@
#include <QScopedPointer>
#include <QSharedPointer>
+#include <functional>
+
namespace QtWebEngineCore {
class ProfileAdapter;
}
@@ -68,6 +70,7 @@ QT_BEGIN_NAMESPACE
class QWebEngineBrowserContext;
class QWebEngineProfilePrivate;
+class QWebEngineNotification;
class QWebEngineSettings;
class QWebEngineProfilePrivate : public QtWebEngineCore::ProfileAdapterClient {
@@ -84,12 +87,15 @@ public:
void downloadRequested(DownloadItemInfo &info) override;
void downloadUpdated(const DownloadItemInfo &info) override;
+ void showNotification(QSharedPointer<QtWebEngineCore::UserNotificationController> &) override;
+
private:
QWebEngineProfile *q_ptr;
QWebEngineSettings *m_settings;
QPointer<QtWebEngineCore::ProfileAdapter> m_profileAdapter;
QScopedPointer<QWebEngineScriptCollection> m_scriptCollection;
QMap<quint32, QPointer<QWebEngineDownloadItem> > m_ongoingDownloads;
+ std::function<void(const QWebEngineNotification &)> m_notificationPresenter;
};
QT_END_NAMESPACE
diff --git a/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc b/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc
index d012c678c..427668a11 100644
--- a/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc
+++ b/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc
@@ -285,6 +285,8 @@
This enum describes the platform feature access categories that the user may be asked to grant
or deny access to:
+ \value Notifications
+ Web notifications for the end-user.
\value Geolocation
Location hardware or service.
\value MediaAudioCapture
diff --git a/src/webenginewidgets/webenginewidgets.pro b/src/webenginewidgets/webenginewidgets.pro
index 4669c2bce..d4fb40dc7 100644
--- a/src/webenginewidgets/webenginewidgets.pro
+++ b/src/webenginewidgets/webenginewidgets.pro
@@ -19,6 +19,7 @@ SOURCES = \
api/qwebenginedownloaditem.cpp \
api/qwebenginefullscreenrequest.cpp \
api/qwebenginehistory.cpp \
+ api/qwebenginenotificationpresenter.cpp \
api/qwebenginepage.cpp \
api/qwebengineprofile.cpp \
api/qwebenginescript.cpp \
@@ -36,6 +37,7 @@ HEADERS = \
api/qwebenginedownloaditem_p.h \
api/qwebenginefullscreenrequest.h \
api/qwebenginehistory.h \
+ api/qwebenginenotificationpresenter_p.h \
api/qwebenginepage.h \
api/qwebenginepage_p.h \
api/qwebengineprofile.h \