diff options
31 files changed, 1067 insertions, 1485 deletions
diff --git a/examples/webenginewidgets/spellchecker/webview.cpp b/examples/webenginewidgets/spellchecker/webview.cpp index ab0d2d1f7..b532dd417 100644 --- a/examples/webenginewidgets/spellchecker/webview.cpp +++ b/examples/webenginewidgets/spellchecker/webview.cpp @@ -52,7 +52,7 @@ #include <QContextMenuEvent> #include <QMenu> #include <QWebEngineProfile> -#include <QWebEngineContextMenuData> +#include <QWebEngineContextMenuRequest> WebView::WebView(QWidget *parent) : QWebEngineView(parent) @@ -66,10 +66,10 @@ WebView::WebView(QWidget *parent) void WebView::contextMenuEvent(QContextMenuEvent *event) { - const QWebEngineContextMenuData &data = contextMenuData(); - Q_ASSERT(data.isValid()); + QWebEngineContextMenuRequest *data = lastContextMenuRequest(); + Q_ASSERT(data); - if (!data.isContentEditable()) { + if (!data->isContentEditable()) { QWebEngineView::contextMenuEvent(event); return; } 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/webengine/api/qquickwebenginecontextmenurequest_p.h b/src/core/api/qwebenginecontextmenurequest.h index bc50eccb8..ef510b394 100644 --- a/src/webengine/api/qquickwebenginecontextmenurequest_p.h +++ b/src/core/api/qwebenginecontextmenurequest.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** 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. @@ -37,31 +37,39 @@ ** ****************************************************************************/ -#ifndef QQUICKWEBENGINECONTEXTMENUREQUEST_H -#define QQUICKWEBENGINECONTEXTMENUREQUEST_H +#ifndef QWEBENGINECONTEXTMENUREQUEST_H +#define QWEBENGINECONTEXTMENUREQUEST_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 <QtWebEngine/private/qtwebengineglobal_p.h> -#include <QtCore/QScopedPointer> +#include <QtWebEngineCore/qtwebenginecoreglobal.h> #include <QtCore/QObject> #include <QtCore/QUrl> +#include <QtCore/QPoint> +#include <QScopedPointer> namespace QtWebEngineCore { - class WebEngineContextMenuData; +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 Q_WEBENGINE_PRIVATE_EXPORT QQuickWebEngineContextMenuRequest: public QObject { +class QWebEngineContextMenuRequestPrivate; +class Q_WEBENGINECORE_EXPORT QWebEngineContextMenuRequest : public QObject +{ Q_OBJECT public: enum MediaType { @@ -106,11 +114,10 @@ public: Q_DECLARE_FLAGS(EditFlags, EditFlag) Q_FLAG(EditFlags) - Q_PROPERTY(int x READ x CONSTANT FINAL) - Q_PROPERTY(int y READ y CONSTANT FINAL) + 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 linkUrl 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) @@ -120,12 +127,11 @@ public: Q_PROPERTY(MediaFlags mediaFlags READ mediaFlags CONSTANT FINAL REVISION 1) Q_PROPERTY(EditFlags editFlags READ editFlags CONSTANT FINAL REVISION 1) - ~QQuickWebEngineContextMenuRequest(); - int x() const; - int y() const; + virtual ~QWebEngineContextMenuRequest(); + QPoint position() const; QString selectedText() const; QString linkText() const; - QUrl linkUrl() const; + QUrl unfilteredLinkUrl() const; QUrl mediaUrl() const; MediaType mediaType() const; bool isContentEditable() const; @@ -137,14 +143,26 @@ public: EditFlags editFlags() const; private: - QQuickWebEngineContextMenuRequest(const QtWebEngineCore::WebEngineContextMenuData &data, QObject *parent = nullptr); - QScopedPointer<QtWebEngineCore::WebEngineContextMenuData> m_data; - bool m_accepted; - friend class QQuickWebEngineView; + 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; - Q_DISABLE_COPY(QQuickWebEngineContextMenuRequest) + friend class QQuickWebEngineView; + friend class ContextMenuRequestJSWrapper; + friend class QWebEngineViewPrivate; + friend class QWebEnginePage; }; QT_END_NAMESPACE -#endif // QQUICKWEBENGINECONTEXTMENUREQUEST_H +#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 diff --git a/src/webengine/api/qquickwebenginecontextmenurequest.cpp b/src/webengine/api/qquickwebenginecontextmenurequest.cpp deleted file mode 100644 index e1ebd4c8c..000000000 --- a/src/webengine/api/qquickwebenginecontextmenurequest.cpp +++ /dev/null @@ -1,383 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 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 "qquickwebenginecontextmenurequest_p.h" -#include "web_contents_adapter_client.h" - -QT_BEGIN_NAMESPACE - -// Match MediaType enum -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypeNone, - QQuickWebEngineContextMenuRequest::MediaTypeNone) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypeImage, - QQuickWebEngineContextMenuRequest::MediaTypeImage) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypeAudio, - QQuickWebEngineContextMenuRequest::MediaTypeAudio) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypeVideo, - QQuickWebEngineContextMenuRequest::MediaTypeVideo) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypeCanvas, - QQuickWebEngineContextMenuRequest::MediaTypeCanvas) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypeFile, - QQuickWebEngineContextMenuRequest::MediaTypeFile) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypePlugin, - QQuickWebEngineContextMenuRequest::MediaTypePlugin) - -// Match MediaFlag enum -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaInError, - QQuickWebEngineContextMenuRequest::MediaInError) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaPaused, - QQuickWebEngineContextMenuRequest::MediaPaused) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaMuted, - QQuickWebEngineContextMenuRequest::MediaMuted) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaLoop, - QQuickWebEngineContextMenuRequest::MediaLoop) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaCanSave, - QQuickWebEngineContextMenuRequest::MediaCanSave) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaHasAudio, - QQuickWebEngineContextMenuRequest::MediaHasAudio) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaCanToggleControls, - QQuickWebEngineContextMenuRequest::MediaCanToggleControls) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaControls, - QQuickWebEngineContextMenuRequest::MediaControls) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaCanPrint, - QQuickWebEngineContextMenuRequest::MediaCanPrint) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaCanRotate, - QQuickWebEngineContextMenuRequest::MediaCanRotate) - -// Match EditFlag enum -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanUndo, - QQuickWebEngineContextMenuRequest::CanUndo) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanRedo, - QQuickWebEngineContextMenuRequest::CanRedo) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanCut, - QQuickWebEngineContextMenuRequest::CanCut) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanCopy, - QQuickWebEngineContextMenuRequest::CanCopy) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanPaste, - QQuickWebEngineContextMenuRequest::CanPaste) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanDelete, - QQuickWebEngineContextMenuRequest::CanDelete) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanSelectAll, - QQuickWebEngineContextMenuRequest::CanSelectAll) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanTranslate, - QQuickWebEngineContextMenuRequest::CanTranslate) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanEditRichly, - QQuickWebEngineContextMenuRequest::CanEditRichly) - -/*! - \qmltype ContextMenuRequest - \instantiates QQuickWebEngineContextMenuRequest - \inqmlmodule QtWebEngine - \since QtWebEngine 1.4 - - \brief A request for showing a context menu. - - A ContextMenuRequest is passed as an argument of the - WebEngineView::contextMenuRequested signal. It provides further - information about the context of the request. The position of the - request origin can be found via the \l x and \l y properties. - - The \l accepted property of the request indicates whether the request - is handled by the user code or the default context menu should - be displayed. - - The following code uses a custom menu to handle the request: - - \code - WebEngineView { - id: view - // ... - onContextMenuRequested: function(request) { - request.accepted = true; - myMenu.x = request.x; - myMenu.y = request.y; - myMenu.trigger.connect(view.triggerWebAction); - myMenu.popup(); - } - // ... - } - \endcode -*/ - -QQuickWebEngineContextMenuRequest::QQuickWebEngineContextMenuRequest( - const QtWebEngineCore::WebEngineContextMenuData &data, QObject *parent): - QObject(parent) - , m_data(new QtWebEngineCore::WebEngineContextMenuData(data)) - , m_accepted(false) -{ -} - -QQuickWebEngineContextMenuRequest::~QQuickWebEngineContextMenuRequest() -{ -} - -/*! - \qmlproperty int ContextMenuRequest::x - \readonly - - The x coordinate of the user action from where the context - menu request originates. -*/ - -int QQuickWebEngineContextMenuRequest::x() const -{ - return m_data->position().x(); -} - -/*! - \qmlproperty int ContextMenuRequest::y - \readonly - - The y coordinate of the user action from where the context - menu request originates. -*/ - -int QQuickWebEngineContextMenuRequest::y() const -{ - return m_data->position().y(); -} - -/*! - \qmlproperty string ContextMenuRequest::selectedText - \readonly - - The selected text the context menu was created for. -*/ - -QString QQuickWebEngineContextMenuRequest::selectedText() const -{ - return m_data->selectedText(); -} - -/*! - \qmlproperty string ContextMenuRequest::linkText - \readonly - - The text of the link if the context menu was requested for a link. -*/ - -QString QQuickWebEngineContextMenuRequest::linkText() const -{ - return m_data->linkText(); -} - -/*! - \qmlproperty url ContextMenuRequest::linkUrl - \readonly - - The URL of the link if the selected web page content is a link. - It is not guaranteed to be a valid URL. -*/ - -QUrl QQuickWebEngineContextMenuRequest::linkUrl() const -{ - return m_data->unfilteredLinkUrl(); -} - -/*! - \qmlproperty url ContextMenuRequest::mediaUrl - \readonly - - The URL of media if the selected web content is a media element. -*/ - -QUrl QQuickWebEngineContextMenuRequest::mediaUrl() const -{ - return m_data->mediaUrl(); -} - -/*! - \qmlproperty enumeration ContextMenuRequest::mediaType - \readonly - - The type of the media element or \c MediaTypeNone if - the selected web page content is not a media element. - - \value ContextMenuRequest.MediaTypeNone - Not a media. - \value ContextMenuRequest.MediaTypeImage - An image. - \value ContextMenuRequest.MediaTypeVideo - A video. - \value ContextMenuRequest.MediaTypeAudio - An audio element. - \value ContextMenuRequest.MediaTypeCanvas - A canvas. - \value ContextMenuRequest.MediaTypeFile - A file. - \value ContextMenuRequest.MediaTypePlugin - A plugin. -*/ - -QQuickWebEngineContextMenuRequest::MediaType QQuickWebEngineContextMenuRequest::mediaType() const -{ - return static_cast<QQuickWebEngineContextMenuRequest::MediaType>(m_data->mediaType()); -} - -/*! - \qmlproperty bool ContextMenuRequest::isContentEditable - \readonly - - Indicates whether the selected web content is editable. -*/ - -bool QQuickWebEngineContextMenuRequest::isContentEditable() const -{ - return m_data->isEditable(); -} - -/*! - \qmlproperty string ContextMenuRequest::misspelledWord - \readonly - - If the context is a word considered misspelled by the spell-checker, - returns the misspelled word. -*/ - -QString QQuickWebEngineContextMenuRequest::misspelledWord() const -{ - return m_data->misspelledWord(); -} - -/*! - \qmlproperty stringlist ContextMenuRequest::spellCheckerSuggestions - \readonly - - If the context is a word considered misspelled by the spell-checker, - returns a list of suggested replacements. -*/ - -QStringList QQuickWebEngineContextMenuRequest::spellCheckerSuggestions() const -{ - return m_data->spellCheckerSuggestions(); -} - -/*! - \qmlproperty bool ContextMenuRequest::accepted - - Indicates whether the context menu request has been - handled by the signal handler. - - If the property is \c false after any signal handlers - for WebEngineView::contextMenuRequested have been executed, - a default context menu will be shown. - To prevent this, set \c{request.accepted} to \c true. - - The default is \c false. - - \note The default content of the context menu depends on the - web element for which the request was actually generated. -*/ - -bool QQuickWebEngineContextMenuRequest::isAccepted() const -{ - return m_accepted; -} - -void QQuickWebEngineContextMenuRequest::setAccepted(bool accepted) -{ - m_accepted = accepted; -} - -/*! - \qmlproperty flags ContextMenuRequest::mediaFlags - \readonly - \since QtWebEngine 1.7 - - The current media element's status and its available operations. - \c MediaNone if the selected web page content is not a media element. - - \value ContextMenuRequest.MediaInError - An error occurred. - \value ContextMenuRequest.MediaPaused - Media is paused. - \value ContextMenuRequest.MediaMuted - Media is muted. - \value ContextMenuRequest.MediaLoop - Media can be looped. - \value ContextMenuRequest.MediaCanSave - Media can be saved. - \value ContextMenuRequest.MediaHasAudio - Media has audio. - \value ContextMenuRequest.MediaCanToggleControls - Media can show controls. - \value ContextMenuRequest.MediaControls - Media controls are shown. - \value ContextMenuRequest.MediaCanPrint - Media is printable. - \value ContextMenuRequest.MediaCanRotate - Media is rotatable. -*/ -QQuickWebEngineContextMenuRequest::MediaFlags QQuickWebEngineContextMenuRequest::mediaFlags() const -{ - return static_cast<QQuickWebEngineContextMenuRequest::MediaFlags>(m_data->mediaFlags()); -} - -/*! - \qmlproperty flags ContextMenuRequest::editFlags - \readonly - \since QtWebEngine 1.7 - - The available edit operations in the current context or \c CanDoNone if no actions are available. - - \value ContextMenuRequest.CanUndo - Undo is available. - \value ContextMenuRequest.CanRedo - Redo is available. - \value ContextMenuRequest.CanCut - Cut is available. - \value ContextMenuRequest.CanCopy - Copy is available. - \value ContextMenuRequest.CanPaste - Paste is available. - \value ContextMenuRequest.CanDelete - Delete is available. - \value ContextMenuRequest.CanSelectAll - Select All is available. - \value ContextMenuRequest.CanTranslate - Translate is available. - \value ContextMenuRequest.CanEditRichly - Context is richly editable. -*/ -QQuickWebEngineContextMenuRequest::EditFlags QQuickWebEngineContextMenuRequest::editFlags() const -{ - return static_cast<QQuickWebEngineContextMenuRequest::EditFlags>(m_data->editFlags()); -} - -QT_END_NAMESPACE diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index 8a426c887..ecbde46e6 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -52,7 +52,6 @@ #include "qquickwebenginehistory_p.h" #include "qquickwebenginecertificateerror_p.h" #include "qquickwebengineclientcertificateselection_p.h" -#include "qquickwebenginecontextmenurequest_p.h" #include "qquickwebenginedialogrequests_p.h" #include "qquickwebenginefaviconprovider_p_p.h" #include "qquickwebengineloadrequest_p.h" @@ -135,6 +134,7 @@ QQuickWebEngineViewPrivate::QQuickWebEngineViewPrivate() , m_zoomFactor(1.0) , m_ui2Enabled(false) , m_profileInitialized(false) + , m_contextMenuRequest(nullptr) { memset(actions, 0, sizeof(actions)); @@ -229,13 +229,15 @@ RenderWidgetHostViewQtDelegate *QQuickWebEngineViewPrivate::CreateRenderWidgetHo return quickDelegate; } -void QQuickWebEngineViewPrivate::contextMenuRequested(const WebEngineContextMenuData &data) +void QQuickWebEngineViewPrivate::contextMenuRequested(QWebEngineContextMenuRequest *request) { Q_Q(QQuickWebEngineView); - m_contextMenuData = data; + m_contextMenuRequest = request; - QQuickWebEngineContextMenuRequest *request = new QQuickWebEngineContextMenuRequest(data); + // FIXME: we most liekly do not need to make any copy here + auto *r = new QWebEngineContextMenuRequest( + new QWebEngineContextMenuRequestPrivate(*request->d.data())); QQmlEngine *engine = qmlEngine(q); // TODO: this is a workaround for QTBUG-65044 @@ -243,19 +245,19 @@ void QQuickWebEngineViewPrivate::contextMenuRequested(const WebEngineContextMenu return; // mark the object for gc by creating temporary jsvalue - engine->newQObject(request); - Q_EMIT q->contextMenuRequested(request); + engine->newQObject(r); + Q_EMIT q->contextMenuRequested(r); - if (request->isAccepted()) + if (r->isAccepted()) return; // Assign the WebEngineView as the parent of the menu, so mouse events are properly propagated // on OSX. - QObject *menu = ui()->addMenu(q, QString(), data.position()); + QObject *menu = ui()->addMenu(q, QString(), r->position()); if (!menu) return; - QQuickContextMenuBuilder contextMenuBuilder(data, q, menu); + QQuickContextMenuBuilder contextMenuBuilder(r, q, menu); // Populate our menu contextMenuBuilder.initMenu(); @@ -1817,32 +1819,33 @@ void QQuickWebEngineView::triggerWebAction(WebAction action) d->adapter->unselect(); break; case OpenLinkInThisWindow: - if (d->m_contextMenuData.linkUrl().isValid()) - setUrl(d->m_contextMenuData.linkUrl()); + if (d->m_contextMenuRequest->filteredLinkUrl().isValid()) + setUrl(d->m_contextMenuRequest->filteredLinkUrl()); break; case OpenLinkInNewWindow: - if (d->m_contextMenuData.linkUrl().isValid()) { + if (d->m_contextMenuRequest->filteredLinkUrl().isValid()) { QQuickWebEngineNewViewRequest request; - request.m_requestedUrl = d->m_contextMenuData.linkUrl(); + request.m_requestedUrl = d->m_contextMenuRequest->filteredLinkUrl(); request.m_isUserInitiated = true; request.m_destination = NewViewInWindow; Q_EMIT newViewRequested(&request); } break; case OpenLinkInNewTab: - if (d->m_contextMenuData.linkUrl().isValid()) { + if (d->m_contextMenuRequest->filteredLinkUrl().isValid()) { QQuickWebEngineNewViewRequest request; - request.m_requestedUrl = d->m_contextMenuData.linkUrl(); + request.m_requestedUrl = d->m_contextMenuRequest->filteredLinkUrl(); request.m_isUserInitiated = true; request.m_destination = NewViewInBackgroundTab; Q_EMIT newViewRequested(&request); } break; case CopyLinkToClipboard: - if (!d->m_contextMenuData.unfilteredLinkUrl().isEmpty()) { - QString urlString = d->m_contextMenuData.unfilteredLinkUrl().toString(QUrl::FullyEncoded); - QString linkText = d->m_contextMenuData.linkText().toHtmlEscaped(); - QString title = d->m_contextMenuData.titleText(); + if (!d->m_contextMenuRequest->unfilteredLinkUrl().isEmpty()) { + QString urlString = + d->m_contextMenuRequest->unfilteredLinkUrl().toString(QUrl::FullyEncoded); + QString linkText = d->m_contextMenuRequest->linkText().toHtmlEscaped(); + QString title = d->m_contextMenuRequest->titleText(); if (!title.isEmpty()) title = QStringLiteral(" title=\"%1\"").arg(title.toHtmlEscaped()); QMimeData *data = new QMimeData(); @@ -1850,99 +1853,118 @@ void QQuickWebEngineView::triggerWebAction(WebAction action) QString html = QStringLiteral("<a href=\"") + urlString + QStringLiteral("\"") + title + QStringLiteral(">") + linkText + QStringLiteral("</a>"); data->setHtml(html); - data->setUrls(QList<QUrl>() << d->m_contextMenuData.unfilteredLinkUrl()); + data->setUrls(QList<QUrl>() << d->m_contextMenuRequest->unfilteredLinkUrl()); qApp->clipboard()->setMimeData(data); } break; case DownloadLinkToDisk: - if (d->m_contextMenuData.linkUrl().isValid()) - d->adapter->download(d->m_contextMenuData.linkUrl(), d->m_contextMenuData.suggestedFileName(), - d->m_contextMenuData.referrerUrl(), d->m_contextMenuData.referrerPolicy()); + if (d->m_contextMenuRequest->filteredLinkUrl().isValid()) + d->adapter->download(d->m_contextMenuRequest->filteredLinkUrl(), + d->m_contextMenuRequest->suggestedFileName(), + d->m_contextMenuRequest->referrerUrl(), + d->m_contextMenuRequest->referrerPolicy()); break; case CopyImageToClipboard: - if (d->m_contextMenuData.hasImageContent() && - (d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeImage || - d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeCanvas)) - { - d->adapter->copyImageAt(d->m_contextMenuData.position()); + if (d->m_contextMenuRequest->hasImageContent() + && (d->m_contextMenuRequest->mediaType() == QWebEngineContextMenuRequest::MediaTypeImage + || d->m_contextMenuRequest->mediaType() + == QWebEngineContextMenuRequest::MediaTypeCanvas)) { + d->adapter->copyImageAt(d->m_contextMenuRequest->position()); } break; case CopyImageUrlToClipboard: - if (d->m_contextMenuData.mediaUrl().isValid() && d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeImage) { - QString urlString = d->m_contextMenuData.mediaUrl().toString(QUrl::FullyEncoded); - QString alt = d->m_contextMenuData.altText(); + if (d->m_contextMenuRequest->mediaUrl().isValid() + && d->m_contextMenuRequest->mediaType() + == QWebEngineContextMenuRequest::MediaTypeImage) { + QString urlString = d->m_contextMenuRequest->mediaUrl().toString(QUrl::FullyEncoded); + QString alt = d->m_contextMenuRequest->altText(); if (!alt.isEmpty()) alt = QStringLiteral(" alt=\"%1\"").arg(alt.toHtmlEscaped()); - QString title = d->m_contextMenuData.titleText(); + QString title = d->m_contextMenuRequest->titleText(); if (!title.isEmpty()) title = QStringLiteral(" title=\"%1\"").arg(title.toHtmlEscaped()); QMimeData *data = new QMimeData(); data->setText(urlString); QString html = QStringLiteral("<img src=\"") + urlString + QStringLiteral("\"") + title + alt + QStringLiteral("></img>"); data->setHtml(html); - data->setUrls(QList<QUrl>() << d->m_contextMenuData.mediaUrl()); + data->setUrls(QList<QUrl>() << d->m_contextMenuRequest->mediaUrl()); qApp->clipboard()->setMimeData(data); } break; case DownloadImageToDisk: case DownloadMediaToDisk: - if (d->m_contextMenuData.mediaUrl().isValid()) - d->adapter->download(d->m_contextMenuData.mediaUrl(), d->m_contextMenuData.suggestedFileName(), - d->m_contextMenuData.referrerUrl(), d->m_contextMenuData.referrerPolicy()); + if (d->m_contextMenuRequest->mediaUrl().isValid()) + d->adapter->download(d->m_contextMenuRequest->mediaUrl(), + d->m_contextMenuRequest->suggestedFileName(), + d->m_contextMenuRequest->referrerUrl(), + d->m_contextMenuRequest->referrerPolicy()); break; case CopyMediaUrlToClipboard: - if (d->m_contextMenuData.mediaUrl().isValid() && - (d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeAudio || - d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeVideo)) - { - QString urlString = d->m_contextMenuData.mediaUrl().toString(QUrl::FullyEncoded); - QString title = d->m_contextMenuData.titleText(); + if (d->m_contextMenuRequest->mediaUrl().isValid() + && (d->m_contextMenuRequest->mediaType() == QWebEngineContextMenuRequest::MediaTypeAudio + || d->m_contextMenuRequest->mediaType() + == QWebEngineContextMenuRequest::MediaTypeVideo)) { + QString urlString = d->m_contextMenuRequest->mediaUrl().toString(QUrl::FullyEncoded); + QString title = d->m_contextMenuRequest->titleText(); if (!title.isEmpty()) title = QStringLiteral(" title=\"%1\"").arg(title.toHtmlEscaped()); QMimeData *data = new QMimeData(); data->setText(urlString); - if (d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeAudio) + if (d->m_contextMenuRequest->mediaType() + == QWebEngineContextMenuRequest::MediaTypeAudio) data->setHtml(QStringLiteral("<audio src=\"") + urlString + QStringLiteral("\"") + title + QStringLiteral("></audio>")); else data->setHtml(QStringLiteral("<video src=\"") + urlString + QStringLiteral("\"") + title + QStringLiteral("></video>")); - data->setUrls(QList<QUrl>() << d->m_contextMenuData.mediaUrl()); + data->setUrls(QList<QUrl>() << d->m_contextMenuRequest->mediaUrl()); qApp->clipboard()->setMimeData(data); } break; case ToggleMediaControls: - if (d->m_contextMenuData.mediaUrl().isValid() && d->m_contextMenuData.mediaFlags() & WebEngineContextMenuData::MediaCanToggleControls) { - bool enable = !(d->m_contextMenuData.mediaFlags() & WebEngineContextMenuData::MediaControls); - d->adapter->executeMediaPlayerActionAt(d->m_contextMenuData.position(), WebContentsAdapter::MediaPlayerControls, enable); + if (d->m_contextMenuRequest->mediaUrl().isValid() + && d->m_contextMenuRequest->mediaFlags() + & QWebEngineContextMenuRequest::MediaCanToggleControls) { + bool enable = !(d->m_contextMenuRequest->mediaFlags() + & QWebEngineContextMenuRequest::MediaControls); + d->adapter->executeMediaPlayerActionAt(d->m_contextMenuRequest->position(), + WebContentsAdapter::MediaPlayerControls, enable); } break; case ToggleMediaLoop: - if (d->m_contextMenuData.mediaUrl().isValid() && - (d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeAudio || - d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeVideo)) - { - bool enable = !(d->m_contextMenuData.mediaFlags() & WebEngineContextMenuData::MediaLoop); - d->adapter->executeMediaPlayerActionAt(d->m_contextMenuData.position(), WebContentsAdapter::MediaPlayerLoop, enable); + if (d->m_contextMenuRequest->mediaUrl().isValid() + && (d->m_contextMenuRequest->mediaType() == QWebEngineContextMenuRequest::MediaTypeAudio + || d->m_contextMenuRequest->mediaType() + == QWebEngineContextMenuRequest::MediaTypeVideo)) { + bool enable = !(d->m_contextMenuRequest->mediaFlags() + & QWebEngineContextMenuRequest::MediaLoop); + d->adapter->executeMediaPlayerActionAt(d->m_contextMenuRequest->position(), + WebContentsAdapter::MediaPlayerLoop, enable); } break; case ToggleMediaPlayPause: - if (d->m_contextMenuData.mediaUrl().isValid() && - (d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeAudio || - d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeVideo)) - { - bool enable = (d->m_contextMenuData.mediaFlags() & WebEngineContextMenuData::MediaPaused); - d->adapter->executeMediaPlayerActionAt(d->m_contextMenuData.position(), WebContentsAdapter::MediaPlayerPlay, enable); + if (d->m_contextMenuRequest->mediaUrl().isValid() + && (d->m_contextMenuRequest->mediaType() == QWebEngineContextMenuRequest::MediaTypeAudio + || d->m_contextMenuRequest->mediaType() + == QWebEngineContextMenuRequest::MediaTypeVideo)) { + bool enable = (d->m_contextMenuRequest->mediaFlags() + & QWebEngineContextMenuRequest::MediaPaused); + d->adapter->executeMediaPlayerActionAt(d->m_contextMenuRequest->position(), + WebContentsAdapter::MediaPlayerPlay, enable); } break; case ToggleMediaMute: - if (d->m_contextMenuData.mediaUrl().isValid() && d->m_contextMenuData.mediaFlags() & WebEngineContextMenuData::MediaHasAudio) { - bool enable = !(d->m_contextMenuData.mediaFlags() & WebEngineContextMenuData::MediaMuted); - d->adapter->executeMediaPlayerActionAt(d->m_contextMenuData.position(), WebContentsAdapter::MediaPlayerMute, enable); + if (d->m_contextMenuRequest->mediaUrl().isValid() + && d->m_contextMenuRequest->mediaFlags() + & QWebEngineContextMenuRequest::MediaHasAudio) { + bool enable = !(d->m_contextMenuRequest->mediaFlags() + & QWebEngineContextMenuRequest::MediaMuted); + d->adapter->executeMediaPlayerActionAt(d->m_contextMenuRequest->position(), + WebContentsAdapter::MediaPlayerMute, enable); } break; case InspectElement: - d->adapter->inspectElementAt(d->m_contextMenuData.position()); + d->adapter->inspectElementAt(d->m_contextMenuRequest->position()); break; case ExitFullScreen: d->adapter->exitFullScreen(); @@ -2295,12 +2317,9 @@ void QQuickWebEngineFullScreenRequest::reject() m_viewPrivate->setFullScreenMode(!m_toggleOn); } -QQuickContextMenuBuilder::QQuickContextMenuBuilder(const QtWebEngineCore::WebEngineContextMenuData &data, - QQuickWebEngineView *view, - QObject *menu) - : QtWebEngineCore::RenderViewContextMenuQt(data) - , m_view(view) - , m_menu(menu) +QQuickContextMenuBuilder::QQuickContextMenuBuilder(QWebEngineContextMenuRequest *request, + QQuickWebEngineView *view, QObject *menu) + : QtWebEngineCore::RenderViewContextMenuQt(request), m_view(view), m_menu(menu) { } @@ -2408,9 +2427,9 @@ void QQuickContextMenuBuilder::addMenuItem(ContextMenuItem menuItem) case ContextMenuItem::SpellingSuggestions: { QPointer<QQuickWebEngineView> thisRef(m_view); - for (int i=0; i < m_contextData.spellCheckerSuggestions().count() && i < 4; i++) { + for (int i = 0; i < m_contextData->spellCheckerSuggestions().count() && i < 4; i++) { action = new QQuickWebEngineAction(m_menu); - QString replacement = m_contextData.spellCheckerSuggestions().at(i); + QString replacement = m_contextData->spellCheckerSuggestions().at(i); QObject::connect(action, &QQuickWebEngineAction::triggered, [thisRef, replacement] { thisRef->replaceMisspelledWord(replacement); }); m_view->d_ptr->ui()->addMenuItem(action, m_menu); } @@ -2435,19 +2454,19 @@ bool QQuickContextMenuBuilder::isMenuItemEnabled(ContextMenuItem menuItem) case ContextMenuItem::Reload: return true; case ContextMenuItem::Cut: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanCut; + return m_contextData->editFlags() & QWebEngineContextMenuRequest::CanCut; case ContextMenuItem::Copy: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanCopy; + return m_contextData->editFlags() & QWebEngineContextMenuRequest::CanCopy; case ContextMenuItem::Paste: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanPaste; + return m_contextData->editFlags() & QWebEngineContextMenuRequest::CanPaste; case ContextMenuItem::Undo: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanUndo; + return m_contextData->editFlags() & QWebEngineContextMenuRequest::CanUndo; case ContextMenuItem::Redo: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanRedo; + return m_contextData->editFlags() & QWebEngineContextMenuRequest::CanRedo; case ContextMenuItem::SelectAll: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanSelectAll; + return m_contextData->editFlags() & QWebEngineContextMenuRequest::CanSelectAll; case ContextMenuItem::PasteAndMatchStyle: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanPaste; + return m_contextData->editFlags() & QWebEngineContextMenuRequest::CanPaste; case ContextMenuItem::OpenLinkInNewWindow: case ContextMenuItem::OpenLinkInNewTab: case ContextMenuItem::CopyLinkToClipboard: diff --git a/src/webengine/api/qquickwebengineview_p.h b/src/webengine/api/qquickwebengineview_p.h index 86b7145db..1ac383ba6 100644 --- a/src/webengine/api/qquickwebengineview_p.h +++ b/src/webengine/api/qquickwebengineview_p.h @@ -72,7 +72,6 @@ class QQuickWebEngineAuthenticationDialogRequest; class QQuickWebEngineCertificateError; class QQuickWebEngineClientCertificateSelection; class QQuickWebEngineColorDialogRequest; -class QQuickWebEngineContextMenuRequest; class QQuickWebEngineFaviconProvider; class QQuickWebEngineFileDialogRequest; class QQuickWebEngineHistory; @@ -87,6 +86,7 @@ class QQuickWebEngineViewPrivate; class QWebEngineFindTextResult; class QWebEngineQuotaRequest; class QWebEngineRegisterProtocolHandlerRequest; +class QWebEngineContextMenuRequest; #if QT_CONFIG(webengine_testsupport) class QQuickWebEngineTestSupport; @@ -569,7 +569,7 @@ Q_SIGNALS: Q_REVISION(3) void audioMutedChanged(bool muted); Q_REVISION(3) void recentlyAudibleChanged(bool recentlyAudible); Q_REVISION(3) void webChannelWorldChanged(uint); - Q_REVISION(4) void contextMenuRequested(QQuickWebEngineContextMenuRequest *request); + Q_REVISION(4) void contextMenuRequested(QWebEngineContextMenuRequest *request); Q_REVISION(4) void authenticationDialogRequested(QQuickWebEngineAuthenticationDialogRequest *request); Q_REVISION(4) void javaScriptDialogRequested(QQuickWebEngineJavaScriptDialogRequest *request); Q_REVISION(4) void colorDialogRequested(QQuickWebEngineColorDialogRequest *request); diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h index bfed75f45..21f813a33 100644 --- a/src/webengine/api/qquickwebengineview_p_p.h +++ b/src/webengine/api/qquickwebengineview_p_p.h @@ -75,7 +75,7 @@ QT_BEGIN_NAMESPACE class QQuickWebEngineView; class QQmlComponent; class QQmlContext; -class QQuickWebEngineContextMenuRequest; +class QWebEngineContextMenuRequest; class QQuickWebEngineSettings; class QQuickWebEngineFaviconProvider; class QQuickWebEngineProfilePrivate; @@ -128,7 +128,7 @@ public: void windowCloseRejected() override; void requestFullScreenMode(const QUrl &origin, bool fullscreen) override; bool isFullScreenMode() const override; - void contextMenuRequested(const QtWebEngineCore::WebEngineContextMenuData &) override; + void contextMenuRequested(QWebEngineContextMenuRequest *request) override; void navigationRequested(int navigationType, const QUrl &url, int &navigationRequestAction, bool isMainFrame) override; void javascriptDialog(QSharedPointer<QtWebEngineCore::JavaScriptDialogController>) override; void runFileChooser(QSharedPointer<QtWebEngineCore::FilePickerController>) override; @@ -200,7 +200,6 @@ public: QQuickWebEngineTestSupport *m_testSupport; #endif QQmlComponent *contextMenuExtraItems; - QtWebEngineCore::WebEngineContextMenuData m_contextMenuData; QUrl m_url; QString m_html; QUrl iconUrl; @@ -237,6 +236,7 @@ private: qreal m_zoomFactor; bool m_ui2Enabled; bool m_profileInitialized; + QWebEngineContextMenuRequest *m_contextMenuRequest; LoadVisuallyCommittedState m_loadVisuallyCommittedState = NotCommitted; }; @@ -263,7 +263,8 @@ private: class QQuickContextMenuBuilder : public QtWebEngineCore::RenderViewContextMenuQt { public: - QQuickContextMenuBuilder(const QtWebEngineCore::WebEngineContextMenuData &data, QQuickWebEngineView *view, QObject *menu); + QQuickContextMenuBuilder(QWebEngineContextMenuRequest *data, QQuickWebEngineView *view, + QObject *menu); void appendExtraItems(QQmlEngine *engine); private: diff --git a/src/webengine/doc/src/context_menu_request.qdoc b/src/webengine/doc/src/context_menu_request.qdoc new file mode 100644 index 000000000..cc812dcf2 --- /dev/null +++ b/src/webengine/doc/src/context_menu_request.qdoc @@ -0,0 +1,218 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** 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 Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \qmltype ContextMenuRequest + \instantiates QQuickWebEngineContextMenuRequest + \inqmlmodule QtWebEngine + \since QtWebEngine 1.4 + + \brief A request for showing a context menu. + + A ContextMenuRequest is passed as an argument of the + WebEngineView::contextMenuRequested signal. It provides further + information about the context of the request. The position of the + request origin can be found via the \l x and \l y properties. + + The \l accepted property of the request indicates whether the request + is handled by the user code or the default context menu should + be displayed. + + The following code uses a custom menu to handle the request: + + \code + WebEngineView { + id: view + // ... + onContextMenuRequested: function(request) { + request.accepted = true; + myMenu.x = request.x; + myMenu.y = request.y; + myMenu.trigger.connect(view.triggerWebAction); + myMenu.popup(); + } + // ... + } + \endcode +*/ + +/*! + \qmlproperty point ContextMenuRequest::position + \readonly + + The position of the user action from where the context + menu request originates. +*/ + +/*! + \qmlproperty string ContextMenuRequest::selectedText + \readonly + + The selected text the context menu was created for. +*/ + +/*! + \qmlproperty string ContextMenuRequest::linkText + \readonly + + The text of the link if the context menu was requested for a link. +*/ + +/*! + \qmlproperty url ContextMenuRequest::linkUrl + \readonly + + The URL of the link if the selected web page content is a link. + It is not guaranteed to be a valid URL. +*/ + +/*! + \qmlproperty url ContextMenuRequest::mediaUrl + \readonly + + The URL of media if the selected web content is a media element. +*/ + +/*! + \qmlproperty enumeration ContextMenuRequest::mediaType + \readonly + + The type of the media element or \c MediaTypeNone if + the selected web page content is not a media element. + + \value ContextMenuRequest.MediaTypeNone + Not a media. + \value ContextMenuRequest.MediaTypeImage + An image. + \value ContextMenuRequest.MediaTypeVideo + A video. + \value ContextMenuRequest.MediaTypeAudio + An audio element. + \value ContextMenuRequest.MediaTypeCanvas + A canvas. + \value ContextMenuRequest.MediaTypeFile + A file. + \value ContextMenuRequest.MediaTypePlugin + A plugin. +*/ + +/*! + \qmlproperty bool ContextMenuRequest::isContentEditable + \readonly + + Indicates whether the selected web content is editable. +*/ + +/*! + \qmlproperty string ContextMenuRequest::misspelledWord + \readonly + + If the context is a word considered misspelled by the spell-checker, + returns the misspelled word. +*/ + +/*! + \qmlproperty stringlist ContextMenuRequest::spellCheckerSuggestions + \readonly + + If the context is a word considered misspelled by the spell-checker, + returns a list of suggested replacements. +*/ + +/*! + \qmlproperty bool ContextMenuRequest::accepted + + Indicates whether the context menu request has been + handled by the signal handler. + + If the property is \c false after any signal handlers + for WebEngineView::contextMenuRequested have been executed, + a default context menu will be shown. + To prevent this, set \c{request.accepted} to \c true. + + The default is \c false. + + \note The default content of the context menu depends on the + web element for which the request was actually generated. +*/ + +/*! + \qmlproperty flags ContextMenuRequest::mediaFlags + \readonly + \since QtWebEngine 1.7 + + The current media element's status and its available operations. + \c MediaNone if the selected web page content is not a media element. + + \value ContextMenuRequest.MediaInError + An error occurred. + \value ContextMenuRequest.MediaPaused + Media is paused. + \value ContextMenuRequest.MediaMuted + Media is muted. + \value ContextMenuRequest.MediaLoop + Media can be looped. + \value ContextMenuRequest.MediaCanSave + Media can be saved. + \value ContextMenuRequest.MediaHasAudio + Media has audio. + \value ContextMenuRequest.MediaCanToggleControls + Media can show controls. + \value ContextMenuRequest.MediaControls + Media controls are shown. + \value ContextMenuRequest.MediaCanPrint + Media is printable. + \value ContextMenuRequest.MediaCanRotate + Media is rotatable. +*/ + +/*! + \qmlproperty flags ContextMenuRequest::editFlags + \readonly + \since QtWebEngine 1.7 + + The available edit operations in the current context or \c CanDoNone if no actions are available. + + \value ContextMenuRequest.CanUndo + Undo is available. + \value ContextMenuRequest.CanRedo + Redo is available. + \value ContextMenuRequest.CanCut + Cut is available. + \value ContextMenuRequest.CanCopy + Copy is available. + \value ContextMenuRequest.CanPaste + Paste is available. + \value ContextMenuRequest.CanDelete + Delete is available. + \value ContextMenuRequest.CanSelectAll + Select All is available. + \value ContextMenuRequest.CanTranslate + Translate is available. + \value ContextMenuRequest.CanEditRichly + Context is richly editable. +*/ diff --git a/src/webengine/module.pro b/src/webengine/module.pro index 49a1086b2..56bfce48f 100644 --- a/src/webengine/module.pro +++ b/src/webengine/module.pro @@ -1,5 +1,5 @@ include($$QTWEBENGINE_OUT_ROOT/src/webengine/qtwebengine-config.pri) -QT_FOR_CONFIG += webengine-private +QT_FOR_CONFIG += webengine-private webenginecore-private TARGET = QtWebEngine MODULE = webengine @@ -18,7 +18,6 @@ SOURCES = \ api/qquickwebengineaction.cpp \ api/qquickwebenginecertificateerror.cpp \ api/qquickwebengineclientcertificateselection.cpp \ - api/qquickwebenginecontextmenurequest.cpp \ api/qquickwebenginedialogrequests.cpp \ api/qquickwebenginedownloaditem.cpp \ api/qquickwebenginehistory.cpp \ @@ -44,7 +43,6 @@ HEADERS = \ api/qquickwebengineaction_p_p.h \ api/qquickwebenginecertificateerror_p.h \ api/qquickwebengineclientcertificateselection_p.h \ - api/qquickwebenginecontextmenurequest_p.h \ api/qquickwebenginedialogrequests_p.h \ api/qquickwebenginedownloaditem_p.h \ api/qquickwebenginedownloaditem_p_p.h \ diff --git a/src/webengine/plugin/plugin.cpp b/src/webengine/plugin/plugin.cpp index a74373b23..2603e91ef 100644 --- a/src/webengine/plugin/plugin.cpp +++ b/src/webengine/plugin/plugin.cpp @@ -42,7 +42,6 @@ #include <QtWebEngine/private/qquickwebenginecertificateerror_p.h> #include <QtWebEngine/private/qquickwebengineclientcertificateselection_p.h> -#include <QtWebEngine/private/qquickwebenginecontextmenurequest_p.h> #include <QtWebEngine/private/qquickwebenginedialogrequests_p.h> #include <QtWebEngine/private/qquickwebenginedownloaditem_p.h> #include <QtWebEngine/private/qquickwebenginehistory_p.h> @@ -59,6 +58,7 @@ #include <QtWebEngineCore/qwebenginenotification.h> #include <QtWebEngineCore/qwebenginequotarequest.h> #include <QtWebEngineCore/qwebengineregisterprotocolhandlerrequest.h> +#include <QtWebEngineCore/qwebenginecontextmenurequest.h> QT_BEGIN_NAMESPACE @@ -144,10 +144,8 @@ public: qmlRegisterUncreatableType<QQuickWebEngineFullScreenRequest>(uri, 1, 1, "FullScreenRequest", msgUncreatableType("FullScreenRequest")); - qmlRegisterUncreatableType<QQuickWebEngineContextMenuRequest>(uri, 1, 4, "ContextMenuRequest", - msgUncreatableType("ContextMenuRequest")); - qmlRegisterUncreatableType<QQuickWebEngineContextMenuRequest, 1>(uri, 1, 7, "ContextMenuRequest", - msgUncreatableType("ContextMenuRequest")); + qmlRegisterUncreatableType<QWebEngineContextMenuRequest, 1>( + uri, 1, 7, "ContextMenuRequest", msgUncreatableType("ContextMenuRequest")); qmlRegisterUncreatableType<QQuickWebEngineAuthenticationDialogRequest>(uri, 1, 4, "AuthenticationDialogRequest", msgUncreatableType("AuthenticationDialogRequest")); qmlRegisterUncreatableType<QQuickWebEngineJavaScriptDialogRequest>(uri, 1, 4, "JavaScriptDialogRequest", diff --git a/src/webenginewidgets/api/qwebenginecontextmenudata.cpp b/src/webenginewidgets/api/qwebenginecontextmenudata.cpp deleted file mode 100644 index 377ffe1b5..000000000 --- a/src/webenginewidgets/api/qwebenginecontextmenudata.cpp +++ /dev/null @@ -1,306 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 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 "qwebenginecontextmenudata.h" - -#include "web_contents_adapter_client.h" - -QT_BEGIN_NAMESPACE - -// Match MediaType enum -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypeNone, QWebEngineContextMenuData::MediaTypeNone) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypeImage, QWebEngineContextMenuData::MediaTypeImage) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypeAudio, QWebEngineContextMenuData::MediaTypeAudio) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypeVideo, QWebEngineContextMenuData::MediaTypeVideo) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypeCanvas, QWebEngineContextMenuData::MediaTypeCanvas) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypeFile, QWebEngineContextMenuData::MediaTypeFile) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypePlugin, QWebEngineContextMenuData::MediaTypePlugin) - -// Match MediaFlag enum -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaInError, QWebEngineContextMenuData::MediaInError) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaPaused, QWebEngineContextMenuData::MediaPaused) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaMuted, QWebEngineContextMenuData::MediaMuted) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaLoop, QWebEngineContextMenuData::MediaLoop) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaCanSave, QWebEngineContextMenuData::MediaCanSave) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaHasAudio, QWebEngineContextMenuData::MediaHasAudio) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaCanToggleControls, QWebEngineContextMenuData::MediaCanToggleControls) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaControls, QWebEngineContextMenuData::MediaControls) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaCanPrint, QWebEngineContextMenuData::MediaCanPrint) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaCanRotate, QWebEngineContextMenuData::MediaCanRotate) - -// Match EditFlag enum -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanUndo, QWebEngineContextMenuData::CanUndo) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanRedo, QWebEngineContextMenuData::CanRedo) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanCut, QWebEngineContextMenuData::CanCut) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanCopy, QWebEngineContextMenuData::CanCopy) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanPaste, QWebEngineContextMenuData::CanPaste) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanDelete, QWebEngineContextMenuData::CanDelete) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanSelectAll, QWebEngineContextMenuData::CanSelectAll) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanTranslate, QWebEngineContextMenuData::CanTranslate) -ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::CanEditRichly, QWebEngineContextMenuData::CanEditRichly) - -/*! - \class QWebEngineContextMenuData - \since 5.7 - \brief The QWebEngineContextMenuData class provides context data for populating or extending a context menu with actions. - - \inmodule QtWebEngineWidgets - - QWebEngineContextMenuData is returned by QWebEnginePage::contextMenuData() 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 QWebEngineContextMenuData::MediaType - - This enum describes the media type of the context 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 QWebEngineContextMenuData::EditFlag - \readonly - \since 5.11 - - The available edit operations in the current context. - - \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 QWebEngineContextMenuData::MediaFlag - \readonly - \since 5.11 - - 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. -*/ - -/*! - Constructs null context menu data. -*/ -QWebEngineContextMenuData::QWebEngineContextMenuData() : d(nullptr) -{ -} - -/*! - Constructs context menu data from \a other. -*/ -QWebEngineContextMenuData::QWebEngineContextMenuData(const QWebEngineContextMenuData &other) -{ - d = new QtWebEngineCore::WebEngineContextMenuData(*other.d); -} - -/*! - Assigns the \a other context menu data to this. -*/ -QWebEngineContextMenuData &QWebEngineContextMenuData::operator=(const QWebEngineContextMenuData &other) -{ - delete d; - d = new QtWebEngineCore::WebEngineContextMenuData(*other.d); - return *this; -} - -/*! - Destroys the context menu data. -*/ -QWebEngineContextMenuData::~QWebEngineContextMenuData() -{ - delete d; -} - -/*! - Returns \c true if the context data is valid; otherwise returns \c false. -*/ -bool QWebEngineContextMenuData::isValid() const -{ - return d; -} - -/*! - Resets the context data, making it invalid. - \internal - - \sa isValid() -*/ -void QWebEngineContextMenuData::reset() -{ - delete d; - d = nullptr; -} - -/*! - Returns the position of the context, usually the mouse position where the context menu event was triggered. -*/ -QPoint QWebEngineContextMenuData::position() const -{ - return d ? d->position() : QPoint(); -} - -/*! - Returns the text of a link if the context is a link. -*/ -QString QWebEngineContextMenuData::linkText() const -{ - return d ? d->linkText() : QString(); -} - -/*! - Returns the URL of a link if the context is a link. - It is not guaranteed to be a valid URL. -*/ -QUrl QWebEngineContextMenuData::linkUrl() const -{ - return d ? d->unfilteredLinkUrl() : QUrl(); -} - -/*! - Returns the selected text of the context. -*/ -QString QWebEngineContextMenuData::selectedText() const -{ - return d ? d->selectedText() : QString(); -} - -/*! - If the context is a media element, returns the URL of that media. -*/ -QUrl QWebEngineContextMenuData::mediaUrl() const -{ - return d ? d->mediaUrl() : QUrl(); -} - -/*! - Returns the type of the media element or \c MediaTypeNone if the context is not a media element. -*/ -QWebEngineContextMenuData::MediaType QWebEngineContextMenuData::mediaType() const -{ - return d ? static_cast<QWebEngineContextMenuData::MediaType>(d->mediaType()) : MediaTypeNone; -} - -/*! - Returns \c true if the content is editable by the user; otherwise returns \c false. -*/ -bool QWebEngineContextMenuData::isContentEditable() const -{ - return d ? d->isEditable() : false; -} - -/*! - If the context is a word considered misspelled by the spell-checker, returns the misspelled word. - - For possible replacements of the word, see spellCheckerSuggestions(). - - \since 5.8 -*/ -QString QWebEngineContextMenuData::misspelledWord() const -{ - if (d) - return d->misspelledWord(); - return QString(); -} - -/*! - If the context is a word considered misspelled by the spell-checker, returns a list of suggested replacements - for misspelledWord(). - - \since 5.8 -*/ -QStringList QWebEngineContextMenuData::spellCheckerSuggestions() const -{ - if (d) - return d->spellCheckerSuggestions(); - return QStringList(); -} - -/*! - \internal -*/ -QWebEngineContextMenuData &QWebEngineContextMenuData::operator=(const QWebEngineContextDataPrivate &priv) -{ - delete d; - d = new QtWebEngineCore::WebEngineContextMenuData(priv); - return *this; -} - -/*! - Returns the current media element's status and its available operations. - \c MediaNone if the selected web page content is not a media element. -*/ -QWebEngineContextMenuData::MediaFlags QWebEngineContextMenuData::mediaFlags() const -{ - return static_cast<QWebEngineContextMenuData::MediaFlags>(d->mediaFlags()); -} - -/*! - Returns the available edit operations in the current context or \c CanDoNone if no actions are available. -*/ -QWebEngineContextMenuData::EditFlags QWebEngineContextMenuData::editFlags() const -{ - return static_cast<QWebEngineContextMenuData::EditFlags>(d->editFlags()); -} - -QT_END_NAMESPACE diff --git a/src/webenginewidgets/api/qwebenginecontextmenudata.h b/src/webenginewidgets/api/qwebenginecontextmenudata.h deleted file mode 100644 index 16a1f8ad6..000000000 --- a/src/webenginewidgets/api/qwebenginecontextmenudata.h +++ /dev/null @@ -1,134 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 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 QWEBENGINECONTEXTDATA_H -#define QWEBENGINECONTEXTDATA_H - -#include <QtWebEngineWidgets/qtwebenginewidgetsglobal.h> -#include <QtCore/qpoint.h> -#include <QtCore/qstring.h> -#include <QtCore/qurl.h> - -namespace QtWebEngineCore { -class WebEngineContextMenuData; -} - -QT_BEGIN_NAMESPACE - -class QWEBENGINEWIDGETS_EXPORT QWebEngineContextMenuData { - Q_GADGET - -public: - QWebEngineContextMenuData(); - QWebEngineContextMenuData(const QWebEngineContextMenuData &other); - QWebEngineContextMenuData &operator=(const QWebEngineContextMenuData &other); - ~QWebEngineContextMenuData(); - - enum MediaType { - MediaTypeNone, - MediaTypeImage, - MediaTypeVideo, - MediaTypeAudio, - MediaTypeCanvas, - MediaTypeFile, - MediaTypePlugin - }; - - // 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) - - bool isValid() const; - - QPoint position() const; - QString selectedText() const; - QString linkText() const; - QUrl linkUrl() const; - QUrl mediaUrl() const; - MediaType mediaType() const; - bool isContentEditable() const; - QString misspelledWord() const; - QStringList spellCheckerSuggestions() const; - MediaFlags mediaFlags() const; - EditFlags editFlags() const; - -private: - void reset(); - typedef QtWebEngineCore::WebEngineContextMenuData QWebEngineContextDataPrivate; - QWebEngineContextMenuData &operator=(const QWebEngineContextDataPrivate &priv); - const QWebEngineContextDataPrivate *d; - - friend class QWebEngineViewPrivate; - friend class QWebEngineView; - friend class QWebEnginePage; -}; - -Q_DECLARE_OPERATORS_FOR_FLAGS(QWebEngineContextMenuData::MediaFlags) -Q_DECLARE_OPERATORS_FOR_FLAGS(QWebEngineContextMenuData::EditFlags) - -QT_END_NAMESPACE - -#endif // QWEBENGINECONTEXTDATA_H diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index dc6dec659..28377be0c 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -1360,10 +1360,6 @@ void QWebEnginePage::triggerAction(WebAction action, bool) { Q_D(QWebEnginePage); d->ensureInitialized(); - const QtWebEngineCore::WebEngineContextMenuData *menuData = nullptr; - - if (d->view) - menuData = d->view->contextMenuData().d; switch (action) { case Back: d->adapter->navigateBack(); @@ -1405,35 +1401,36 @@ void QWebEnginePage::triggerAction(WebAction action, bool) d->adapter->unselect(); break; case OpenLinkInThisWindow: - if (menuData && menuData->linkUrl().isValid()) - setUrl(menuData->linkUrl()); + if (d->view && d->view->lastContextMenuRequest()->filteredLinkUrl().isValid()) + setUrl(d->view->lastContextMenuRequest()->filteredLinkUrl()); break; case OpenLinkInNewWindow: - if (menuData && menuData->linkUrl().isValid()) { + if (d->view && d->view->lastContextMenuRequest()->filteredLinkUrl().isValid()) { QWebEnginePage *newPage = createWindow(WebBrowserWindow); if (newPage) - newPage->setUrl(menuData->linkUrl()); + newPage->setUrl(d->view->lastContextMenuRequest()->filteredLinkUrl()); } break; case OpenLinkInNewTab: - if (menuData && menuData->linkUrl().isValid()) { + if (d->view && d->view->lastContextMenuRequest()->filteredLinkUrl().isValid()) { QWebEnginePage *newPage = createWindow(WebBrowserTab); if (newPage) - newPage->setUrl(menuData->linkUrl()); + newPage->setUrl(d->view->lastContextMenuRequest()->filteredLinkUrl()); } break; case OpenLinkInNewBackgroundTab: - if (menuData && menuData->linkUrl().isValid()) { + if (d->view && d->view->lastContextMenuRequest()->filteredLinkUrl().isValid()) { QWebEnginePage *newPage = createWindow(WebBrowserBackgroundTab); if (newPage) - newPage->setUrl(menuData->linkUrl()); + newPage->setUrl(d->view->lastContextMenuRequest()->filteredLinkUrl()); } break; case CopyLinkToClipboard: - if (menuData && !menuData->unfilteredLinkUrl().isEmpty()) { - QString urlString = menuData->unfilteredLinkUrl().toString(QUrl::FullyEncoded); - QString linkText = menuData->linkText().toHtmlEscaped(); - QString title = menuData->titleText(); + if (d->view && !d->view->lastContextMenuRequest()->unfilteredLinkUrl().isEmpty()) { + QString urlString = d->view->lastContextMenuRequest()->unfilteredLinkUrl().toString( + QUrl::FullyEncoded); + QString linkText = d->view->lastContextMenuRequest()->linkText().toHtmlEscaped(); + QString title = d->view->lastContextMenuRequest()->titleText(); if (!title.isEmpty()) title = QStringLiteral(" title=\"%1\"").arg(title.toHtmlEscaped()); QMimeData *data = new QMimeData(); @@ -1441,102 +1438,127 @@ void QWebEnginePage::triggerAction(WebAction action, bool) QString html = QStringLiteral("<a href=\"") + urlString + QStringLiteral("\"") + title + QStringLiteral(">") + linkText + QStringLiteral("</a>"); data->setHtml(html); - data->setUrls(QList<QUrl>() << menuData->unfilteredLinkUrl()); + data->setUrls(QList<QUrl>() << d->view->lastContextMenuRequest()->unfilteredLinkUrl()); qApp->clipboard()->setMimeData(data); } break; case DownloadLinkToDisk: - if (menuData && menuData->linkUrl().isValid()) - d->adapter->download(menuData->linkUrl(), menuData->suggestedFileName(), - menuData->referrerUrl(), menuData->referrerPolicy()); + if (d->view && d->view->lastContextMenuRequest()->filteredLinkUrl().isValid()) + d->adapter->download(d->view->lastContextMenuRequest()->filteredLinkUrl(), + d->view->lastContextMenuRequest()->suggestedFileName(), + d->view->lastContextMenuRequest()->referrerUrl(), + d->view->lastContextMenuRequest()->referrerPolicy()); break; case CopyImageToClipboard: - if (menuData && menuData->hasImageContent() && - (menuData->mediaType() == WebEngineContextMenuData::MediaTypeImage || - menuData->mediaType() == WebEngineContextMenuData::MediaTypeCanvas)) - { - d->adapter->copyImageAt(menuData->position()); + if (d->view && d->view->lastContextMenuRequest()->hasImageContent() + && (d->view->lastContextMenuRequest()->mediaType() + == QWebEngineContextMenuRequest::MediaTypeImage + || d->view->lastContextMenuRequest()->mediaType() + == QWebEngineContextMenuRequest::MediaTypeCanvas)) { + d->adapter->copyImageAt(d->view->lastContextMenuRequest()->position()); } break; case CopyImageUrlToClipboard: - if (menuData && menuData->mediaUrl().isValid() && menuData->mediaType() == WebEngineContextMenuData::MediaTypeImage) { - QString urlString = menuData->mediaUrl().toString(QUrl::FullyEncoded); - QString alt = menuData->altText(); + if (d->view && d->view->lastContextMenuRequest()->mediaUrl().isValid() + && d->view->lastContextMenuRequest()->mediaType() + == QWebEngineContextMenuRequest::MediaTypeImage) { + QString urlString = + d->view->lastContextMenuRequest()->mediaUrl().toString(QUrl::FullyEncoded); + QString alt = d->view->lastContextMenuRequest()->altText(); if (!alt.isEmpty()) alt = QStringLiteral(" alt=\"%1\"").arg(alt.toHtmlEscaped()); - QString title = menuData->titleText(); + QString title = d->view->lastContextMenuRequest()->titleText(); if (!title.isEmpty()) title = QStringLiteral(" title=\"%1\"").arg(title.toHtmlEscaped()); QMimeData *data = new QMimeData(); data->setText(urlString); QString html = QStringLiteral("<img src=\"") + urlString + QStringLiteral("\"") + title + alt + QStringLiteral("></img>"); data->setHtml(html); - data->setUrls(QList<QUrl>() << menuData->mediaUrl()); + data->setUrls(QList<QUrl>() << d->view->lastContextMenuRequest()->mediaUrl()); qApp->clipboard()->setMimeData(data); } break; case DownloadImageToDisk: case DownloadMediaToDisk: - if (menuData && menuData->mediaUrl().isValid()) - d->adapter->download(menuData->mediaUrl(), menuData->suggestedFileName(), - menuData->referrerUrl(), menuData->referrerPolicy()); + if (d->view && d->view->lastContextMenuRequest()->mediaUrl().isValid()) + d->adapter->download(d->view->lastContextMenuRequest()->mediaUrl(), + d->view->lastContextMenuRequest()->suggestedFileName(), + d->view->lastContextMenuRequest()->referrerUrl(), + d->view->lastContextMenuRequest()->referrerPolicy()); break; case CopyMediaUrlToClipboard: - if (menuData && menuData->mediaUrl().isValid() && - (menuData->mediaType() == WebEngineContextMenuData::MediaTypeAudio || - menuData->mediaType() == WebEngineContextMenuData::MediaTypeVideo)) - { - QString urlString = menuData->mediaUrl().toString(QUrl::FullyEncoded); - QString title = menuData->titleText(); + if (d->view && d->view->lastContextMenuRequest()->mediaUrl().isValid() + && (d->view->lastContextMenuRequest()->mediaType() + == QWebEngineContextMenuRequest::MediaTypeAudio + || d->view->lastContextMenuRequest()->mediaType() + == QWebEngineContextMenuRequest::MediaTypeVideo)) { + QString urlString = + d->view->lastContextMenuRequest()->mediaUrl().toString(QUrl::FullyEncoded); + QString title = d->view->lastContextMenuRequest()->titleText(); if (!title.isEmpty()) title = QStringLiteral(" title=\"%1\"").arg(title.toHtmlEscaped()); QMimeData *data = new QMimeData(); data->setText(urlString); - if (menuData->mediaType() == WebEngineContextMenuData::MediaTypeAudio) + if (d->view->lastContextMenuRequest()->mediaType() + == QWebEngineContextMenuRequest::MediaTypeAudio) data->setHtml(QStringLiteral("<audio src=\"") + urlString + QStringLiteral("\"") + title + QStringLiteral("></audio>")); else data->setHtml(QStringLiteral("<video src=\"") + urlString + QStringLiteral("\"") + title + QStringLiteral("></video>")); - data->setUrls(QList<QUrl>() << menuData->mediaUrl()); + data->setUrls(QList<QUrl>() << d->view->lastContextMenuRequest()->mediaUrl()); qApp->clipboard()->setMimeData(data); } break; case ToggleMediaControls: - if (menuData && menuData->mediaUrl().isValid() && menuData->mediaFlags() & WebEngineContextMenuData::MediaCanToggleControls) { - bool enable = !(menuData->mediaFlags() & WebEngineContextMenuData::MediaControls); - d->adapter->executeMediaPlayerActionAt(menuData->position(), WebContentsAdapter::MediaPlayerControls, enable); + if (d->view && d->view->lastContextMenuRequest()->mediaUrl().isValid() + && d->view->lastContextMenuRequest()->mediaFlags() + & QWebEngineContextMenuRequest::MediaCanToggleControls) { + bool enable = !(d->view->lastContextMenuRequest()->mediaFlags() + & QWebEngineContextMenuRequest::MediaControls); + d->adapter->executeMediaPlayerActionAt(d->view->lastContextMenuRequest()->position(), + WebContentsAdapter::MediaPlayerControls, enable); } break; case ToggleMediaLoop: - if (menuData && menuData->mediaUrl().isValid() && - (menuData->mediaType() == WebEngineContextMenuData::MediaTypeAudio || - menuData->mediaType() == WebEngineContextMenuData::MediaTypeVideo)) - { - bool enable = !(menuData->mediaFlags() & WebEngineContextMenuData::MediaLoop); - d->adapter->executeMediaPlayerActionAt(menuData->position(), WebContentsAdapter::MediaPlayerLoop, enable); + if (d->view && d->view->lastContextMenuRequest()->mediaUrl().isValid() + && (d->view->lastContextMenuRequest()->mediaType() + == QWebEngineContextMenuRequest::MediaTypeAudio + || d->view->lastContextMenuRequest()->mediaType() + == QWebEngineContextMenuRequest::MediaTypeVideo)) { + bool enable = !(d->view->lastContextMenuRequest()->mediaFlags() + & QWebEngineContextMenuRequest::MediaLoop); + d->adapter->executeMediaPlayerActionAt(d->view->lastContextMenuRequest()->position(), + WebContentsAdapter::MediaPlayerLoop, enable); } break; case ToggleMediaPlayPause: - if (menuData && menuData->mediaUrl().isValid() && - (menuData->mediaType() == WebEngineContextMenuData::MediaTypeAudio || - menuData->mediaType() == WebEngineContextMenuData::MediaTypeVideo)) - { - bool enable = (menuData->mediaFlags() & WebEngineContextMenuData::MediaPaused); - d->adapter->executeMediaPlayerActionAt(menuData->position(), WebContentsAdapter::MediaPlayerPlay, enable); + if (d->view && d->view->lastContextMenuRequest()->mediaUrl().isValid() + && (d->view->lastContextMenuRequest()->mediaType() + == QWebEngineContextMenuRequest::MediaTypeAudio + || d->view->lastContextMenuRequest()->mediaType() + == QWebEngineContextMenuRequest::MediaTypeVideo)) { + bool enable = (d->view->lastContextMenuRequest()->mediaFlags() + & QWebEngineContextMenuRequest::MediaPaused); + d->adapter->executeMediaPlayerActionAt(d->view->lastContextMenuRequest()->position(), + WebContentsAdapter::MediaPlayerPlay, enable); } break; case ToggleMediaMute: - if (menuData && menuData->mediaUrl().isValid() && menuData->mediaFlags() & WebEngineContextMenuData::MediaHasAudio) { + if (d->view && d->view->lastContextMenuRequest()->mediaUrl().isValid() + && d->view->lastContextMenuRequest()->mediaFlags() + & QWebEngineContextMenuRequest::MediaHasAudio) { // Make sure to negate the value, so that toggling actually works. - bool enable = !(menuData->mediaFlags() & WebEngineContextMenuData::MediaMuted); - d->adapter->executeMediaPlayerActionAt(menuData->position(), WebContentsAdapter::MediaPlayerMute, enable); + bool enable = !(d->view->lastContextMenuRequest()->mediaFlags() + & QWebEngineContextMenuRequest::MediaMuted); + d->adapter->executeMediaPlayerActionAt(d->view->lastContextMenuRequest()->position(), + WebContentsAdapter::MediaPlayerMute, enable); } break; case InspectElement: - if (menuData) - d->adapter->inspectElementAt(menuData->position()); + if (d->view) + d->adapter->inspectElementAt(d->view->lastContextMenuRequest()->position()); break; case ExitFullScreen: // See under ViewSource, anything that can trigger a delete of the current view is dangerous to call directly here. @@ -1607,8 +1629,8 @@ void QWebEnginePage::triggerAction(WebAction action, bool) * \since 5.8 * Replace the current misspelled word with \a replacement. * - * The current misspelled word can be found in QWebEngineContextMenuData::misspelledWord(), - * and suggested replacements in QWebEngineContextMenuData::spellCheckerSuggestions(). + * The current misspelled word can be found in QWebEngineContextMenuRequest::misspelledWord(), + * and suggested replacements in QWebEngineContextMenuRequest::spellCheckerSuggestions(). * * \sa contextMenuData(), */ @@ -1638,7 +1660,7 @@ bool QWebEnginePage::event(QEvent *e) return QObject::event(e); } -void QWebEnginePagePrivate::contextMenuRequested(const WebEngineContextMenuData &data) +void QWebEnginePagePrivate::contextMenuRequested(QWebEngineContextMenuRequest *data) { if (view) view->d_ptr->contextMenuRequested(data); diff --git a/src/webenginewidgets/api/qwebenginepage.h b/src/webenginewidgets/api/qwebenginepage.h index b8a2622f6..97f32e43f 100644 --- a/src/webenginewidgets/api/qwebenginepage.h +++ b/src/webenginewidgets/api/qwebenginepage.h @@ -61,7 +61,6 @@ class QContextMenuBuilder; class QWebChannel; class QWebEngineCertificateError; class QWebEngineClientCertificateSelection; -class QWebEngineContextMenuData; class QWebEngineFindTextResult; class QWebEngineFullScreenRequest; class QWebEngineHistory; diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h index 9a0635ce6..50df343fd 100644 --- a/src/webenginewidgets/api/qwebenginepage_p.h +++ b/src/webenginewidgets/api/qwebenginepage_p.h @@ -115,7 +115,7 @@ public: bool isBeingAdopted() override; void close() override; void windowCloseRejected() override; - void contextMenuRequested(const QtWebEngineCore::WebEngineContextMenuData &data) override; + void contextMenuRequested(QWebEngineContextMenuRequest *request) override; void navigationRequested(int navigationType, const QUrl &url, int &navigationRequestAction, bool isMainFrame) override; void requestFullScreenMode(const QUrl &origin, bool fullscreen) override; bool isFullScreenMode() const override; diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp index d19537320..f30fc3c4d 100644 --- a/src/webenginewidgets/api/qwebengineview.cpp +++ b/src/webenginewidgets/api/qwebengineview.cpp @@ -125,27 +125,24 @@ void QWebEngineViewPrivate::widgetChanged(QtWebEngineCore::RenderWidgetHostViewQ } } -void QWebEngineViewPrivate::contextMenuRequested( - const QtWebEngineCore::WebEngineContextMenuData &data) +void QWebEngineViewPrivate::contextMenuRequested(QWebEngineContextMenuRequest *request) { #if QT_CONFIG(action) - m_contextData.reset(); + m_contextRequest = request; switch (q_ptr->contextMenuPolicy()) { case Qt::DefaultContextMenu: { - m_contextData = data; - QContextMenuEvent event(QContextMenuEvent::Mouse, data.position(), - q_ptr->mapToGlobal(data.position())); + QContextMenuEvent event(QContextMenuEvent::Mouse, request->position(), + q_ptr->mapToGlobal(request->position())); q_ptr->contextMenuEvent(&event); return; } case Qt::CustomContextMenu: - m_contextData = data; - Q_EMIT q_ptr->customContextMenuRequested(data.position()); + Q_EMIT q_ptr->customContextMenuRequested(request->position()); return; case Qt::ActionsContextMenu: if (q_ptr->actions().count()) { - QContextMenuEvent event(QContextMenuEvent::Mouse, data.position(), - q_ptr->mapToGlobal(data.position())); + QContextMenuEvent event(QContextMenuEvent::Mouse, request->position(), + q_ptr->mapToGlobal(request->position())); QMenu::exec(q_ptr->actions(), event.globalPos(), 0, q_ptr); } return; @@ -170,9 +167,7 @@ static QAccessibleInterface *webAccessibleFactory(const QString &, QObject *obje #endif // QT_NO_ACCESSIBILITY QWebEngineViewPrivate::QWebEngineViewPrivate() - : page(0) - , m_dragEntered(false) - , m_ownsPage(false) + : page(0), m_dragEntered(false), m_ownsPage(false), m_contextRequest(nullptr) { #ifndef QT_NO_ACCESSIBILITY QAccessible::installFactory(&webAccessibleFactory); @@ -509,13 +504,8 @@ void QWebEngineView::dropEvent(QDropEvent *e) QMenu *QWebEngineView::createStandardContextMenu() { Q_D(QWebEngineView); - if (!d->m_contextData.d) - return nullptr; - QMenu *menu = new QMenu(this); - const QtWebEngineCore::WebEngineContextMenuData &contextMenuData = *d->m_contextData.d; - - QContextMenuBuilder contextMenuBuilder(contextMenuData, this, menu); + QContextMenuBuilder contextMenuBuilder(d->m_contextRequest, this, menu); contextMenuBuilder.initMenu(); @@ -533,10 +523,10 @@ QMenu *QWebEngineView::createStandardContextMenu() \sa createStandardContextMenu() */ -const QWebEngineContextMenuData &QWebEngineView::contextMenuData() const +QWebEngineContextMenuRequest *QWebEngineView::lastContextMenuRequest() const { Q_D(const QWebEngineView); - return d->m_contextData; + return d->m_contextRequest; } #ifndef QT_NO_ACCESSIBILITY @@ -579,9 +569,9 @@ int QWebEngineViewAccessible::indexOfChild(const QAccessibleInterface *c) const #endif // QT_NO_ACCESSIBILITY #if QT_CONFIG(action) -QContextMenuBuilder::QContextMenuBuilder(const QtWebEngineCore::WebEngineContextMenuData &data, +QContextMenuBuilder::QContextMenuBuilder(QWebEngineContextMenuRequest *request, QWebEngineView *view, QMenu *menu) - : QtWebEngineCore::RenderViewContextMenuQt(data), m_view(view), m_menu(menu) + : QtWebEngineCore::RenderViewContextMenuQt(request), m_view(view), m_menu(menu) { m_view->page()->d_ptr->ensureInitialized(); } @@ -678,9 +668,9 @@ void QContextMenuBuilder::addMenuItem(ContextMenuItem menuItem) action = thisRef->action(QWebEnginePage::ViewSource); break; case ContextMenuItem::SpellingSuggestions: - for (int i = 0; i < m_contextData.spellCheckerSuggestions().count() && i < 4; i++) { + for (int i = 0; i < m_contextData->spellCheckerSuggestions().count() && i < 4; i++) { action = new QAction(m_menu); - QString replacement = m_contextData.spellCheckerSuggestions().at(i); + QString replacement = m_contextData->spellCheckerSuggestions().at(i); QObject::connect(action, &QAction::triggered, [thisRef, replacement] { if (thisRef) thisRef->replaceMisspelledWord(replacement); @@ -708,19 +698,19 @@ bool QContextMenuBuilder::isMenuItemEnabled(ContextMenuItem menuItem) case ContextMenuItem::Reload: return true; case ContextMenuItem::Cut: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanCut; + return m_contextData->editFlags() & QWebEngineContextMenuRequest::CanCut; case ContextMenuItem::Copy: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanCopy; + return m_contextData->editFlags() & QWebEngineContextMenuRequest::CanCopy; case ContextMenuItem::Paste: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanPaste; + return m_contextData->editFlags() & QWebEngineContextMenuRequest::CanPaste; case ContextMenuItem::Undo: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanUndo; + return m_contextData->editFlags() & QWebEngineContextMenuRequest::CanUndo; case ContextMenuItem::Redo: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanRedo; + return m_contextData->editFlags() & QWebEngineContextMenuRequest::CanRedo; case ContextMenuItem::SelectAll: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanSelectAll; + return m_contextData->editFlags() & QWebEngineContextMenuRequest::CanSelectAll; case ContextMenuItem::PasteAndMatchStyle: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanPaste; + return m_contextData->editFlags() & QWebEngineContextMenuRequest::CanPaste; case ContextMenuItem::OpenLinkInNewWindow: case ContextMenuItem::OpenLinkInNewTab: case ContextMenuItem::CopyLinkToClipboard: diff --git a/src/webenginewidgets/api/qwebengineview.h b/src/webenginewidgets/api/qwebengineview.h index f99b65f52..06fbc5ddf 100644 --- a/src/webenginewidgets/api/qwebengineview.h +++ b/src/webenginewidgets/api/qwebengineview.h @@ -47,6 +47,7 @@ #include <QtWebEngineWidgets/qtwebenginewidgetsglobal.h> #include <QtWebEngineWidgets/qwebenginepage.h> #include <QtWebEngineCore/qwebenginehttprequest.h> +#include <QtWebEngineCore/qwebenginecontextmenurequest.h> QT_BEGIN_NAMESPACE class QContextMenuEvent; @@ -104,7 +105,7 @@ public: #if QT_CONFIG(menu) QMenu *createStandardContextMenu(); #endif - const QWebEngineContextMenuData &contextMenuData() const; + QWebEngineContextMenuRequest *lastContextMenuRequest() const; public Q_SLOTS: void stop(); diff --git a/src/webenginewidgets/api/qwebengineview_p.h b/src/webenginewidgets/api/qwebengineview_p.h index a8fa7f45f..29e39d081 100644 --- a/src/webenginewidgets/api/qwebengineview_p.h +++ b/src/webenginewidgets/api/qwebengineview_p.h @@ -52,7 +52,7 @@ // #include <QtWebEngineWidgets/qwebengineview.h> -#include "qwebenginecontextmenudata.h" +#include "qwebenginecontextmenurequest.h" #include "render_view_context_menu_qt.h" #include <QtWidgets/qaccessiblewidget.h> @@ -73,14 +73,14 @@ public: void pageChanged(QWebEnginePage *oldPage, QWebEnginePage *newPage); void widgetChanged(QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget *oldWidget, QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget *newWidget); - void contextMenuRequested(const QtWebEngineCore::WebEngineContextMenuData &data); + void contextMenuRequested(QWebEngineContextMenuRequest *request); QWebEngineViewPrivate(); QWebEnginePage *page; bool m_dragEntered; mutable bool m_ownsPage; - QWebEngineContextMenuData m_contextData; + QWebEngineContextMenuRequest *m_contextRequest; }; #ifndef QT_NO_ACCESSIBILITY @@ -104,8 +104,7 @@ private: class QContextMenuBuilder : public QtWebEngineCore::RenderViewContextMenuQt { public: - QContextMenuBuilder(const QtWebEngineCore::WebEngineContextMenuData &data, QWebEngineView *view, - QMenu *menu); + QContextMenuBuilder(QWebEngineContextMenuRequest *reqeust, QWebEngineView *view, QMenu *menu); private: virtual bool hasInspector() override; diff --git a/src/webenginewidgets/webenginewidgets.pro b/src/webenginewidgets/webenginewidgets.pro index d4fb40dc7..401bd4f0e 100644 --- a/src/webenginewidgets/webenginewidgets.pro +++ b/src/webenginewidgets/webenginewidgets.pro @@ -15,7 +15,6 @@ SOURCES = \ api/qtwebenginewidgetsglobal.cpp \ api/qwebenginecertificateerror.cpp \ api/qwebengineclientcertificateselection.cpp \ - api/qwebenginecontextmenudata.cpp \ api/qwebenginedownloaditem.cpp \ api/qwebenginefullscreenrequest.cpp \ api/qwebenginehistory.cpp \ @@ -32,7 +31,6 @@ HEADERS = \ api/qtwebenginewidgetsglobal.h \ api/qwebenginecertificateerror.h \ api/qwebengineclientcertificateselection.h \ - api/qwebenginecontextmenudata.h \ api/qwebenginedownloaditem.h \ api/qwebenginedownloaditem_p.h \ api/qwebenginefullscreenrequest.h \ diff --git a/tests/auto/quick/dialogs/tst_dialogs.cpp b/tests/auto/quick/dialogs/tst_dialogs.cpp index 8e802a836..dca872aad 100644 --- a/tests/auto/quick/dialogs/tst_dialogs.cpp +++ b/tests/auto/quick/dialogs/tst_dialogs.cpp @@ -30,7 +30,7 @@ #include "server.h" #include "util.h" #include <QtWebEngine/private/qquickwebenginedialogrequests_p.h> -#include <QtWebEngine/private/qquickwebenginecontextmenurequest_p.h> +#include <QtWebEngineCore/qwebenginecontextmenurequest.h> #include <QQuickWebEngineProfile> #include <QQmlApplicationEngine> #include <QQuickWindow> @@ -121,7 +121,7 @@ void tst_Dialogs::contextMenuRequested() QSignalSpy dialogSpy(m_listner, &TestHandler::requestChanged); QTest::mouseClick(m_widnow, Qt::RightButton); QTRY_COMPARE(dialogSpy.count(), 1); - auto dialog = qobject_cast<QQuickWebEngineContextMenuRequest*>(m_listner->request()); + auto dialog = qobject_cast<QWebEngineContextMenuRequest *>(m_listner->request()); QVERIFY2(dialog, "Incorrect dialog requested"); } diff --git a/tests/auto/quick/publicapi/tst_publicapi.cpp b/tests/auto/quick/publicapi/tst_publicapi.cpp index e27eb7253..936d1e948 100644 --- a/tests/auto/quick/publicapi/tst_publicapi.cpp +++ b/tests/auto/quick/publicapi/tst_publicapi.cpp @@ -39,6 +39,7 @@ #include <QtWebEngineCore/QWebEngineNotification> #include <QtWebEngineCore/QWebEngineQuotaRequest> #include <QtWebEngineCore/QWebEngineRegisterProtocolHandlerRequest> +#include <QtWebEngineCore/QWebEngineContextMenuRequest> #include <private/qquickwebengineview_p.h> #include <private/qquickwebengineaction_p.h> #include <private/qquickwebenginecertificateerror_p.h> @@ -51,7 +52,6 @@ #include <private/qquickwebenginenewviewrequest_p.h> #include <private/qquickwebenginesettings_p.h> #include <private/qquickwebenginesingleton_p.h> -#include <private/qquickwebenginecontextmenurequest_p.h> class tst_publicapi : public QObject { Q_OBJECT @@ -82,7 +82,7 @@ static const QList<const QMetaObject *> typesToCheck = QList<const QMetaObject * << &QQuickWebEngineFileDialogRequest::staticMetaObject << &QQuickWebEngineFormValidationMessageRequest::staticMetaObject << &QQuickWebEngineTooltipRequest::staticMetaObject - << &QQuickWebEngineContextMenuRequest::staticMetaObject + << &QWebEngineContextMenuRequest::staticMetaObject << &QWebEngineQuotaRequest::staticMetaObject << &QWebEngineRegisterProtocolHandlerRequest::staticMetaObject << &QWebEngineNotification::staticMetaObject @@ -157,47 +157,46 @@ static const QStringList expectedAPI = QStringList() << "QQuickWebEngineClientCertificateSelection.selectNone() --> void" << "QQuickWebEngineColorDialogRequest.accepted --> bool" << "QQuickWebEngineColorDialogRequest.color --> QColor" - << "QQuickWebEngineContextMenuRequest.CanUndo --> EditFlags" - << "QQuickWebEngineContextMenuRequest.CanRedo --> EditFlags" - << "QQuickWebEngineContextMenuRequest.CanCut --> EditFlags" - << "QQuickWebEngineContextMenuRequest.CanCopy --> EditFlags" - << "QQuickWebEngineContextMenuRequest.CanPaste --> EditFlags" - << "QQuickWebEngineContextMenuRequest.CanDelete --> EditFlags" - << "QQuickWebEngineContextMenuRequest.CanSelectAll --> EditFlags" - << "QQuickWebEngineContextMenuRequest.CanTranslate --> EditFlags" - << "QQuickWebEngineContextMenuRequest.CanEditRichly --> EditFlags" + << "QWebEngineContextMenuRequest.CanUndo --> EditFlags" + << "QWebEngineContextMenuRequest.CanRedo --> EditFlags" + << "QWebEngineContextMenuRequest.CanCut --> EditFlags" + << "QWebEngineContextMenuRequest.CanCopy --> EditFlags" + << "QWebEngineContextMenuRequest.CanPaste --> EditFlags" + << "QWebEngineContextMenuRequest.CanDelete --> EditFlags" + << "QWebEngineContextMenuRequest.CanSelectAll --> EditFlags" + << "QWebEngineContextMenuRequest.CanTranslate --> EditFlags" + << "QWebEngineContextMenuRequest.CanEditRichly --> EditFlags" << "QQuickWebEngineColorDialogRequest.dialogAccept(QColor) --> void" << "QQuickWebEngineColorDialogRequest.dialogReject() --> void" - << "QQuickWebEngineContextMenuRequest.editFlags --> EditFlags" - << "QQuickWebEngineContextMenuRequest.MediaInError --> MediaFlags" - << "QQuickWebEngineContextMenuRequest.MediaPaused --> MediaFlags" - << "QQuickWebEngineContextMenuRequest.MediaMuted --> MediaFlags" - << "QQuickWebEngineContextMenuRequest.MediaLoop --> MediaFlags" - << "QQuickWebEngineContextMenuRequest.MediaCanSave --> MediaFlags" - << "QQuickWebEngineContextMenuRequest.MediaHasAudio --> MediaFlags" - << "QQuickWebEngineContextMenuRequest.MediaCanToggleControls --> MediaFlags" - << "QQuickWebEngineContextMenuRequest.MediaControls --> MediaFlags" - << "QQuickWebEngineContextMenuRequest.MediaCanPrint --> MediaFlags" - << "QQuickWebEngineContextMenuRequest.MediaCanRotate --> MediaFlags" - << "QQuickWebEngineContextMenuRequest.MediaTypeAudio --> MediaType" - << "QQuickWebEngineContextMenuRequest.MediaTypeCanvas --> MediaType" - << "QQuickWebEngineContextMenuRequest.MediaTypeFile --> MediaType" - << "QQuickWebEngineContextMenuRequest.MediaTypeImage --> MediaType" - << "QQuickWebEngineContextMenuRequest.MediaTypeNone --> MediaType" - << "QQuickWebEngineContextMenuRequest.MediaTypePlugin --> MediaType" - << "QQuickWebEngineContextMenuRequest.MediaTypeVideo --> MediaType" - << "QQuickWebEngineContextMenuRequest.accepted --> bool" - << "QQuickWebEngineContextMenuRequest.isContentEditable --> bool" - << "QQuickWebEngineContextMenuRequest.linkText --> QString" - << "QQuickWebEngineContextMenuRequest.linkUrl --> QUrl" - << "QQuickWebEngineContextMenuRequest.mediaFlags --> MediaFlags" - << "QQuickWebEngineContextMenuRequest.mediaType --> MediaType" - << "QQuickWebEngineContextMenuRequest.mediaUrl --> QUrl" - << "QQuickWebEngineContextMenuRequest.misspelledWord --> QString" - << "QQuickWebEngineContextMenuRequest.selectedText --> QString" - << "QQuickWebEngineContextMenuRequest.spellCheckerSuggestions --> QStringList" - << "QQuickWebEngineContextMenuRequest.x --> int" - << "QQuickWebEngineContextMenuRequest.y --> int" + << "QWebEngineContextMenuRequest.editFlags --> EditFlags" + << "QWebEngineContextMenuRequest.MediaInError --> MediaFlags" + << "QWebEngineContextMenuRequest.MediaPaused --> MediaFlags" + << "QWebEngineContextMenuRequest.MediaMuted --> MediaFlags" + << "QWebEngineContextMenuRequest.MediaLoop --> MediaFlags" + << "QWebEngineContextMenuRequest.MediaCanSave --> MediaFlags" + << "QWebEngineContextMenuRequest.MediaHasAudio --> MediaFlags" + << "QWebEngineContextMenuRequest.MediaCanToggleControls --> MediaFlags" + << "QWebEngineContextMenuRequest.MediaControls --> MediaFlags" + << "QWebEngineContextMenuRequest.MediaCanPrint --> MediaFlags" + << "QWebEngineContextMenuRequest.MediaCanRotate --> MediaFlags" + << "QWebEngineContextMenuRequest.MediaTypeAudio --> MediaType" + << "QWebEngineContextMenuRequest.MediaTypeCanvas --> MediaType" + << "QWebEngineContextMenuRequest.MediaTypeFile --> MediaType" + << "QWebEngineContextMenuRequest.MediaTypeImage --> MediaType" + << "QWebEngineContextMenuRequest.MediaTypeNone --> MediaType" + << "QWebEngineContextMenuRequest.MediaTypePlugin --> MediaType" + << "QWebEngineContextMenuRequest.MediaTypeVideo --> MediaType" + << "QWebEngineContextMenuRequest.accepted --> bool" + << "QWebEngineContextMenuRequest.isContentEditable --> bool" + << "QWebEngineContextMenuRequest.linkText --> QString" + << "QWebEngineContextMenuRequest.linkUrl --> QUrl" + << "QWebEngineContextMenuRequest.mediaFlags --> MediaFlags" + << "QWebEngineContextMenuRequest.mediaType --> MediaType" + << "QWebEngineContextMenuRequest.mediaUrl --> QUrl" + << "QWebEngineContextMenuRequest.misspelledWord --> QString" + << "QWebEngineContextMenuRequest.selectedText --> QString" + << "QWebEngineContextMenuRequest.spellCheckerSuggestions --> QStringList" + << "QWebEngineContextMenuRequest.position --> QPoint" << "QQuickWebEngineDownloadItem.Attachment --> DownloadType" << "QQuickWebEngineDownloadItem.CompleteHtmlSaveFormat --> SavePageFormat" << "QQuickWebEngineDownloadItem.DownloadAttribute --> DownloadType" @@ -692,7 +691,7 @@ static const QStringList expectedAPI = QStringList() << "QQuickWebEngineView.colorDialogRequested(QQuickWebEngineColorDialogRequest*) --> void" << "QQuickWebEngineView.contentsSize --> QSizeF" << "QQuickWebEngineView.contentsSizeChanged(QSizeF) --> void" - << "QQuickWebEngineView.contextMenuRequested(QQuickWebEngineContextMenuRequest*) --> void" + << "QQuickWebEngineView.contextMenuRequested(QWebEngineContextMenuRequest*) --> void" << "QQuickWebEngineView.devToolsView --> QQuickWebEngineView*" << "QQuickWebEngineView.devToolsViewChanged() --> void" << "QQuickWebEngineView.featurePermissionRequested(QUrl,Feature) --> void" diff --git a/tests/auto/widgets/spellchecking/tst_spellchecking.cpp b/tests/auto/widgets/spellchecking/tst_spellchecking.cpp index 483c673aa..62007840f 100644 --- a/tests/auto/widgets/spellchecking/tst_spellchecking.cpp +++ b/tests/auto/widgets/spellchecking/tst_spellchecking.cpp @@ -28,7 +28,6 @@ #include "util.h" #include <QtTest/QtTest> -#include <QtWebEngineWidgets/qwebenginecontextmenudata.h> #include <QtWebEngineWidgets/qwebengineprofile.h> #include <QtWebEngineWidgets/qwebenginepage.h> #include <QtWebEngineWidgets/qwebengineview.h> @@ -47,10 +46,7 @@ public: QTest::mouseRelease(widget, Qt::RightButton, {}, position); } - const QWebEngineContextMenuData& data() - { - return m_data; - } + QWebEngineContextMenuRequest *data() { return m_data; } signals: void menuReady(); @@ -58,11 +54,11 @@ signals: protected: void contextMenuEvent(QContextMenuEvent *) { - m_data = contextMenuData(); + m_data = lastContextMenuRequest(); emit menuReady(); } private: - QWebEngineContextMenuData m_data; + QWebEngineContextMenuRequest *m_data; }; class tst_Spellchecking : public QObject @@ -204,17 +200,17 @@ void tst_Spellchecking::spellcheck() return false; } - if (!m_view->data().isValid()) { + if (!m_view->data()) { detail = "invalid data"; return false; } - if (!m_view->data().isContentEditable()) { + if (!m_view->data()->isContentEditable()) { detail = "content is not editable"; return false; } - if (m_view->data().misspelledWord().isEmpty()) { + if (m_view->data()->misspelledWord().isEmpty()) { detail = "no misspelled word"; return false; }; @@ -224,10 +220,10 @@ void tst_Spellchecking::spellcheck() } (), qPrintable(QString("Context menu: %1").arg(detail))); // check misspelled word - QCOMPARE(m_view->data().misspelledWord(), QStringLiteral("lowe")); + QCOMPARE(m_view->data()->misspelledWord(), QStringLiteral("lowe")); // check suggestions - QCOMPARE(m_view->data().spellCheckerSuggestions(), suggestions); + QCOMPARE(m_view->data()->spellCheckerSuggestions(), suggestions); // check replace word m_view->page()->replaceMisspelledWord("love"); |