diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/api/core_api.pro | 7 | ||||
-rw-r--r-- | src/core/api/qwebenginecontextmenurequest.cpp | 296 | ||||
-rw-r--r-- | src/core/api/qwebenginecontextmenurequest.h | 168 | ||||
-rw-r--r-- | src/core/api/qwebenginecontextmenurequest_p.h | 93 | ||||
-rw-r--r-- | src/core/pref_service_adapter.h | 2 | ||||
-rw-r--r-- | src/core/render_view_context_menu_qt.cpp | 45 | ||||
-rw-r--r-- | src/core/render_view_context_menu_qt.h | 6 | ||||
-rw-r--r-- | src/core/web_contents_adapter.h | 1 | ||||
-rw-r--r-- | src/core/web_contents_adapter_client.h | 277 | ||||
-rw-r--r-- | src/core/web_contents_view_qt.cpp | 156 | ||||
-rw-r--r-- | src/core/web_contents_view_qt.h | 14 |
11 files changed, 691 insertions, 374 deletions
diff --git a/src/core/api/core_api.pro b/src/core/api/core_api.pro index c4ad5f643..0ee13f0b5 100644 --- a/src/core/api/core_api.pro +++ b/src/core/api/core_api.pro @@ -49,7 +49,9 @@ HEADERS = \ qwebengineurlrequestinfo_p.h \ qwebengineurlrequestjob.h \ qwebengineurlscheme.h \ - qwebengineurlschemehandler.h + qwebengineurlschemehandler.h \ + qwebenginecontextmenurequest.h \ + qwebenginecontextmenurequest_p.h SOURCES = \ qtwebenginecoreglobal.cpp \ @@ -64,7 +66,8 @@ SOURCES = \ qwebengineurlrequestinfo.cpp \ qwebengineurlrequestjob.cpp \ qwebengineurlscheme.cpp \ - qwebengineurlschemehandler.cpp + qwebengineurlschemehandler.cpp \ + qwebenginecontextmenurequest.cpp # Chromium headers included are not remotely clean CONFIG -= warning_clean diff --git a/src/core/api/qwebenginecontextmenurequest.cpp b/src/core/api/qwebenginecontextmenurequest.cpp new file mode 100644 index 000000000..88b775edd --- /dev/null +++ b/src/core/api/qwebenginecontextmenurequest.cpp @@ -0,0 +1,296 @@ +/**************************************************************************** +** +** Copyright (C) 2020 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 "qwebenginecontextmenurequest.h" +#include "qwebenginecontextmenurequest_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \class QWebEngineContextMenuRequest + \since 6.0 + \brief The QWebEngineContextMenuRequest class provides request for populating or extending a context menu with actions. + + \inmodule QtWebEngineCore + + QWebEngineContextMenuRequest is returned by QWebEngineView::lastContextMenuRequest() after a context menu event, + and contains information about where the context menu event took place. This is also in the context + in which any context specific QWebEnginePage::WebAction will be performed. +*/ + +/*! + \enum QWebEngineContextMenuRequest::MediaType + \readonly + \since 6.0 + + This enum describes the media type of the context menu request if any. + + \value MediaTypeNone The context is not a media type. + \value MediaTypeImage The context is an image element. + \value MediaTypeVideo The context is a video element. + \value MediaTypeAudio The context is an audio element. + \value MediaTypeCanvas The context is a canvas element. + \value MediaTypeFile The context is a file. + \value MediaTypePlugin The context is a plugin element. +*/ + +/*! + \enum QWebEngineContextMenuRequest::EditFlag + \readonly + \since 6.0 + + The available edit operations in the current context menu request. + + \value CanUndo Undo is available. + \value CanRedo Redo is available. + \value CanCut Cut is available. + \value CanCopy Copy is available. + \value CanPaste Paste is available. + \value CanDelete Delete is available. + \value CanSelectAll Select All is available. + \value CanTranslate Translate is available. + \value CanEditRichly Context is richly editable. +*/ + +/*! + \enum QWebEngineContextMenuRequest::MediaFlag + \readonly + \since 6.0 + + The current media element's status and its available operations. + \c MediaNone if the selected web page content is not a media element. + + \value MediaInError An error occurred. + \value MediaPaused Media is paused. + \value MediaMuted Media is muted. + \value MediaLoop Media can be looped. + \value MediaCanSave Media can be saved. + \value MediaHasAudio Media has audio. + \value MediaCanToggleControls Media can show controls. + \value MediaControls Media controls are shown. + \value MediaCanPrint Media is printable. + \value MediaCanRotate Media is rotatable. +*/ + +/*! + \internal +*/ +QWebEngineContextMenuRequest::QWebEngineContextMenuRequest( + QWebEngineContextMenuRequestPrivate *request) + : d(request) +{ +} + +/*! + Destroys the context menu request. +*/ +QWebEngineContextMenuRequest::~QWebEngineContextMenuRequest() = default; + +/*! + Returns the position of the context menu request, usually the mouse + position where the context menu event was triggered. +*/ +QPoint QWebEngineContextMenuRequest::position() const +{ + return d->m_position; +} + +/*! + Returns the selected text of the context menu request. +*/ +QString QWebEngineContextMenuRequest::selectedText() const +{ + return d->m_selectedText; +} + +/*! + Returns the text of a link if the context menu request was requested for a link. +*/ +QString QWebEngineContextMenuRequest::linkText() const +{ + return d->m_linkText; +} + +/*! + Returns the URL of a link if the menu context request is a link. + It is not guaranteed to be a valid URL. +*/ +QUrl QWebEngineContextMenuRequest::unfilteredLinkUrl() const +{ + return d->m_unfilteredLinkUrl; +} + +/*! + If the context menu request is a media element, returns the URL of that media. +*/ +QUrl QWebEngineContextMenuRequest::mediaUrl() const +{ + return d->m_mediaUrl; +} + +/*! + Returns the type of the media element or \c MediaTypeNone + if the context menu requestis not a media element. +*/ +QWebEngineContextMenuRequest::MediaType QWebEngineContextMenuRequest::mediaType() const +{ + return static_cast<QWebEngineContextMenuRequest::MediaType>(d->m_mediaType); +} + +/*! + Returns \c true if the context menu request is editable by the user; + otherwise returns \c false. +*/ +bool QWebEngineContextMenuRequest::isContentEditable() const +{ + return d->m_isEditable; +} + +/*! + If the menu context request is a word considered misspelled by the spell-checker, + returns the misspelled word. + + For possible replacements of the word, see spellCheckerSuggestions(). +*/ +QString QWebEngineContextMenuRequest::misspelledWord() const +{ + return d->m_misspelledWord; +} + + +/*! + If the menu context request is a word considered misspelled by the spell-checker, + returns a list of suggested replacements for misspelledWord(). +*/ +QStringList QWebEngineContextMenuRequest::spellCheckerSuggestions() const +{ + return d->m_spellCheckerSuggestions; +} + +/*! + TODO: needs api in page +*/ +bool QWebEngineContextMenuRequest::isAccepted() const +{ + return d->m_accepted; +} + +/*! + TODO: needs api in page +*/ +void QWebEngineContextMenuRequest::setAccepted(bool accepted) +{ + d->m_accepted = accepted; +} + +/*! + Returns the current media element's status and its available operations. + \c MediaNone if the selected web page content is not a media element. +*/ +QWebEngineContextMenuRequest::MediaFlags QWebEngineContextMenuRequest::mediaFlags() const +{ + return static_cast<QWebEngineContextMenuRequest::MediaFlags>(d->m_mediaFlags); +} + +/*! + Returns the available edit operations in the current context + or \c CanDoNone if no actions are available. +*/ +QWebEngineContextMenuRequest::EditFlags QWebEngineContextMenuRequest::editFlags() const +{ + return static_cast<QWebEngineContextMenuRequest::EditFlags>(d->m_editFlags); +} + +/*! + \internal +*/ +QUrl QWebEngineContextMenuRequest::filteredLinkUrl() const +{ + return d->m_filteredLinkUrl; +} + +/*! + \internal +*/ +QString QWebEngineContextMenuRequest::altText() const +{ + return d->m_altText; +} + +/*! + \internal +*/ +QString QWebEngineContextMenuRequest::titleText() const +{ + return d->m_titleText; +} + +/*! + \internal +*/ +QUrl QWebEngineContextMenuRequest::referrerUrl() const +{ + return !d->m_frameUrl.isEmpty() ? d->m_frameUrl : d->m_pageUrl; +} + +/*! + \internal +*/ +QtWebEngineCore::ReferrerPolicy QWebEngineContextMenuRequest::referrerPolicy() const +{ + return d->m_referrerPolicy; +} + +/*! + \internal +*/ +QString QWebEngineContextMenuRequest::suggestedFileName() const +{ + return d->m_suggestedFileName; +} + +/*! + \internal +*/ +bool QWebEngineContextMenuRequest::hasImageContent() const +{ + return d->m_hasImageContent; +} + +QT_END_NAMESPACE diff --git a/src/core/api/qwebenginecontextmenurequest.h b/src/core/api/qwebenginecontextmenurequest.h new file mode 100644 index 000000000..ef510b394 --- /dev/null +++ b/src/core/api/qwebenginecontextmenurequest.h @@ -0,0 +1,168 @@ +/**************************************************************************** +** +** Copyright (C) 2020 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 QWEBENGINECONTEXTMENUREQUEST_H +#define QWEBENGINECONTEXTMENUREQUEST_H + +#include <QtWebEngineCore/qtwebenginecoreglobal.h> +#include <QtCore/QObject> +#include <QtCore/QUrl> +#include <QtCore/QPoint> +#include <QScopedPointer> + +namespace QtWebEngineCore { +class RenderViewContextMenuQt; +class WebContentsViewQt; + +// Must match blink::WebReferrerPolicy +enum class ReferrerPolicy { + Always, + Default, + NoReferrerWhenDowngrade, + Never, + Origin, + OriginWhenCrossOrigin, + NoReferrerWhenDowngradeOriginWhenCrossOrigin, + SameOrigin, + StrictOrigin, + Last = StrictOrigin, +}; +} + +QT_BEGIN_NAMESPACE + +class QWebEngineContextMenuRequestPrivate; +class Q_WEBENGINECORE_EXPORT QWebEngineContextMenuRequest : public QObject +{ + Q_OBJECT +public: + enum MediaType { + MediaTypeNone, + MediaTypeImage, + MediaTypeVideo, + MediaTypeAudio, + MediaTypeCanvas, + MediaTypeFile, + MediaTypePlugin + }; + Q_ENUM(MediaType) + + // Must match QWebEngineCore::WebEngineContextMenuData::MediaFlags: + enum MediaFlag { + MediaInError = 0x1, + MediaPaused = 0x2, + MediaMuted = 0x4, + MediaLoop = 0x8, + MediaCanSave = 0x10, + MediaHasAudio = 0x20, + MediaCanToggleControls = 0x40, + MediaControls = 0x80, + MediaCanPrint = 0x100, + MediaCanRotate = 0x200, + }; + Q_DECLARE_FLAGS(MediaFlags, MediaFlag) + Q_FLAG(MediaFlags) + + // Must match QWebEngineCore::WebEngineContextMenuData::EditFlags: + enum EditFlag { + CanUndo = 0x1, + CanRedo = 0x2, + CanCut = 0x4, + CanCopy = 0x8, + CanPaste = 0x10, + CanDelete = 0x20, + CanSelectAll = 0x40, + CanTranslate = 0x80, + CanEditRichly = 0x100, + }; + Q_DECLARE_FLAGS(EditFlags, EditFlag) + Q_FLAG(EditFlags) + + Q_PROPERTY(QPoint position READ position CONSTANT FINAL) + Q_PROPERTY(QString selectedText READ selectedText CONSTANT FINAL) + Q_PROPERTY(QString linkText READ linkText CONSTANT FINAL) + Q_PROPERTY(QUrl linkUrl READ unfilteredLinkUrl CONSTANT FINAL) + Q_PROPERTY(QUrl mediaUrl READ mediaUrl CONSTANT FINAL) + Q_PROPERTY(MediaType mediaType READ mediaType CONSTANT FINAL) + Q_PROPERTY(bool isContentEditable READ isContentEditable CONSTANT FINAL) + Q_PROPERTY(QString misspelledWord READ misspelledWord CONSTANT FINAL) + Q_PROPERTY(QStringList spellCheckerSuggestions READ spellCheckerSuggestions CONSTANT FINAL) + Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted FINAL) + Q_PROPERTY(MediaFlags mediaFlags READ mediaFlags CONSTANT FINAL REVISION 1) + Q_PROPERTY(EditFlags editFlags READ editFlags CONSTANT FINAL REVISION 1) + + virtual ~QWebEngineContextMenuRequest(); + QPoint position() const; + QString selectedText() const; + QString linkText() const; + QUrl unfilteredLinkUrl() const; + QUrl mediaUrl() const; + MediaType mediaType() const; + bool isContentEditable() const; + QString misspelledWord() const; + QStringList spellCheckerSuggestions() const; + bool isAccepted() const; + void setAccepted(bool accepted); + MediaFlags mediaFlags() const; + EditFlags editFlags() const; + +private: + QUrl filteredLinkUrl() const; + QString altText() const; + QString titleText() const; + QUrl referrerUrl() const; + QtWebEngineCore::ReferrerPolicy referrerPolicy() const; + bool hasImageContent() const; + QString suggestedFileName() const; + +private: + QWebEngineContextMenuRequest(QWebEngineContextMenuRequestPrivate *d); + QScopedPointer<QWebEngineContextMenuRequestPrivate> d; + friend class QtWebEngineCore::WebContentsViewQt; + friend class QtWebEngineCore::RenderViewContextMenuQt; + friend class QQuickWebEngineViewPrivate; + friend class QQuickWebEngineView; + friend class ContextMenuRequestJSWrapper; + friend class QWebEngineViewPrivate; + friend class QWebEnginePage; +}; + +QT_END_NAMESPACE + +#endif // QWEBENGINECONTEXTMENUREQUEST_H diff --git a/src/core/api/qwebenginecontextmenurequest_p.h b/src/core/api/qwebenginecontextmenurequest_p.h new file mode 100644 index 000000000..c7b98a871 --- /dev/null +++ b/src/core/api/qwebenginecontextmenurequest_p.h @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 2020 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 QWEBENGINECONTEXTMENUREQUEST_P_H +#define QWEBENGINECONTEXTMENUREQUEST_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 "qtwebenginecoreglobal_p.h" +#include "qwebenginecontextmenurequest.h" +#include <QPoint> +#include <QUrl> + +QT_BEGIN_NAMESPACE + +class QWebEngineContextMenuRequestPrivate +{ +public: + bool m_accepted = false; + bool m_hasImageContent = false; + bool m_isEditable = false; + bool m_isSpellCheckerEnabled = false; + uint m_mediaType = 0; + uint m_mediaFlags = 0; + uint m_editFlags = 0; + QPoint m_position; + QUrl m_filteredLinkUrl; + QUrl m_unfilteredLinkUrl; + QUrl m_mediaUrl; + QString m_altText; + QString m_linkText; + QString m_titleText; + QString m_selectedText; + QString m_suggestedFileName; + QString m_misspelledWord; + QStringList m_spellCheckerSuggestions; + QUrl m_pageUrl; + QUrl m_frameUrl; + QtWebEngineCore::ReferrerPolicy m_referrerPolicy = QtWebEngineCore::ReferrerPolicy::Default; + // Some likely candidates for future additions as we add support for the related actions: + // bool isImageBlocked; + // <enum tbd> mediaType; + // ... +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/core/pref_service_adapter.h b/src/core/pref_service_adapter.h index 1c7c44a96..0092bd8a5 100644 --- a/src/core/pref_service_adapter.h +++ b/src/core/pref_service_adapter.h @@ -48,8 +48,6 @@ QT_BEGIN_NAMESPACE class QStringList; QT_END_NAMESPACE -class ProfileAdapter; - namespace QtWebEngineCore { class ProfileAdapter; diff --git a/src/core/render_view_context_menu_qt.cpp b/src/core/render_view_context_menu_qt.cpp index 8fdae498c..e5747f382 100644 --- a/src/core/render_view_context_menu_qt.cpp +++ b/src/core/render_view_context_menu_qt.cpp @@ -39,6 +39,7 @@ #include <QtCore/QCoreApplication> #include "render_view_context_menu_qt.h" +#include "qwebenginecontextmenurequest.h" namespace QtWebEngineCore { @@ -74,8 +75,8 @@ namespace QtWebEngineCore { return QCoreApplication::translate("RenderViewContextMenuQt", qUtf8Printable(names[menuItem])); } - RenderViewContextMenuQt::RenderViewContextMenuQt(const WebEngineContextMenuData &data) - : m_contextData(data) + RenderViewContextMenuQt::RenderViewContextMenuQt(QWebEngineContextMenuRequest *request) + : m_contextData(request) { } @@ -86,15 +87,17 @@ namespace QtWebEngineCore { appendSeparatorItem(); } - if (m_contextData.isEditable() && !m_contextData.spellCheckerSuggestions().isEmpty()) { + if (m_contextData->isContentEditable() + && !m_contextData->spellCheckerSuggestions().isEmpty()) { appendSpellingSuggestionItems(); appendSeparatorItem(); } - if (m_contextData.linkText().isEmpty() && !m_contextData.linkUrl().isValid() && !m_contextData.mediaUrl().isValid()) { - if (m_contextData.isEditable()) + if (m_contextData->linkText().isEmpty() && !m_contextData->filteredLinkUrl().isValid() + && !m_contextData->mediaUrl().isValid()) { + if (m_contextData->isContentEditable()) appendEditableItems(); - else if (!m_contextData.selectedText().isEmpty()) + else if (!m_contextData->selectedText().isEmpty()) appendCopyItem(); else appendPageItems(); @@ -102,27 +105,29 @@ namespace QtWebEngineCore { appendPageItems(); } - if (m_contextData.linkUrl().isValid() || !m_contextData.unfilteredLinkUrl().isEmpty() || !m_contextData.linkUrl().isEmpty()) + if (m_contextData->filteredLinkUrl().isValid() + || !m_contextData->unfilteredLinkUrl().isEmpty() + || !m_contextData->filteredLinkUrl().isEmpty()) appendLinkItems(); - if (m_contextData.mediaUrl().isValid()) { - switch (m_contextData.mediaType()) { - case WebEngineContextMenuData::MediaTypeImage: + if (m_contextData->mediaUrl().isValid()) { + switch (m_contextData->mediaType()) { + case QWebEngineContextMenuRequest::MediaTypeImage: appendSeparatorItem(); appendImageItems(); break; - case WebEngineContextMenuData::MediaTypeCanvas: + case QWebEngineContextMenuRequest::MediaTypeCanvas: Q_UNREACHABLE(); // mediaUrl is invalid for canvases break; - case WebEngineContextMenuData::MediaTypeAudio: - case WebEngineContextMenuData::MediaTypeVideo: + case QWebEngineContextMenuRequest::MediaTypeAudio: + case QWebEngineContextMenuRequest::MediaTypeVideo: appendSeparatorItem(); appendMediaItems(); break; default: break; } - } else if (m_contextData.mediaType() == WebEngineContextMenuData::MediaTypeCanvas) { + } else if (m_contextData->mediaType() == QWebEngineContextMenuRequest::MediaTypeCanvas) { appendSeparatorItem(); appendCanvasItems(); } @@ -160,7 +165,7 @@ namespace QtWebEngineCore { addMenuItem(RenderViewContextMenuQt::Cut); addMenuItem(RenderViewContextMenuQt::Copy); addMenuItem(RenderViewContextMenuQt::Paste); - if (m_contextData.misspelledWord().isEmpty()) { + if (m_contextData->misspelledWord().isEmpty()) { addMenuItem(RenderViewContextMenuQt::PasteAndMatchStyle); addMenuItem(RenderViewContextMenuQt::SelectAll); } @@ -190,7 +195,7 @@ namespace QtWebEngineCore { void RenderViewContextMenuQt::appendMediaItems() { addMenuItem(RenderViewContextMenuQt::ToggleMediaLoop); - if (m_contextData.mediaFlags() & QtWebEngineCore::WebEngineContextMenuData::MediaCanToggleControls) + if (m_contextData->mediaFlags() & QWebEngineContextMenuRequest::MediaCanToggleControls) addMenuItem(RenderViewContextMenuQt::ToggleMediaControls); addMenuItem(RenderViewContextMenuQt::DownloadMediaToDisk); addMenuItem(RenderViewContextMenuQt::CopyMediaUrlToClipboard); @@ -217,10 +222,8 @@ namespace QtWebEngineCore { bool RenderViewContextMenuQt::canViewSource() { - return m_contextData.linkText().isEmpty() - && !m_contextData.linkUrl().isValid() - && !m_contextData.mediaUrl().isValid() - && !m_contextData.isEditable() - && m_contextData.selectedText().isEmpty(); + return m_contextData->linkText().isEmpty() && !m_contextData->filteredLinkUrl().isValid() + && !m_contextData->mediaUrl().isValid() && !m_contextData->isContentEditable() + && m_contextData->selectedText().isEmpty(); } } diff --git a/src/core/render_view_context_menu_qt.h b/src/core/render_view_context_menu_qt.h index e1ee301fc..f818ce200 100644 --- a/src/core/render_view_context_menu_qt.h +++ b/src/core/render_view_context_menu_qt.h @@ -53,6 +53,8 @@ #include "web_contents_adapter_client.h" +QT_FORWARD_DECLARE_CLASS(QWebEngineContextMenuRequest) + namespace QtWebEngineCore { class Q_WEBENGINECORE_PRIVATE_EXPORT RenderViewContextMenuQt @@ -99,7 +101,7 @@ public: static const QString getMenuItemName(RenderViewContextMenuQt::ContextMenuItem menuItem); - RenderViewContextMenuQt(const WebEngineContextMenuData &data); + RenderViewContextMenuQt(QWebEngineContextMenuRequest *data); void initMenu(); protected: @@ -109,7 +111,7 @@ protected: virtual void addMenuItem(ContextMenuItem menuItem) = 0; virtual bool isMenuItemEnabled(ContextMenuItem menuItem) = 0; - const WebEngineContextMenuData &m_contextData; + QWebEngineContextMenuRequest *m_contextData; private: void appendCanvasItems(); diff --git a/src/core/web_contents_adapter.h b/src/core/web_contents_adapter.h index d833314f2..acf65f4d5 100644 --- a/src/core/web_contents_adapter.h +++ b/src/core/web_contents_adapter.h @@ -52,6 +52,7 @@ #define WEB_CONTENTS_ADAPTER_H #include "qtwebenginecoreglobal_p.h" +#include "qwebenginecontextmenurequest_p.h" #include "web_contents_adapter_client.h" #include <memory> #include <QtGui/qtgui-config.h> diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h index 78040cc8d..0c4a05a8b 100644 --- a/src/core/web_contents_adapter_client.h +++ b/src/core/web_contents_adapter_client.h @@ -57,7 +57,6 @@ #include <QFlags> #include <QRect> -#include <QSharedPointer> #include <QString> #include <QStringList> #include <QUrl> @@ -71,6 +70,7 @@ QT_FORWARD_DECLARE_CLASS(QWebEngineQuotaRequest) QT_FORWARD_DECLARE_CLASS(QWebEngineRegisterProtocolHandlerRequest) QT_FORWARD_DECLARE_CLASS(QWebEngineUrlRequestInfo) QT_FORWARD_DECLARE_CLASS(QWebEngineUrlRequestInterceptor) +QT_FORWARD_DECLARE_CLASS(QWebEngineContextMenuRequest) namespace content { struct DropData; @@ -91,279 +91,6 @@ class WebContentsAdapter; class WebContentsDelegateQt; class WebEngineSettings; -// Must match blink::WebReferrerPolicy -enum class ReferrerPolicy { - Always, - Default, - NoReferrerWhenDowngrade, - Never, - Origin, - OriginWhenCrossOrigin, - NoReferrerWhenDowngradeOriginWhenCrossOrigin, - SameOrigin, - StrictOrigin, - Last = StrictOrigin, -}; - -class WebEngineContextMenuSharedData : public QSharedData { - -public: - WebEngineContextMenuSharedData() - : hasImageContent(false) - , isEditable(false) - , isSpellCheckerEnabled(false) - , mediaType(0) - , mediaFlags(0) - , editFlags(0) - { - } - bool hasImageContent; - bool isEditable; - bool isSpellCheckerEnabled; - uint mediaType; - uint mediaFlags; - uint editFlags; - QPoint pos; - QUrl linkUrl; - QUrl unfilteredLinkUrl; - QUrl mediaUrl; - QString altText; - QString linkText; - QString titleText; - QString selectedText; - QString suggestedFileName; - QString misspelledWord; - QStringList spellCheckerSuggestions; - QUrl pageUrl; - QUrl frameUrl; - ReferrerPolicy referrerPolicy = ReferrerPolicy::Default; - // Some likely candidates for future additions as we add support for the related actions: - // bool isImageBlocked; - // <enum tbd> mediaType; - // ... -}; - -class WebEngineContextMenuData { -public: - // Must match blink::WebContextMenuData::MediaType: - enum MediaType { - // No special node is in context. - MediaTypeNone = 0x0, - // An image node is selected. - MediaTypeImage, - // A video node is selected. - MediaTypeVideo, - // An audio node is selected. - MediaTypeAudio, - // A canvas node is selected. - MediaTypeCanvas, - // A file node is selected. - MediaTypeFile, - // A plugin node is selected. - MediaTypePlugin, - MediaTypeLast = MediaTypePlugin - }; - // Must match blink::WebContextMenuData::MediaFlags: - enum MediaFlags { - MediaNone = 0x0, - MediaInError = 0x1, - MediaPaused = 0x2, - MediaMuted = 0x4, - MediaLoop = 0x8, - MediaCanSave = 0x10, - MediaHasAudio = 0x20, - MediaCanToggleControls = 0x40, - MediaControls = 0x80, - MediaCanPrint = 0x100, - MediaCanRotate = 0x200, - }; - - // Must match blink::WebContextMenuData::EditFlags: - enum EditFlags { - CanDoNone = 0x0, - CanUndo = 0x1, - CanRedo = 0x2, - CanCut = 0x4, - CanCopy = 0x8, - CanPaste = 0x10, - CanDelete = 0x20, - CanSelectAll = 0x40, - CanTranslate = 0x80, - CanEditRichly = 0x100, - }; - - WebEngineContextMenuData():d(new WebEngineContextMenuSharedData) { - } - - void setPosition(const QPoint &pos) { - d->pos = pos; - } - - QPoint position() const { - return d->pos; - } - - void setLinkUrl(const QUrl &url) { - d->linkUrl = url; - } - - QUrl linkUrl() const { - return d->linkUrl; - } - - void setUnfilteredLinkUrl(const QUrl &url) { - d->unfilteredLinkUrl = url; - } - - QUrl unfilteredLinkUrl() const { - return d->unfilteredLinkUrl; - } - - void setAltText(const QString &text) { - d->altText = text; - } - - QString altText() const { - return d->altText; - } - - void setLinkText(const QString &text) { - d->linkText = text; - } - - QString linkText() const { - return d->linkText; - } - - void setTitleText(const QString &text) { - d->titleText = text; - } - - QString titleText() const { - return d->titleText; - } - - void setSelectedText(const QString &text) { - d->selectedText = text; - } - - QString selectedText() const { - return d->selectedText; - } - - void setMediaUrl(const QUrl &url) { - d->mediaUrl = url; - } - - QUrl mediaUrl() const { - return d->mediaUrl; - } - - void setMediaType(MediaType type) { - d->mediaType = type; - } - - MediaType mediaType() const { - return MediaType(d->mediaType); - } - - void setHasImageContent(bool imageContent) { - d->hasImageContent = imageContent; - } - - bool hasImageContent() const { - return d->hasImageContent; - } - - void setMediaFlags(MediaFlags flags) { - d->mediaFlags = flags; - } - - MediaFlags mediaFlags() const { - return MediaFlags(d->mediaFlags); - } - - void setEditFlags(EditFlags flags) { - d->editFlags = flags; - } - - EditFlags editFlags() const { - return EditFlags(d->editFlags); - } - - void setSuggestedFileName(const QString &filename) { - d->suggestedFileName = filename; - } - - QString suggestedFileName() const { - return d->suggestedFileName; - } - - void setIsEditable(bool editable) { - d->isEditable = editable; - } - - bool isEditable() const { - return d->isEditable; - } - - void setIsSpellCheckerEnabled(bool spellCheckerEnabled) { - d->isSpellCheckerEnabled = spellCheckerEnabled; - } - - bool isSpellCheckerEnabled() const { - return d->isSpellCheckerEnabled; - } - - void setMisspelledWord(const QString &word) { - d->misspelledWord = word; - } - - QString misspelledWord() const { - return d->misspelledWord; - } - - void setSpellCheckerSuggestions(const QStringList &suggestions) { - d->spellCheckerSuggestions = suggestions; - } - - QStringList spellCheckerSuggestions() const { - return d->spellCheckerSuggestions; - } - - void setFrameUrl(const QUrl &url) { - d->frameUrl = url; - } - - QUrl frameUrl() const { - return d->frameUrl; - } - - void setPageUrl(const QUrl &url) { - d->pageUrl = url; - } - - QUrl pageUrl() const { - return d->pageUrl; - } - - QUrl referrerUrl() const { - return !d->frameUrl.isEmpty() ? d->frameUrl : d->pageUrl; - } - - void setReferrerPolicy(ReferrerPolicy referrerPolicy) { - d->referrerPolicy = referrerPolicy; - } - - ReferrerPolicy referrerPolicy() const { - return d->referrerPolicy; - } - -private: - QSharedDataPointer<WebEngineContextMenuSharedData> d; -}; - - class Q_WEBENGINECORE_PRIVATE_EXPORT WebContentsAdapterClient { public: // This must match window_open_disposition_list.h. @@ -476,7 +203,7 @@ public: virtual bool isBeingAdopted() = 0; virtual void close() = 0; virtual void windowCloseRejected() = 0; - virtual void contextMenuRequested(const WebEngineContextMenuData &) = 0; + virtual void contextMenuRequested(QWebEngineContextMenuRequest *request) = 0; virtual void navigationRequested(int navigationType, const QUrl &url, int &navigationRequestAction, bool isMainFrame) = 0; virtual void requestFullScreenMode(const QUrl &origin, bool fullscreen) = 0; virtual bool isFullScreenMode() const = 0; diff --git a/src/core/web_contents_view_qt.cpp b/src/core/web_contents_view_qt.cpp index d1c5012eb..7a42977fe 100644 --- a/src/core/web_contents_view_qt.cpp +++ b/src/core/web_contents_view_qt.cpp @@ -159,73 +159,85 @@ void WebContentsViewQt::FocusThroughTabTraversal(bool reverse) web_contents->GetRenderViewHost()->SetInitialFocus(reverse); } - -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaTypeNone, blink::ContextMenuDataMediaType::kNone) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaTypeImage, blink::ContextMenuDataMediaType::kImage) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaTypeVideo, blink::ContextMenuDataMediaType::kVideo) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaTypeAudio, blink::ContextMenuDataMediaType::kAudio) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaTypeCanvas, blink::ContextMenuDataMediaType::kCanvas) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaTypeFile, blink::ContextMenuDataMediaType::kFile) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaTypePlugin, blink::ContextMenuDataMediaType::kPlugin) - -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaNone, blink::WebContextMenuData::kMediaNone) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaInError, blink::WebContextMenuData::kMediaInError) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaPaused, blink::WebContextMenuData::kMediaPaused) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaMuted, blink::WebContextMenuData::kMediaMuted) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaLoop, blink::WebContextMenuData::kMediaLoop) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaCanSave, blink::WebContextMenuData::kMediaCanSave) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaHasAudio, blink::WebContextMenuData::kMediaHasAudio) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaCanToggleControls, blink::WebContextMenuData::kMediaCanToggleControls) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaControls, blink::WebContextMenuData::kMediaControls) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaCanPrint, blink::WebContextMenuData::kMediaCanPrint) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaCanRotate, blink::WebContextMenuData::kMediaCanRotate) - -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::CanDoNone, blink::kCanDoNone) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::CanUndo, blink::kCanUndo) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::CanRedo, blink::kCanRedo) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::CanCut, blink::kCanCut) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::CanCopy, blink::kCanCopy) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::CanPaste, blink::kCanPaste) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::CanDelete, blink::kCanDelete) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::CanSelectAll, blink::kCanSelectAll) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::CanTranslate, blink::kCanTranslate) -ASSERT_ENUMS_MATCH(WebEngineContextMenuData::CanEditRichly, blink::kCanEditRichly) - -static inline WebEngineContextMenuData fromParams(const content::ContextMenuParams ¶ms) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::MediaTypeNone, + blink::ContextMenuDataMediaType::kNone) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::MediaTypeImage, + blink::ContextMenuDataMediaType::kImage) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::MediaTypeVideo, + blink::ContextMenuDataMediaType::kVideo) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::MediaTypeAudio, + blink::ContextMenuDataMediaType::kAudio) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::MediaTypeCanvas, + blink::ContextMenuDataMediaType::kCanvas) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::MediaTypeFile, + blink::ContextMenuDataMediaType::kFile) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::MediaTypePlugin, + blink::ContextMenuDataMediaType::kPlugin) + +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::MediaInError, + blink::WebContextMenuData::kMediaInError) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::MediaPaused, + blink::WebContextMenuData::kMediaPaused) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::MediaMuted, blink::WebContextMenuData::kMediaMuted) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::MediaLoop, blink::WebContextMenuData::kMediaLoop) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::MediaCanSave, + blink::WebContextMenuData::kMediaCanSave) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::MediaHasAudio, + blink::WebContextMenuData::kMediaHasAudio) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::MediaCanToggleControls, + blink::WebContextMenuData::kMediaCanToggleControls) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::MediaControls, + blink::WebContextMenuData::kMediaControls) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::MediaCanPrint, + blink::WebContextMenuData::kMediaCanPrint) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::MediaCanRotate, + blink::WebContextMenuData::kMediaCanRotate) + +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::CanUndo, blink::kCanUndo) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::CanRedo, blink::kCanRedo) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::CanCut, blink::kCanCut) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::CanCopy, blink::kCanCopy) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::CanPaste, blink::kCanPaste) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::CanDelete, blink::kCanDelete) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::CanSelectAll, blink::kCanSelectAll) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::CanTranslate, blink::kCanTranslate) +ASSERT_ENUMS_MATCH(QWebEngineContextMenuRequest::CanEditRichly, blink::kCanEditRichly) + + +WebContentsViewQt::WebContentsViewQt(content::WebContents* webContents) +: m_webContents(webContents) + , m_client(nullptr) + , m_factoryClient(nullptr) + , m_contextMenuRequest( + new QWebEngineContextMenuRequest(new QWebEngineContextMenuRequestPrivate())) +{ } + + +void WebContentsViewQt::update(QWebEngineContextMenuRequest *request, + const content::ContextMenuParams ¶ms, bool spellcheckEnabled) { - WebEngineContextMenuData ret; - ret.setPosition(QPoint(params.x, params.y)); - ret.setLinkUrl(toQt(params.link_url)); - ret.setLinkText(toQt(params.link_text.data())); - ret.setAltText(toQt(params.alt_text.data())); - ret.setTitleText(toQt(params.title_text.data())); - ret.setUnfilteredLinkUrl(toQt(params.unfiltered_link_url)); - ret.setSelectedText(toQt(params.selection_text.data())); - ret.setMediaUrl(toQt(params.src_url)); - ret.setMediaType((WebEngineContextMenuData::MediaType)params.media_type); - ret.setHasImageContent(params.has_image_contents); - ret.setMediaFlags((WebEngineContextMenuData::MediaFlags)params.media_flags); - ret.setEditFlags((WebEngineContextMenuData::EditFlags)params.edit_flags); - ret.setSuggestedFileName(toQt(params.suggested_filename.data())); - ret.setIsEditable(params.is_editable); + auto *re = request->d.data(); + re->m_position = QPoint(params.x, params.y); + re->m_filteredLinkUrl = toQt(params.link_url); + re->m_linkText = toQt(params.link_text.data()); + re->m_altText = toQt(params.alt_text.data()); + re->m_titleText = toQt(params.title_text.data()); + re->m_unfilteredLinkUrl = toQt(params.unfiltered_link_url); + re->m_selectedText = toQt(params.selection_text.data()); + re->m_mediaUrl = toQt(params.src_url); + re->m_mediaType = (QWebEngineContextMenuRequest::MediaType)params.media_type; + re->m_hasImageContent = params.has_image_contents; + re->m_mediaFlags = (QWebEngineContextMenuRequest::MediaFlags)params.media_flags; + re->m_editFlags = (QWebEngineContextMenuRequest::EditFlags)params.edit_flags; + re->m_suggestedFileName = toQt(params.suggested_filename.data()); + re->m_isEditable = params.is_editable; #if QT_CONFIG(webengine_spellchecker) - ret.setMisspelledWord(toQt(params.misspelled_word)); - ret.setSpellCheckerSuggestions(fromVector(params.dictionary_suggestions)); + re->m_misspelledWord = toQt(params.misspelled_word); + re->m_spellCheckerSuggestions = fromVector(params.dictionary_suggestions); #endif - ret.setFrameUrl(toQt(params.frame_url)); - ret.setPageUrl(toQt(params.page_url)); - ret.setReferrerPolicy((ReferrerPolicy)params.referrer_policy); - return ret; -} - -void WebContentsViewQt::ShowContextMenu(content::RenderFrameHost *, const content::ContextMenuParams ¶ms) -{ - if (auto rwhv = static_cast<RenderWidgetHostViewQt *>(m_webContents->GetRenderWidgetHostView())) { - if (rwhv && rwhv->getTouchSelectionControllerClient()->handleContextMenu(params)) - return; - } - - WebEngineContextMenuData contextMenuData(fromParams(params)); + re->m_frameUrl = toQt(params.frame_url); + re->m_pageUrl = toQt(params.page_url); + re->m_referrerPolicy = (ReferrerPolicy)params.referrer_policy; #if QT_CONFIG(webengine_spellchecker) // Do not use params.spellcheck_enabled, since it is never // correctly initialized for chrome asynchronous spellchecking. @@ -234,9 +246,21 @@ void WebContentsViewQt::ShowContextMenu(content::RenderFrameHost *, const conten // must be initialized to true due to the way how the initialization sequence // in SpellCheck works ie. typing the first word triggers the creation // of the SpellcheckService. Use user preference store instead. - contextMenuData.setIsSpellCheckerEnabled(m_client->profileAdapter()->isSpellCheckEnabled()); + re->m_isSpellCheckerEnabled = spellcheckEnabled; #endif - m_client->contextMenuRequested(contextMenuData); +} + +void WebContentsViewQt::ShowContextMenu(content::RenderFrameHost *, + const content::ContextMenuParams ¶ms) +{ + if (auto rwhv = + static_cast<RenderWidgetHostViewQt *>(m_webContents->GetRenderWidgetHostView())) { + if (rwhv && rwhv->getTouchSelectionControllerClient()->handleContextMenu(params)) + return; + } + const bool spellcheckEnabled = m_client->profileAdapter()->isSpellCheckEnabled(); + update(m_contextMenuRequest.get(), params, spellcheckEnabled); + m_client->contextMenuRequested(m_contextMenuRequest.get()); } Qt::DropActions toQtDropActions(blink::WebDragOperationsMask ops) diff --git a/src/core/web_contents_view_qt.h b/src/core/web_contents_view_qt.h index 3dcb648bf..218bebf13 100644 --- a/src/core/web_contents_view_qt.h +++ b/src/core/web_contents_view_qt.h @@ -45,6 +45,8 @@ #include "api/qtwebenginecoreglobal_p.h" +QT_FORWARD_DECLARE_CLASS(QWebEngineContextMenuRequest) + namespace content { class WebContents; } @@ -59,12 +61,7 @@ class WebContentsViewQt public: static inline WebContentsViewQt *from(WebContentsView *view) { return static_cast<WebContentsViewQt*>(view); } - WebContentsViewQt(content::WebContents* webContents) - : m_webContents(webContents) - , m_client(nullptr) - , m_factoryClient(nullptr) - { } - + WebContentsViewQt(content::WebContents* webContents); void setFactoryClient(WebContentsAdapterClient* client); void setClient(WebContentsAdapterClient* client); WebContentsAdapterClient *client() { return m_client; } @@ -129,9 +126,14 @@ public: void TakeFocus(bool reverse) override; private: + static void update(QWebEngineContextMenuRequest *request, + const content::ContextMenuParams ¶ms, bool spellcheckEnabled); + +private: content::WebContents *m_webContents; WebContentsAdapterClient *m_client; WebContentsAdapterClient *m_factoryClient; + std::unique_ptr<QWebEngineContextMenuRequest> m_contextMenuRequest; }; } // namespace QtWebEngineCore |