diff options
author | Michal Klocek <michal.klocek@qt.io> | 2022-12-19 15:50:13 +0100 |
---|---|---|
committer | Michal Klocek <michal.klocek@qt.io> | 2022-12-22 14:30:46 +0100 |
commit | 9907b4cbadfb3104f5617724f10e19e910c61e2e (patch) | |
tree | eebb0c173b42627310d3f1c5704b9eb971cd0003 /examples | |
parent | ef9de55d78b5acd3b12d4a967c5822008179ac3b (diff) | |
download | qtwebengine-9907b4cbadfb3104f5617724f10e19e910c61e2e.tar.gz |
Update push example after setPushServiceEndpoint change
We have now extra call to enable push messaging, therefore
drop usage of simple browser in example and use
the same code as in Notification Example but add new settings
and fix profile to be not off-the-record.
Task-number: QTBUG-107442
Pick-to: 6.5
Change-Id: I3069c4cf2b6a6ce864c1e4c578ab03adb67984e4
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
Diffstat (limited to 'examples')
7 files changed, 204 insertions, 7 deletions
diff --git a/examples/webenginewidgets/push-notifications/CMakeLists.txt b/examples/webenginewidgets/push-notifications/CMakeLists.txt index bbb585c9b..8ea2e25d1 100644 --- a/examples/webenginewidgets/push-notifications/CMakeLists.txt +++ b/examples/webenginewidgets/push-notifications/CMakeLists.txt @@ -2,6 +2,45 @@ # SPDX-License-Identifier: BSD-3-Clause cmake_minimum_required(VERSION 3.16) -project(simplebrowser LANGUAGES CXX) +project(notifications LANGUAGES CXX) -message("\nPlease use simplebrowser to see notifiactions.\n") +set(CMAKE_AUTOMOC ON) + +if(NOT DEFINED INSTALL_EXAMPLESDIR) + set(INSTALL_EXAMPLESDIR "examples") +endif() + +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/webenginewidgets/push-notifications") + +find_package(Qt6 REQUIRED COMPONENTS Core Gui WebEngineWidgets) + +qt_add_executable(push-notifications + main.cpp + notificationpopup.h +) + +set_target_properties(push-notifications PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE +) + +target_link_libraries(push-notifications PUBLIC + Qt::Core + Qt::Gui + Qt::WebEngineWidgets +) + +qt_add_resources(push-notifications "data" + PREFIX + "/" + BASE + "data" + FILES + "data/icon.png" +) + +install(TARGETS push-notifications + RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" + LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" +) diff --git a/examples/webenginewidgets/push-notifications/data/data.qrc b/examples/webenginewidgets/push-notifications/data/data.qrc new file mode 100644 index 000000000..619648d1b --- /dev/null +++ b/examples/webenginewidgets/push-notifications/data/data.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file>icon.png</file> + </qresource> +</RCC> diff --git a/examples/webenginewidgets/push-notifications/data/icon.png b/examples/webenginewidgets/push-notifications/data/icon.png Binary files differnew file mode 100644 index 000000000..4c3870c06 --- /dev/null +++ b/examples/webenginewidgets/push-notifications/data/icon.png diff --git a/examples/webenginewidgets/push-notifications/doc/src/push-notifications.qdoc b/examples/webenginewidgets/push-notifications/doc/src/push-notifications.qdoc index 90b5212c8..2f234c1e0 100644 --- a/examples/webenginewidgets/push-notifications/doc/src/push-notifications.qdoc +++ b/examples/webenginewidgets/push-notifications/doc/src/push-notifications.qdoc @@ -172,12 +172,24 @@ To do that, we can simply enter in the console in the project's root directory: \snippet /push-notifications/commands 3 -Now we can fire up \e simplebrowser and enter \c http:\\localhost:5000 as a URL. +Now we can look into the \e push-notification browser application, which is based on +\l {WebEngine Notifications Example}: -\image website.png +\quotefromfile webenginewidgets/push-notifications/main.cpp +\skipto main +\printuntil app.exec +\printuntil } + +This application simply opens the page at \c http:\\localhost:5000. We are not going into detail +about how to open a notification as it is documented \l {WebEngine Notifications Example}{here}. +However, you need to modify the application in two ways. First, \c QWebEngineProfile cannot be +set to \e off-the-record because push messaging would be disabled. Therefore, as you can see +above, \c QWebEngineProfile is initialized with the name. Second, you need to enable push +messaging with the call QWebEngineProfile::setPushServiceEnabled for the created \c profile. -\note \c QWebEngineProfile cannot be set to \e off-the-record, because push messages would be -disabled. +When the application runs it displays: + +\image website.png After granting the permission we can send our ping request: @@ -187,5 +199,4 @@ We should see the coming push notification: \image notification.png -\note To troubleshoot errors, open \e {Developer Tools} from Tools menu. */ diff --git a/examples/webenginewidgets/push-notifications/main.cpp b/examples/webenginewidgets/push-notifications/main.cpp new file mode 100644 index 000000000..18a862182 --- /dev/null +++ b/examples/webenginewidgets/push-notifications/main.cpp @@ -0,0 +1,41 @@ +// Copyright (C) 2019 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "notificationpopup.h" + +#include <QApplication> +#include <QWebEngineProfile> +#include <QWebEnginePage> +#include <QWebEngineView> + +int main(int argc, char *argv[]) +{ + QCoreApplication::setOrganizationName("QtExamples"); + QApplication app(argc, argv); + + const QString name = + QString::fromLatin1("push-notifications.%1").arg(qWebEngineChromiumVersion()); + + QScopedPointer<QWebEngineProfile> profile(new QWebEngineProfile(name)); + QWebEngineView view(profile.data()); + auto popup = new NotificationPopup(&view); + + QObject::connect(view.page(), &QWebEnginePage::featurePermissionRequested, + [&](const QUrl &origin, QWebEnginePage::Feature feature) { + if (feature != QWebEnginePage::Notifications) + return; + + view.page()->setFeaturePermission(origin, feature, + QWebEnginePage::PermissionGrantedByUser); + }); + + profile->setPushServiceEnabled(true); + profile->setNotificationPresenter([&](std::unique_ptr<QWebEngineNotification> notification) { + popup->present(notification); + }); + + view.resize(640, 480); + view.setUrl(QUrl("http://localhost:5000")); + view.show(); + return app.exec(); +} diff --git a/examples/webenginewidgets/push-notifications/notificationpopup.h b/examples/webenginewidgets/push-notifications/notificationpopup.h new file mode 100644 index 000000000..cf53ded45 --- /dev/null +++ b/examples/webenginewidgets/push-notifications/notificationpopup.h @@ -0,0 +1,91 @@ +// Copyright (C) 2019 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#pragma once + +#include <QHBoxLayout> +#include <QLabel> +#include <QMouseEvent> +#include <QPushButton> +#include <QSpacerItem> +#include <QTimer> +#include <QVBoxLayout> +#include <QWebEngineNotification> + +#include <memory> + +class NotificationPopup : public QWidget +{ + Q_OBJECT + + QLabel m_icon, m_title, m_message; + std::unique_ptr<QWebEngineNotification> notification; + +public: + NotificationPopup(QWidget *parent) : QWidget(parent) + { + setWindowFlags(Qt::ToolTip); + auto rootLayout = new QHBoxLayout(this); + + rootLayout->addWidget(&m_icon); + + auto bodyLayout = new QVBoxLayout; + rootLayout->addLayout(bodyLayout); + + auto titleLayout = new QHBoxLayout; + bodyLayout->addLayout(titleLayout); + + titleLayout->addWidget(&m_title); + titleLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding)); + + auto close = new QPushButton(tr("Close")); + titleLayout->addWidget(close); + connect(close, &QPushButton::clicked, this, &NotificationPopup::onClosed); + + bodyLayout->addWidget(&m_message); + adjustSize(); + } + + void present(std::unique_ptr<QWebEngineNotification> &newNotification) + { + if (notification) { + notification->close(); + notification.reset(); + } + + notification.swap(newNotification); + + m_title.setText("<b>" + notification->title() + "</b>"); + m_message.setText(notification->message()); + m_icon.setPixmap(QPixmap(":/icon.png").scaledToHeight(m_icon.height())); + + show(); + notification->show(); + + connect(notification.get(), &QWebEngineNotification::closed, this, + &NotificationPopup::onClosed); + QTimer::singleShot(10000, notification.get(), [&]() { onClosed(); }); + + // position our popup in the right corner of its parent widget + move(parentWidget()->mapToGlobal(parentWidget()->rect().bottomRight() + - QPoint(width() + 10, height() + 10))); + } + +protected slots: + void onClosed() + { + hide(); + notification->close(); + notification.reset(); + } + +protected: + void mouseReleaseEvent(QMouseEvent *event) override + { + QWidget::mouseReleaseEvent(event); + if (notification && event->button() == Qt::LeftButton) { + notification->click(); + onClosed(); + } + } +}; diff --git a/examples/webenginewidgets/push-notifications/push-notifications.pro b/examples/webenginewidgets/push-notifications/push-notifications.pro new file mode 100644 index 000000000..5ffb85fd7 --- /dev/null +++ b/examples/webenginewidgets/push-notifications/push-notifications.pro @@ -0,0 +1,10 @@ +QT += webenginewidgets + +HEADERS = notificationpopup.h + +SOURCES = main.cpp + +RESOURCES = data/data.qrc + +target.path = $$[QT_INSTALL_EXAMPLES]/webenginewidgets/push-notifications +INSTALLS += target |