From 9758fd0453a7104b48d3c70246b3f9c63d003ad8 Mon Sep 17 00:00:00 2001 From: Pierre Rossi Date: Tue, 18 Mar 2014 21:15:07 +0100 Subject: Add a feature permission bar to the demo browser Change-Id: Ib2deac6099c37f1e112821fb3398586269e05f22 Reviewed-by: Zeno Albisser --- examples/webenginewidgets/browser/browser.pro | 2 + .../browser/featurepermissionbar.cpp | 120 +++++++++++++++++++++ .../browser/featurepermissionbar.h | 73 +++++++++++++ examples/webenginewidgets/browser/webview.cpp | 13 +++ examples/webenginewidgets/browser/webview.h | 1 + 5 files changed, 209 insertions(+) create mode 100644 examples/webenginewidgets/browser/featurepermissionbar.cpp create mode 100644 examples/webenginewidgets/browser/featurepermissionbar.h (limited to 'examples/webenginewidgets') diff --git a/examples/webenginewidgets/browser/browser.pro b/examples/webenginewidgets/browser/browser.pro index b40c745b8..c9bf1a9e0 100644 --- a/examples/webenginewidgets/browser/browser.pro +++ b/examples/webenginewidgets/browser/browser.pro @@ -28,6 +28,7 @@ HEADERS += \ downloadmanager.h \ edittableview.h \ edittreeview.h \ + featurepermissionbar.h\ history.h \ modelmenu.h \ searchlineedit.h \ @@ -48,6 +49,7 @@ SOURCES += \ downloadmanager.cpp \ edittableview.cpp \ edittreeview.cpp \ + featurepermissionbar.cpp\ history.cpp \ modelmenu.cpp \ searchlineedit.cpp \ diff --git a/examples/webenginewidgets/browser/featurepermissionbar.cpp b/examples/webenginewidgets/browser/featurepermissionbar.cpp new file mode 100644 index 000000000..2cc9907bd --- /dev/null +++ b/examples/webenginewidgets/browser/featurepermissionbar.cpp @@ -0,0 +1,120 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the demonstration applications 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "featurepermissionbar.h" + +#include +#include +#include +#include +#include + +static const int defaultHeight = 30; + +static QString textForPermissionType(QWebEnginePage::Feature type) +{ + switch (type) { + case QWebEnginePage::Notifications: + return QObject::tr("desktop notifications"); + case QWebEnginePage::Geolocation: + return QObject::tr("your position"); + case QWebEnginePage::MediaAudioDevices: + return QObject::tr("your microphone"); + case QWebEnginePage::MediaVideoDevices: + return QObject::tr("your camera"); + case QWebEnginePage::MediaAudioVideoDevices: + return QObject::tr("your camera and microphone"); + default: + Q_UNREACHABLE(); + } + return QString(); +} + +FeaturePermissionBar::FeaturePermissionBar(QWidget *view) + : QWidget(view) + , m_messageLabel(new QLabel(this)) +{ + setAutoFillBackground(true); + QHBoxLayout *l = new QHBoxLayout; + setLayout(l); + l->setContentsMargins(defaultHeight, 0, 0, 0); + l->addWidget(m_messageLabel); + l->addStretch(); + QPushButton *allowButton = new QPushButton(tr("Allow"), this); + QPushButton *denyButton = new QPushButton(tr("Deny"), this); + connect(allowButton, &QPushButton::clicked, this, &FeaturePermissionBar::permissionGranted); + connect(denyButton, &QPushButton::clicked, this, &FeaturePermissionBar::permissionDenied); + QPushButton *discardButton = new QPushButton(QIcon(QStringLiteral(":closetab.png")), QString(), this); + connect(discardButton, &QPushButton::clicked, this, &QObject::deleteLater); + connect(allowButton, &QPushButton::clicked, this, &QObject::deleteLater); + connect(denyButton, &QPushButton::clicked, this, &QObject::deleteLater); + l->addWidget(denyButton); + l->addWidget(allowButton); + l->addWidget(discardButton); + setGeometry(0, -defaultHeight, view->width(), defaultHeight); +} + +void FeaturePermissionBar::requestPermission(const QUrl &securityOrigin, QWebEnginePage::Feature feature) +{ + m_securityOrigin = securityOrigin; + m_feature = feature; + m_messageLabel->setText(tr("%1 wants to use %2.").arg(securityOrigin.host()).arg(textForPermissionType(feature))); + show(); + // Ease in + QPropertyAnimation *animation = new QPropertyAnimation(this); + animation->setTargetObject(this); + animation->setPropertyName(QByteArrayLiteral("pos")); + animation->setDuration(300); + animation->setStartValue(QVariant::fromValue(pos())); + animation->setEndValue(QVariant::fromValue(QPoint(0,0))); + animation->setEasingCurve(QEasingCurve::InOutQuad); + animation->start(QPropertyAnimation::DeleteWhenStopped); +} + +void FeaturePermissionBar::permissionDenied() +{ + emit featurePermissionProvided(m_securityOrigin, m_feature, QWebEnginePage::PermissionDeniedByUser); +} + +void FeaturePermissionBar::permissionGranted() +{ + emit featurePermissionProvided(m_securityOrigin, m_feature, QWebEnginePage::PermissionGrantedByUser); +} diff --git a/examples/webenginewidgets/browser/featurepermissionbar.h b/examples/webenginewidgets/browser/featurepermissionbar.h new file mode 100644 index 000000000..92ca04773 --- /dev/null +++ b/examples/webenginewidgets/browser/featurepermissionbar.h @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef FEATUREPERMISSIONBAR_H +#define FEATUREPERMISSIONBAR_H + +#include +#include + +QT_BEGIN_NAMESPACE +class QLabel; +class QPushButton; +QT_END_NAMESPACE + +class FeaturePermissionBar : public QWidget { +Q_OBJECT + +public: + FeaturePermissionBar(QWidget*); + void requestPermission(const QUrl &, QWebEnginePage::Feature feature); + +signals: + void featurePermissionProvided(const QUrl &securityOrigin, QWebEnginePage::Feature, QWebEnginePage::PermissionPolicy); + +private slots: + void permissionDenied(); + void permissionGranted(); + +private: + QWebEnginePage::Feature m_feature; + QLabel *m_messageLabel; + QUrl m_securityOrigin; +}; + +#endif // FEATUREPERMISSIONBAR_H diff --git a/examples/webenginewidgets/browser/webview.cpp b/examples/webenginewidgets/browser/webview.cpp index bc2a4d906..edbaadca9 100644 --- a/examples/webenginewidgets/browser/webview.cpp +++ b/examples/webenginewidgets/browser/webview.cpp @@ -43,6 +43,7 @@ #include "browsermainwindow.h" #include "cookiejar.h" #include "downloadmanager.h" +#include "featurepermissionbar.h" #include "networkaccessmanager.h" #include "ui_passworddialog.h" #include "ui_proxy.h" @@ -326,6 +327,7 @@ WebView::WebView(QWidget* parent) connect(page(), SIGNAL(downloadRequested(QNetworkRequest)), this, SLOT(downloadRequested(QNetworkRequest))); #endif + connect(page(), &WebPage::featurePermissionRequested, this, &WebView::onFeaturePermissionRequested); #if defined(QWEBENGINEPAGE_UNSUPPORTEDCONTENT) page()->setForwardUnsupportedContent(true); #endif @@ -376,6 +378,17 @@ void WebView::openLinkInNewTab() #endif } +void WebView::onFeaturePermissionRequested(const QUrl &securityOrigin, QWebEnginePage::Feature feature) +{ + FeaturePermissionBar *permissionBar = new FeaturePermissionBar(this); + connect(permissionBar, &FeaturePermissionBar::featurePermissionProvided, page(), &QWebEnginePage::setFeaturePermission); + + // Discard the bar on new loads (if we navigate away or reload). + connect(page(), &QWebEnginePage::loadStarted, permissionBar, &QObject::deleteLater); + + permissionBar->requestPermission(securityOrigin, feature); +} + void WebView::setProgress(int progress) { m_progress = progress; diff --git a/examples/webenginewidgets/browser/webview.h b/examples/webenginewidgets/browser/webview.h index 1fb64c8b2..aaf2aab13 100644 --- a/examples/webenginewidgets/browser/webview.h +++ b/examples/webenginewidgets/browser/webview.h @@ -114,6 +114,7 @@ private slots: void setStatusBarText(const QString &string); void downloadRequested(const QNetworkRequest &request); void openLinkInNewTab(); + void onFeaturePermissionRequested(const QUrl &securityOrigin, QWebEnginePage::Feature); private: QString m_statusBarText; -- cgit v1.2.3