From 227279bf2f22c740f3f2fdc34f1032d4177dc32a Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 28 May 2021 12:31:28 +0200 Subject: Move QQuickWebEngineNavigationRequest to Core Adds navigationRequested() to QWebEnginePage and exposes more information about navigation requests than the old acceptNavigationRequest() method. Change-Id: Ibb8d750bacd1060c3086ffe2c85336abd216bab0 Reviewed-by: Kirill Burtsev --- src/core/api/CMakeLists.txt | 1 + src/core/api/qwebenginenavigationrequest.cpp | 202 +++++++++++++++++++++++++++ src/core/api/qwebenginenavigationrequest.h | 102 ++++++++++++++ src/core/api/qwebenginepage.cpp | 19 +++ src/core/api/qwebenginepage.h | 3 + 5 files changed, 327 insertions(+) create mode 100644 src/core/api/qwebenginenavigationrequest.cpp create mode 100644 src/core/api/qwebenginenavigationrequest.h (limited to 'src/core/api') diff --git a/src/core/api/CMakeLists.txt b/src/core/api/CMakeLists.txt index 4074bdb51..f320cc803 100644 --- a/src/core/api/CMakeLists.txt +++ b/src/core/api/CMakeLists.txt @@ -26,6 +26,7 @@ qt_internal_add_module(WebEngineCore qwebenginehttprequest.cpp qwebenginehttprequest.h qwebengineloadrequest.cpp qwebengineloadrequest.h qwebenginemessagepumpscheduler.cpp qwebenginemessagepumpscheduler_p.h + qwebenginenavigationrequest.cpp qwebenginenavigationrequest.h qwebenginenewwindowrequest.cpp qwebenginenewwindowrequest.h qwebenginenotification.cpp qwebenginenotification.h qwebenginepage.cpp qwebenginepage.h qwebenginepage_p.h diff --git a/src/core/api/qwebenginenavigationrequest.cpp b/src/core/api/qwebenginenavigationrequest.cpp new file mode 100644 index 000000000..dac68bd72 --- /dev/null +++ b/src/core/api/qwebenginenavigationrequest.cpp @@ -0,0 +1,202 @@ +/**************************************************************************** +** +** Copyright (C) 2021 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 "qwebenginenavigationrequest.h" + +#include "qwebenginepage.h" + +QT_BEGIN_NAMESPACE + +class QWebEngineNavigationRequestPrivate { +public: + QWebEngineNavigationRequestPrivate(const QUrl& url, QWebEngineNavigationRequest::NavigationType navigationType, bool mainFrame) + : url(url) + , action(QWebEngineNavigationRequest::AcceptRequest) + , navigationType(navigationType) + , isMainFrame(mainFrame) + {} + + QUrl url; + QWebEngineNavigationRequest::NavigationRequestAction action; + QWebEngineNavigationRequest::NavigationType navigationType; + bool isMainFrame; +}; + +/*! + \class QWebEngineNavigationRequest + \brief A utility type for the QWebEnginePage::navigationRequested signal. + \since 6.2 + + \inmodule QtWebEngineCore + + Contains information about a navigation request. + + To accept or reject a request, set \l action to + \c QWebEngineNavigationRequest::AcceptRequest or + \c QWebEngineNavigationRequest::IgnoreRequest. + + The default if not handled is to accept the navigation. + + \sa QWebEnginePage::navigationRequested +*/ + +/*! + \qmltype WebEngineNavigationRequest + \instantiates QWebEngineNavigationRequest + \inqmlmodule QtWebEngine + \since QtWebEngine 1.0 + + \brief Represents a request for navigating to a web page as part of + \l{WebEngineView::navigationRequested()}. + + To accept or reject a request, set \l action to + \c WebEngineNavigationRequest.AcceptRequest or + \c WebEngineNavigationRequest.IgnoreRequest. +*/ + +/*! \internal +*/ +QWebEngineNavigationRequest::QWebEngineNavigationRequest(const QUrl& url, QWebEngineNavigationRequest::NavigationType navigationType, bool mainFrame, QObject* parent) + : QObject(parent) + , d_ptr(new QWebEngineNavigationRequestPrivate(url, navigationType, mainFrame)) +{ +} + +QWebEngineNavigationRequest::~QWebEngineNavigationRequest() +{ +} + +/*! + \property QWebEngineNavigationRequest::action + \brief Whether to accept or ignore the navigation request. +*/ +/*! + \qmlproperty enumeration WebEngineNavigationRequest::action + + Whether to accept or ignore the navigation request. + + \value WebEngineNavigationRequest.AcceptRequest + Accepts a navigation request. + \value WebEngineNavigationRequest.IgnoreRequest + Ignores a navigation request. +*/ + +void QWebEngineNavigationRequest::setAction(QWebEngineNavigationRequest::NavigationRequestAction action) +{ + Q_D(QWebEngineNavigationRequest); + if (d->action == action) + return; + + d->action = action; + emit actionChanged(); +} + +/*! + \property QWebEngineNavigationRequest::url + \brief The URL of the web page to go to. +*/ +/*! + \qmlproperty url WebEngineNavigationRequest::url + \readonly + + The URL of the web page to go to. +*/ + +QUrl QWebEngineNavigationRequest::url() const +{ + Q_D(const QWebEngineNavigationRequest); + return d->url; +} + +QWebEngineNavigationRequest::NavigationRequestAction QWebEngineNavigationRequest::action() const +{ + Q_D(const QWebEngineNavigationRequest); + return d->action; +} + +/*! + \property QWebEngineNavigationRequest::navigationType + \brief The method used to navigate to a web page. +*/ +/*! + \qmlproperty enumeration WebEngineNavigationRequest::navigationType + \readonly + + The method used to navigate to a web page. + + \value WebEngineNavigationRequest.LinkClickedNavigation + Clicking a link. + \value WebEngineNavigationRequest.TypedNavigation + Entering an URL on the address bar. + \value WebEngineNavigationRequest.FormSubmittedNavigation + Submitting a form. + \value WebEngineNavigationRequest.BackForwardNavigation + Using navigation history to go to the previous or next page. + \value WebEngineNavigationRequest.ReloadNavigation + Reloading the page. + \value WebEngineNavigationRequest.RedirectNavigation + Page content or server triggered a redirection or page refresh. + \value WebEngineNavigationRequest.OtherNavigation + Using some other method to go to a page. +*/ + +QWebEngineNavigationRequest::NavigationType QWebEngineNavigationRequest::navigationType() const +{ + Q_D(const QWebEngineNavigationRequest); + return d->navigationType; +} + +/*! + \property QWebEngineNavigationRequest::isMainFrame + \brief Whether the navigation issue is requested for a top level page. +*/ +/*! + \qmlproperty bool WebEngineNavigationRequest::isMainFrame + \readonly + + Whether the navigation issue is requested for a top level page. +*/ + +bool QWebEngineNavigationRequest::isMainFrame() const +{ + Q_D(const QWebEngineNavigationRequest); + return d->isMainFrame; +} + +QT_END_NAMESPACE diff --git a/src/core/api/qwebenginenavigationrequest.h b/src/core/api/qwebenginenavigationrequest.h new file mode 100644 index 000000000..45ed4fe6d --- /dev/null +++ b/src/core/api/qwebenginenavigationrequest.h @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2021 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 QWEBENGINENAVIGATIONREQUEST_H +#define QWEBENGINENAVIGATIONREQUEST_H + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QWebEngineNavigationRequestPrivate; + +class Q_WEBENGINECORE_EXPORT QWebEngineNavigationRequest : public QObject +{ + Q_OBJECT + Q_PROPERTY(QUrl url READ url CONSTANT FINAL) + Q_PROPERTY(bool isMainFrame READ isMainFrame CONSTANT FINAL) + Q_PROPERTY(NavigationRequestAction action READ action WRITE setAction NOTIFY actionChanged FINAL) + Q_PROPERTY(NavigationType navigationType READ navigationType CONSTANT FINAL) + +public: + ~QWebEngineNavigationRequest(); + + // must match WebContentsAdapterClient::NavigationRequestAction + enum NavigationRequestAction { + AcceptRequest, + IgnoreRequest = 0xFF + }; + Q_ENUM(NavigationRequestAction) + + // must match WebContentsAdapterClient::NavigationType + enum NavigationType { + LinkClickedNavigation, + TypedNavigation, + FormSubmittedNavigation, + BackForwardNavigation, + ReloadNavigation, + OtherNavigation, + RedirectNavigation, + }; + Q_ENUM(NavigationType) + + QUrl url() const; + bool isMainFrame() const; + NavigationType navigationType() const; + NavigationRequestAction action() const; + + void setAction(NavigationRequestAction action); + +Q_SIGNALS: + void actionChanged(); + +private: + QWebEngineNavigationRequest(const QUrl& url, NavigationType navigationType, bool mainFrame, QObject *parent = nullptr); + + Q_DECLARE_PRIVATE(QWebEngineNavigationRequest) + QScopedPointer d_ptr; + friend class QWebEnginePagePrivate; + friend class QQuickWebEngineViewPrivate; +}; + +QT_END_NAMESPACE + +#endif // QWEBENGINENAVIGATIONREQUEST_H diff --git a/src/core/api/qwebenginepage.cpp b/src/core/api/qwebenginepage.cpp index f04a0943c..6e2b37514 100644 --- a/src/core/api/qwebenginepage.cpp +++ b/src/core/api/qwebenginepage.cpp @@ -53,6 +53,7 @@ #include "qwebenginefullscreenrequest.h" #include "qwebenginehistory.h" #include "qwebenginehistory_p.h" +#include "qwebenginenavigationrequest.h" #include "qwebenginenewwindowrequest.h" #include "qwebenginenotification.h" #include "qwebengineprofile.h" @@ -1563,10 +1564,28 @@ void QWebEnginePagePrivate::contextMenuRequested(QWebEngineContextMenuRequest *d view->contextMenuRequested(data); } +/*! + \fn void QWebEnginePage::navigationRequested(QWebEngineNavigationRequest &request) + \since 6.2 + + This signal is emitted on navigation together with the call the acceptNavigationRequest(). + It can be used to accept or ignore the request. The default is to accept. + + \sa acceptNavigationRequest() + +*/ + void QWebEnginePagePrivate::navigationRequested(int navigationType, const QUrl &url, int &navigationRequestAction, bool isMainFrame) { Q_Q(QWebEnginePage); + bool accepted = q->acceptNavigationRequest(url, static_cast(navigationType), isMainFrame); + if (accepted) { + QWebEngineNavigationRequest navigationRequest(url, static_cast(navigationType), isMainFrame); + Q_EMIT q->navigationRequested(navigationRequest); + accepted = (navigationRequest.action() == QWebEngineNavigationRequest::AcceptRequest); + } + if (accepted && adapter->findTextHelper()->isFindTextInProgress()) adapter->findTextHelper()->stopFinding(); navigationRequestAction = accepted ? WebContentsAdapterClient::AcceptRequest : WebContentsAdapterClient::IgnoreRequest; diff --git a/src/core/api/qwebenginepage.h b/src/core/api/qwebenginepage.h index 94a78aa67..9b9e6a3d3 100644 --- a/src/core/api/qwebenginepage.h +++ b/src/core/api/qwebenginepage.h @@ -63,6 +63,7 @@ class QWebEngineClientCertificateSelection; class QWebEngineFindTextResult; class QWebEngineFullScreenRequest; class QWebEngineHistory; +class QWebEngineNavigationRequest; class QWebEngineNewWindowRequest; class QWebEnginePage; class QWebEnginePagePrivate; @@ -341,6 +342,7 @@ Q_SIGNALS: void renderProcessTerminated(RenderProcessTerminationStatus terminationStatus, int exitCode); void certificateError(const QWebEngineCertificateError &certificateError); + bool navigationRequested(QWebEngineNavigationRequest &request); void newWindowRequested(QWebEngineNewWindowRequest &request); // Ex-QWebFrame signals @@ -373,6 +375,7 @@ protected: virtual bool javaScriptPrompt(const QUrl &securityOrigin, const QString& msg, const QString& defaultValue, QString* result); virtual void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString& message, int lineNumber, const QString& sourceID); virtual bool acceptNavigationRequest(const QUrl &url, NavigationType type, bool isMainFrame); + private: Q_DISABLE_COPY(QWebEnginePage) Q_DECLARE_PRIVATE(QWebEnginePage) -- cgit v1.2.3