diff options
Diffstat (limited to 'examples/webenginewidgets/simplebrowser/webview.cpp')
-rw-r--r-- | examples/webenginewidgets/simplebrowser/webview.cpp | 209 |
1 files changed, 145 insertions, 64 deletions
diff --git a/examples/webenginewidgets/simplebrowser/webview.cpp b/examples/webenginewidgets/simplebrowser/webview.cpp index 31be9f34c..08e044f70 100644 --- a/examples/webenginewidgets/simplebrowser/webview.cpp +++ b/examples/webenginewidgets/simplebrowser/webview.cpp @@ -1,52 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "browser.h" #include "browserwindow.h" @@ -56,6 +9,7 @@ #include "webview.h" #include "ui_certificateerrordialog.h" #include "ui_passworddialog.h" +#include "webauthdialog.h" #include <QContextMenuEvent> #include <QDebug> #include <QMenu> @@ -64,9 +18,10 @@ #include <QTimer> #include <QStyle> +using namespace Qt::StringLiterals; + WebView::WebView(QWidget *parent) : QWebEngineView(parent) - , m_loadProgress(100) { connect(this, &QWebEngineView::loadStarted, [this]() { m_loadProgress = 0; @@ -104,10 +59,18 @@ WebView::WebView(QWidget *parent) tr("Render process exited with code: %1\n" "Do you want to reload the page ?").arg(statusCode)); if (btn == QMessageBox::Yes) - QTimer::singleShot(0, [this] { reload(); }); + QTimer::singleShot(0, this, &WebView::reload); }); } +WebView::~WebView() +{ + if (m_imageAnimationGroup) + delete m_imageAnimationGroup; + + m_imageAnimationGroup = nullptr; +} + inline QString questionForFeature(QWebEnginePage::Feature feature) { switch (feature) { @@ -127,6 +90,8 @@ inline QString questionForFeature(QWebEnginePage::Feature feature) return QObject::tr("Allow %1 to capture audio and video of your desktop?"); case QWebEnginePage::Notifications: return QObject::tr("Allow %1 to show notification on your desktop?"); + case QWebEnginePage::ClipboardReadWrite: + return QObject::tr("Allow %1 to read from and write to the clipboard?"); } return QString(); } @@ -144,6 +109,12 @@ void WebView::setPage(WebPage *page) &WebView::handleProxyAuthenticationRequired); disconnect(oldPage, &QWebEnginePage::registerProtocolHandlerRequested, this, &WebView::handleRegisterProtocolHandlerRequested); + disconnect(oldPage, &QWebEnginePage::webAuthUxRequested, this, + &WebView::handleWebAuthUxRequested); +#if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) + disconnect(oldPage, &QWebEnginePage::fileSystemAccessRequested, this, + &WebView::handleFileSystemAccessRequested); +#endif } createWebActionTrigger(page,QWebEnginePage::Forward); createWebActionTrigger(page,QWebEnginePage::Back); @@ -159,6 +130,11 @@ void WebView::setPage(WebPage *page) &WebView::handleProxyAuthenticationRequired); connect(page, &QWebEnginePage::registerProtocolHandlerRequested, this, &WebView::handleRegisterProtocolHandlerRequested); +#if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) + connect(page, &QWebEnginePage::fileSystemAccessRequested, this, + &WebView::handleFileSystemAccessRequested); +#endif + connect(page, &QWebEnginePage::webAuthUxRequested, this, &WebView::handleWebAuthUxRequested); } int WebView::loadProgress() const @@ -186,15 +162,17 @@ QIcon WebView::favIcon() const return favIcon; if (m_loadProgress < 0) { - static QIcon errorIcon(QStringLiteral(":dialog-error.png")); + static QIcon errorIcon(u":dialog-error.png"_s); return errorIcon; - } else if (m_loadProgress < 100) { - static QIcon loadingIcon(QStringLiteral(":view-refresh.png")); + } + if (m_loadProgress < 100) { + static QIcon loadingIcon = QIcon::fromTheme(QIcon::ThemeIcon::ViewRefresh, + QIcon(":view-refresh.png"_L1)); return loadingIcon; - } else { - static QIcon defaultIcon(QStringLiteral(":text-html.png")); - return defaultIcon; } + + static QIcon defaultIcon(u":text-html.png"_s); + return defaultIcon; } QWebEngineView *WebView::createWindow(QWebEnginePage::WebWindowType type) @@ -232,15 +210,54 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) if (viewSource == actions.cend()) menu->addSeparator(); - QAction *action = new QAction(menu); - action->setText("Open inspector in new window"); + QAction *action = menu->addAction("Open inspector in new window"); connect(action, &QAction::triggered, [this]() { emit devToolsRequested(page()); }); - - QAction *before(inspectElement == actions.cend() ? nullptr : *inspectElement); - menu->insertAction(before, action); } else { (*inspectElement)->setText(tr("Inspect element")); } + + // add conext menu for image policy + QMenu *editImageAnimation = new QMenu(tr("Image animation policy")); + + m_imageAnimationGroup = new QActionGroup(editImageAnimation); + m_imageAnimationGroup->setExclusive(true); + + QAction *disableImageAnimation = + editImageAnimation->addAction(tr("Disable all image animation")); + disableImageAnimation->setCheckable(true); + m_imageAnimationGroup->addAction(disableImageAnimation); + connect(disableImageAnimation, &QAction::triggered, [this]() { + handleImageAnimationPolicyChange(QWebEngineSettings::DisallowImageAnimation); + }); + QAction *allowImageAnimationOnce = + editImageAnimation->addAction(tr("Allow animated images, but only once")); + allowImageAnimationOnce->setCheckable(true); + m_imageAnimationGroup->addAction(allowImageAnimationOnce); + connect(allowImageAnimationOnce, &QAction::triggered, + [this]() { handleImageAnimationPolicyChange(QWebEngineSettings::AnimateImageOnce); }); + QAction *allowImageAnimation = editImageAnimation->addAction(tr("Allow all animated images")); + allowImageAnimation->setCheckable(true); + m_imageAnimationGroup->addAction(allowImageAnimation); + connect(allowImageAnimation, &QAction::triggered, [this]() { + handleImageAnimationPolicyChange(QWebEngineSettings::AllowImageAnimation); + }); + + switch (page()->settings()->imageAnimationPolicy()) { + case QWebEngineSettings::AllowImageAnimation: + allowImageAnimation->setChecked(true); + break; + case QWebEngineSettings::AnimateImageOnce: + allowImageAnimationOnce->setChecked(true); + break; + case QWebEngineSettings::DisallowImageAnimation: + disableImageAnimation->setChecked(true); + break; + default: + allowImageAnimation->setChecked(true); + break; + } + + menu->addMenu(editImageAnimation); menu->popup(event->globalPos()); } @@ -278,8 +295,8 @@ void WebView::handleAuthenticationRequired(const QUrl &requestUrl, QAuthenticato passwordDialog.m_iconLabel->setPixmap(icon.pixmap(32, 32)); QString introMessage(tr("Enter username and password for \"%1\" at %2") - .arg(auth->realm()) - .arg(requestUrl.toString().toHtmlEscaped())); + .arg(auth->realm(), + requestUrl.toString().toHtmlEscaped())); passwordDialog.m_infoLabel->setText(introMessage); passwordDialog.m_infoLabel->setWordWrap(true); @@ -333,6 +350,32 @@ void WebView::handleProxyAuthenticationRequired(const QUrl &, QAuthenticator *au } } +void WebView::handleWebAuthUxRequested(QWebEngineWebAuthUxRequest *request) +{ + if (m_authDialog) + delete m_authDialog; + + m_authDialog = new WebAuthDialog(request, window()); + m_authDialog->setModal(false); + m_authDialog->setWindowFlags(m_authDialog->windowFlags() & ~Qt::WindowContextHelpButtonHint); + + connect(request, &QWebEngineWebAuthUxRequest::stateChanged, this, &WebView::onStateChanged); + m_authDialog->show(); +} + +void WebView::onStateChanged(QWebEngineWebAuthUxRequest::WebAuthUxState state) +{ + if (QWebEngineWebAuthUxRequest::WebAuthUxState::Completed == state + || QWebEngineWebAuthUxRequest::WebAuthUxState::Cancelled == state) { + if (m_authDialog) { + delete m_authDialog; + m_authDialog = nullptr; + } + } else { + m_authDialog->updateDisplay(); + } +} + //! [registerProtocolHandlerRequested] void WebView::handleRegisterProtocolHandlerRequested( QWebEngineRegisterProtocolHandlerRequest request) @@ -347,3 +390,41 @@ void WebView::handleRegisterProtocolHandlerRequested( request.reject(); } //! [registerProtocolHandlerRequested] + +#if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) +void WebView::handleFileSystemAccessRequested(QWebEngineFileSystemAccessRequest request) +{ + QString accessType; + switch (request.accessFlags()) { + case QWebEngineFileSystemAccessRequest::Read: + accessType = "read"; + break; + case QWebEngineFileSystemAccessRequest::Write: + accessType = "write"; + break; + case QWebEngineFileSystemAccessRequest::Read | QWebEngineFileSystemAccessRequest::Write: + accessType = "read and write"; + break; + default: + Q_UNREACHABLE(); + } + + auto answer = QMessageBox::question(window(), tr("File system access request"), + tr("Give %1 %2 access to %3?") + .arg(request.origin().host()) + .arg(accessType) + .arg(request.filePath().toString())); + if (answer == QMessageBox::Yes) + request.accept(); + else + request.reject(); +} + +void WebView::handleImageAnimationPolicyChange(QWebEngineSettings::ImageAnimationPolicy policy) +{ + if (!page()) + return; + + page()->settings()->setImageAnimationPolicy(policy); +} +#endif // QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) |