diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/webenginewidgets/api/qwebenginecontextmenudata.h | 3 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.cpp | 240 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.h | 6 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage_p.h | 19 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview.cpp | 239 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview.h | 5 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview_p.h | 22 |
7 files changed, 272 insertions, 262 deletions
diff --git a/src/webenginewidgets/api/qwebenginecontextmenudata.h b/src/webenginewidgets/api/qwebenginecontextmenudata.h index 5834df31a..16a1f8ad6 100644 --- a/src/webenginewidgets/api/qwebenginecontextmenudata.h +++ b/src/webenginewidgets/api/qwebenginecontextmenudata.h @@ -121,7 +121,8 @@ private: QWebEngineContextMenuData &operator=(const QWebEngineContextDataPrivate &priv); const QWebEngineContextDataPrivate *d; - friend class QWebEnginePagePrivate; + friend class QWebEngineViewPrivate; + friend class QWebEngineView; friend class QWebEnginePage; }; diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index c3439fde5..dc6dec659 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -1360,7 +1360,10 @@ void QWebEnginePage::triggerAction(WebAction action, bool) { Q_D(QWebEnginePage); d->ensureInitialized(); - const QtWebEngineCore::WebEngineContextMenuData *menuData = d->contextData.d; + const QtWebEngineCore::WebEngineContextMenuData *menuData = nullptr; + + if (d->view) + menuData = d->view->contextMenuData().d; switch (action) { case Back: d->adapter->navigateBack(); @@ -1637,38 +1640,8 @@ bool QWebEnginePage::event(QEvent *e) void QWebEnginePagePrivate::contextMenuRequested(const WebEngineContextMenuData &data) { -#if QT_CONFIG(action) - if (!view) - return; - - contextData.reset(); - switch (view->contextMenuPolicy()) { - case Qt::DefaultContextMenu: - { - contextData = data; - QContextMenuEvent event(QContextMenuEvent::Mouse, data.position(), view->mapToGlobal(data.position())); - view->contextMenuEvent(&event); - return; - } - case Qt::CustomContextMenu: - contextData = data; - Q_EMIT view->customContextMenuRequested(data.position()); - return; - case Qt::ActionsContextMenu: - if (view->actions().count()) { - QContextMenuEvent event(QContextMenuEvent::Mouse, data.position(), view->mapToGlobal(data.position())); - QMenu::exec(view->actions(), event.globalPos(), 0, view); - } - return; - case Qt::PreventContextMenu: - case Qt::NoContextMenu: - return; - } - - Q_UNREACHABLE(); -#else - Q_UNUSED(data); -#endif // QT_CONFIG(action) + if (view) + view->d_ptr->contextMenuRequested(data); } void QWebEnginePagePrivate::navigationRequested(int navigationType, const QUrl &url, int &navigationRequestAction, bool isMainFrame) @@ -1886,27 +1859,6 @@ void QWebEnginePage::setUrlRequestInterceptor(QWebEngineUrlRequestInterceptor *i d->adapter->setRequestInterceptor(interceptor); } -#if QT_CONFIG(menu) -QMenu *QWebEnginePage::createStandardContextMenu() -{ - Q_D(QWebEnginePage); - if (!d->contextData.d) - return nullptr; - d->ensureInitialized(); - - QMenu *menu = new QMenu(d->view); - const WebEngineContextMenuData &contextMenuData = *d->contextData.d; - - QContextMenuBuilder contextMenuBuilder(contextMenuData, this, menu); - - contextMenuBuilder.initMenu(); - - menu->setAttribute(Qt::WA_DeleteOnClose, true); - - return menu; -} -#endif // QT_CONFIG(menu) - void QWebEnginePage::setFeaturePermission(const QUrl &securityOrigin, QWebEnginePage::Feature feature, QWebEnginePage::PermissionPolicy policy) { Q_D(QWebEnginePage); @@ -2545,19 +2497,6 @@ void QWebEnginePage::print(QPrinter *printer, const QWebEngineCallback<bool> &re #endif } -/*! - \since 5.7 - - Returns additional data about the current context menu. It is only guaranteed to be valid during the call to the QWebEngineView::contextMenuEvent() - handler of the associated QWebEngineView. - - \sa createStandardContextMenu() -*/ -const QWebEngineContextMenuData &QWebEnginePage::contextMenuData() const -{ - Q_D(const QWebEnginePage); - return d->contextData; -} /*! \enum QWebEnginePage::LifecycleState @@ -2673,173 +2612,6 @@ void QWebEnginePage::setVisible(bool visible) d->adapter->setVisible(visible); } -#if QT_CONFIG(action) -QContextMenuBuilder::QContextMenuBuilder(const QtWebEngineCore::WebEngineContextMenuData &data, - QWebEnginePage *page, - QMenu *menu) - : QtWebEngineCore::RenderViewContextMenuQt(data) - , m_page(page) - , m_menu(menu) -{ -} - -bool QContextMenuBuilder::hasInspector() -{ - return m_page->d_ptr->adapter->hasInspector(); -} - -bool QContextMenuBuilder::isFullScreenMode() -{ - return m_page->d_ptr->isFullScreenMode(); -} - -void QContextMenuBuilder::addMenuItem(ContextMenuItem menuItem) -{ - QPointer<QWebEnginePage> thisRef(m_page); - QAction *action = 0; - - switch (menuItem) { - case ContextMenuItem::Back: - action = thisRef->action(QWebEnginePage::Back); - break; - case ContextMenuItem::Forward: - action = thisRef->action(QWebEnginePage::Forward); - break; - case ContextMenuItem::Reload: - action = thisRef->action(QWebEnginePage::Reload); - break; - case ContextMenuItem::Cut: - action = thisRef->action(QWebEnginePage::Cut); - break; - case ContextMenuItem::Copy: - action = thisRef->action(QWebEnginePage::Copy); - break; - case ContextMenuItem::Paste: - action = thisRef->action(QWebEnginePage::Paste); - break; - case ContextMenuItem::Undo: - action = thisRef->action(QWebEnginePage::Undo); - break; - case ContextMenuItem::Redo: - action = thisRef->action(QWebEnginePage::Redo); - break; - case ContextMenuItem::SelectAll: - action = thisRef->action(QWebEnginePage::SelectAll); - break; - case ContextMenuItem::PasteAndMatchStyle: - action = thisRef->action(QWebEnginePage::PasteAndMatchStyle); - break; - case ContextMenuItem::OpenLinkInNewWindow: - action = thisRef->action(QWebEnginePage::OpenLinkInNewWindow); - break; - case ContextMenuItem::OpenLinkInNewTab: - action = thisRef->action(QWebEnginePage::OpenLinkInNewTab); - break; - case ContextMenuItem::CopyLinkToClipboard: - action = thisRef->action(QWebEnginePage::CopyLinkToClipboard); - break; - case ContextMenuItem::DownloadLinkToDisk: - action = thisRef->action(QWebEnginePage::DownloadLinkToDisk); - break; - case ContextMenuItem::CopyImageToClipboard: - action = thisRef->action(QWebEnginePage::CopyImageToClipboard); - break; - case ContextMenuItem::CopyImageUrlToClipboard: - action = thisRef->action(QWebEnginePage::CopyImageUrlToClipboard); - break; - case ContextMenuItem::DownloadImageToDisk: - action = thisRef->action(QWebEnginePage::DownloadImageToDisk); - break; - case ContextMenuItem::CopyMediaUrlToClipboard: - action = thisRef->action(QWebEnginePage::CopyMediaUrlToClipboard); - break; - case ContextMenuItem::ToggleMediaControls: - action = thisRef->action(QWebEnginePage::ToggleMediaControls); - break; - case ContextMenuItem::ToggleMediaLoop: - action = thisRef->action(QWebEnginePage::ToggleMediaLoop); - break; - case ContextMenuItem::DownloadMediaToDisk: - action = thisRef->action(QWebEnginePage::DownloadMediaToDisk); - break; - case ContextMenuItem::InspectElement: - action = thisRef->action(QWebEnginePage::InspectElement); - break; - case ContextMenuItem::ExitFullScreen: - action = thisRef->action(QWebEnginePage::ExitFullScreen); - break; - case ContextMenuItem::SavePage: - action = thisRef->action(QWebEnginePage::SavePage); - break; - case ContextMenuItem::ViewSource: - action = thisRef->action(QWebEnginePage::ViewSource); - break; - case ContextMenuItem::SpellingSuggestions: - for (int i=0; i < m_contextData.spellCheckerSuggestions().count() && i < 4; i++) { - action = new QAction(m_menu); - QString replacement = m_contextData.spellCheckerSuggestions().at(i); - QObject::connect(action, &QAction::triggered, [thisRef, replacement] { if (thisRef) thisRef->replaceMisspelledWord(replacement); }); - action->setText(replacement); - m_menu->addAction(action); - } - return; - case ContextMenuItem::Separator: - if (!m_menu->isEmpty()) - m_menu->addSeparator(); - return; - } - action->setEnabled(isMenuItemEnabled(menuItem)); - m_menu->addAction(action); -} - -bool QContextMenuBuilder::isMenuItemEnabled(ContextMenuItem menuItem) -{ - switch (menuItem) { - case ContextMenuItem::Back: - return m_page->d_ptr->adapter->canGoBack(); - case ContextMenuItem::Forward: - return m_page->d_ptr->adapter->canGoForward(); - case ContextMenuItem::Reload: - return true; - case ContextMenuItem::Cut: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanCut; - case ContextMenuItem::Copy: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanCopy; - case ContextMenuItem::Paste: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanPaste; - case ContextMenuItem::Undo: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanUndo; - case ContextMenuItem::Redo: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanRedo; - case ContextMenuItem::SelectAll: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanSelectAll; - case ContextMenuItem::PasteAndMatchStyle: - return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanPaste; - case ContextMenuItem::OpenLinkInNewWindow: - case ContextMenuItem::OpenLinkInNewTab: - case ContextMenuItem::CopyLinkToClipboard: - case ContextMenuItem::DownloadLinkToDisk: - case ContextMenuItem::CopyImageToClipboard: - case ContextMenuItem::CopyImageUrlToClipboard: - case ContextMenuItem::DownloadImageToDisk: - case ContextMenuItem::CopyMediaUrlToClipboard: - case ContextMenuItem::ToggleMediaControls: - case ContextMenuItem::ToggleMediaLoop: - case ContextMenuItem::DownloadMediaToDisk: - case ContextMenuItem::InspectElement: - case ContextMenuItem::ExitFullScreen: - case ContextMenuItem::SavePage: - return true; - case ContextMenuItem::ViewSource: - return m_page->d_ptr->adapter->canViewSource(); - case ContextMenuItem::SpellingSuggestions: - case ContextMenuItem::Separator: - return true; - } - Q_UNREACHABLE(); -} -#endif // QT_CONFIG(action) - QT_END_NAMESPACE #include "moc_qwebenginepage.cpp" diff --git a/src/webenginewidgets/api/qwebenginepage.h b/src/webenginewidgets/api/qwebenginepage.h index 3cf6a9f8b..b8a2622f6 100644 --- a/src/webenginewidgets/api/qwebenginepage.h +++ b/src/webenginewidgets/api/qwebenginepage.h @@ -259,10 +259,6 @@ public: void findText(const QString &subString, FindFlags options = FindFlags(), const QWebEngineCallback<bool> &resultCallback = QWebEngineCallback<bool>()); -#if QT_CONFIG(menu) - QMenu *createStandardContextMenu(); -#endif - void setFeaturePermission(const QUrl &securityOrigin, Feature feature, PermissionPolicy policy); void load(const QUrl &url); @@ -319,8 +315,6 @@ public: void setUrlRequestInterceptor(QWebEngineUrlRequestInterceptor *interceptor); - const QWebEngineContextMenuData &contextMenuData() const; - LifecycleState lifecycleState() const; void setLifecycleState(LifecycleState state); diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h index 847684198..9a0635ce6 100644 --- a/src/webenginewidgets/api/qwebenginepage_p.h +++ b/src/webenginewidgets/api/qwebenginepage_p.h @@ -54,9 +54,7 @@ #include "qwebenginepage.h" #include "qwebenginecallback_p.h" -#include "qwebenginecontextmenudata.h" #include "qwebenginescriptcollection.h" -#include "render_view_context_menu_qt.h" #include "web_contents_adapter_client.h" #include <QtCore/qcompilerdetection.h> @@ -184,7 +182,6 @@ public: QWebEngineSettings *settings; QWebEngineView *view; QUrl url; - QWebEngineContextMenuData contextData; bool isLoading; QWebEngineScriptCollection scriptCollection; bool m_isBeingAdopted; @@ -210,22 +207,6 @@ public: QList<QSharedPointer<CertificateErrorController>> m_certificateErrorControllers; }; -class QContextMenuBuilder : public QtWebEngineCore::RenderViewContextMenuQt -{ -public: - QContextMenuBuilder(const QtWebEngineCore::WebEngineContextMenuData &data, QWebEnginePage *page, QMenu *menu); - -private: - virtual bool hasInspector() override; - virtual bool isFullScreenMode() override; - - virtual void addMenuItem(ContextMenuItem entry) override; - virtual bool isMenuItemEnabled(ContextMenuItem entry) override; - - QWebEnginePage *m_page; - QMenu *m_menu; -}; - QT_END_NAMESPACE #endif // QWEBENGINEPAGE_P_H diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp index d4ea83ede..d19537320 100644 --- a/src/webenginewidgets/api/qwebengineview.cpp +++ b/src/webenginewidgets/api/qwebengineview.cpp @@ -125,6 +125,41 @@ void QWebEngineViewPrivate::widgetChanged(QtWebEngineCore::RenderWidgetHostViewQ } } +void QWebEngineViewPrivate::contextMenuRequested( + const QtWebEngineCore::WebEngineContextMenuData &data) +{ +#if QT_CONFIG(action) + m_contextData.reset(); + switch (q_ptr->contextMenuPolicy()) { + case Qt::DefaultContextMenu: { + m_contextData = data; + QContextMenuEvent event(QContextMenuEvent::Mouse, data.position(), + q_ptr->mapToGlobal(data.position())); + q_ptr->contextMenuEvent(&event); + return; + } + case Qt::CustomContextMenu: + m_contextData = data; + Q_EMIT q_ptr->customContextMenuRequested(data.position()); + return; + case Qt::ActionsContextMenu: + if (q_ptr->actions().count()) { + QContextMenuEvent event(QContextMenuEvent::Mouse, data.position(), + q_ptr->mapToGlobal(data.position())); + QMenu::exec(q_ptr->actions(), event.globalPos(), 0, q_ptr); + } + return; + case Qt::PreventContextMenu: + case Qt::NoContextMenu: + return; + } + + Q_UNREACHABLE(); +#else + Q_UNUSED(data); +#endif // QT_CONFIG(action) +} + #ifndef QT_NO_ACCESSIBILITY static QAccessibleInterface *webAccessibleFactory(const QString &, QObject *object) { @@ -378,7 +413,7 @@ bool QWebEngineView::event(QEvent *ev) #if QT_CONFIG(contextmenu) void QWebEngineView::contextMenuEvent(QContextMenuEvent *event) { - QMenu *menu = page()->createStandardContextMenu(); + QMenu *menu = createStandardContextMenu(); menu->popup(event->globalPos()); } #endif // QT_CONFIG(contextmenu) @@ -470,6 +505,40 @@ void QWebEngineView::dropEvent(QDropEvent *e) } #endif // QT_CONFIG(draganddrop) +#if QT_CONFIG(menu) +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); + + contextMenuBuilder.initMenu(); + + menu->setAttribute(Qt::WA_DeleteOnClose, true); + + return menu; +} +#endif // QT_CONFIG(menu) + +/*! + \since 6.0 + + Returns additional data about the current context menu. It is only guaranteed to be valid during + the call to the contextMenuEvent() + + \sa createStandardContextMenu() +*/ +const QWebEngineContextMenuData &QWebEngineView::contextMenuData() const +{ + Q_D(const QWebEngineView); + return d->m_contextData; +} + #ifndef QT_NO_ACCESSIBILITY bool QWebEngineViewAccessible::isValid() const { @@ -509,6 +578,174 @@ int QWebEngineViewAccessible::indexOfChild(const QAccessibleInterface *c) const } #endif // QT_NO_ACCESSIBILITY +#if QT_CONFIG(action) +QContextMenuBuilder::QContextMenuBuilder(const QtWebEngineCore::WebEngineContextMenuData &data, + QWebEngineView *view, QMenu *menu) + : QtWebEngineCore::RenderViewContextMenuQt(data), m_view(view), m_menu(menu) +{ + m_view->page()->d_ptr->ensureInitialized(); +} + +bool QContextMenuBuilder::hasInspector() +{ + return m_view->page()->d_ptr->adapter->hasInspector(); +} + +bool QContextMenuBuilder::isFullScreenMode() +{ + return m_view->page()->d_ptr->isFullScreenMode(); +} + +void QContextMenuBuilder::addMenuItem(ContextMenuItem menuItem) +{ + QPointer<QWebEnginePage> thisRef(m_view->page()); + QAction *action = 0; + + switch (menuItem) { + case ContextMenuItem::Back: + action = thisRef->action(QWebEnginePage::Back); + break; + case ContextMenuItem::Forward: + action = thisRef->action(QWebEnginePage::Forward); + break; + case ContextMenuItem::Reload: + action = thisRef->action(QWebEnginePage::Reload); + break; + case ContextMenuItem::Cut: + action = thisRef->action(QWebEnginePage::Cut); + break; + case ContextMenuItem::Copy: + action = thisRef->action(QWebEnginePage::Copy); + break; + case ContextMenuItem::Paste: + action = thisRef->action(QWebEnginePage::Paste); + break; + case ContextMenuItem::Undo: + action = thisRef->action(QWebEnginePage::Undo); + break; + case ContextMenuItem::Redo: + action = thisRef->action(QWebEnginePage::Redo); + break; + case ContextMenuItem::SelectAll: + action = thisRef->action(QWebEnginePage::SelectAll); + break; + case ContextMenuItem::PasteAndMatchStyle: + action = thisRef->action(QWebEnginePage::PasteAndMatchStyle); + break; + case ContextMenuItem::OpenLinkInNewWindow: + action = thisRef->action(QWebEnginePage::OpenLinkInNewWindow); + break; + case ContextMenuItem::OpenLinkInNewTab: + action = thisRef->action(QWebEnginePage::OpenLinkInNewTab); + break; + case ContextMenuItem::CopyLinkToClipboard: + action = thisRef->action(QWebEnginePage::CopyLinkToClipboard); + break; + case ContextMenuItem::DownloadLinkToDisk: + action = thisRef->action(QWebEnginePage::DownloadLinkToDisk); + break; + case ContextMenuItem::CopyImageToClipboard: + action = thisRef->action(QWebEnginePage::CopyImageToClipboard); + break; + case ContextMenuItem::CopyImageUrlToClipboard: + action = thisRef->action(QWebEnginePage::CopyImageUrlToClipboard); + break; + case ContextMenuItem::DownloadImageToDisk: + action = thisRef->action(QWebEnginePage::DownloadImageToDisk); + break; + case ContextMenuItem::CopyMediaUrlToClipboard: + action = thisRef->action(QWebEnginePage::CopyMediaUrlToClipboard); + break; + case ContextMenuItem::ToggleMediaControls: + action = thisRef->action(QWebEnginePage::ToggleMediaControls); + break; + case ContextMenuItem::ToggleMediaLoop: + action = thisRef->action(QWebEnginePage::ToggleMediaLoop); + break; + case ContextMenuItem::DownloadMediaToDisk: + action = thisRef->action(QWebEnginePage::DownloadMediaToDisk); + break; + case ContextMenuItem::InspectElement: + action = thisRef->action(QWebEnginePage::InspectElement); + break; + case ContextMenuItem::ExitFullScreen: + action = thisRef->action(QWebEnginePage::ExitFullScreen); + break; + case ContextMenuItem::SavePage: + action = thisRef->action(QWebEnginePage::SavePage); + break; + case ContextMenuItem::ViewSource: + action = thisRef->action(QWebEnginePage::ViewSource); + break; + case ContextMenuItem::SpellingSuggestions: + for (int i = 0; i < m_contextData.spellCheckerSuggestions().count() && i < 4; i++) { + action = new QAction(m_menu); + QString replacement = m_contextData.spellCheckerSuggestions().at(i); + QObject::connect(action, &QAction::triggered, [thisRef, replacement] { + if (thisRef) + thisRef->replaceMisspelledWord(replacement); + }); + action->setText(replacement); + m_menu->addAction(action); + } + return; + case ContextMenuItem::Separator: + if (!m_menu->isEmpty()) + m_menu->addSeparator(); + return; + } + action->setEnabled(isMenuItemEnabled(menuItem)); + m_menu->addAction(action); +} + +bool QContextMenuBuilder::isMenuItemEnabled(ContextMenuItem menuItem) +{ + switch (menuItem) { + case ContextMenuItem::Back: + return m_view->page()->d_ptr->adapter->canGoBack(); + case ContextMenuItem::Forward: + return m_view->page()->d_ptr->adapter->canGoForward(); + case ContextMenuItem::Reload: + return true; + case ContextMenuItem::Cut: + return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanCut; + case ContextMenuItem::Copy: + return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanCopy; + case ContextMenuItem::Paste: + return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanPaste; + case ContextMenuItem::Undo: + return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanUndo; + case ContextMenuItem::Redo: + return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanRedo; + case ContextMenuItem::SelectAll: + return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanSelectAll; + case ContextMenuItem::PasteAndMatchStyle: + return m_contextData.editFlags() & QtWebEngineCore::WebEngineContextMenuData::CanPaste; + case ContextMenuItem::OpenLinkInNewWindow: + case ContextMenuItem::OpenLinkInNewTab: + case ContextMenuItem::CopyLinkToClipboard: + case ContextMenuItem::DownloadLinkToDisk: + case ContextMenuItem::CopyImageToClipboard: + case ContextMenuItem::CopyImageUrlToClipboard: + case ContextMenuItem::DownloadImageToDisk: + case ContextMenuItem::CopyMediaUrlToClipboard: + case ContextMenuItem::ToggleMediaControls: + case ContextMenuItem::ToggleMediaLoop: + case ContextMenuItem::DownloadMediaToDisk: + case ContextMenuItem::InspectElement: + case ContextMenuItem::ExitFullScreen: + case ContextMenuItem::SavePage: + return true; + case ContextMenuItem::ViewSource: + return m_view->page()->d_ptr->adapter->canViewSource(); + case ContextMenuItem::SpellingSuggestions: + case ContextMenuItem::Separator: + return true; + } + Q_UNREACHABLE(); +} +#endif // QT_CONFIG(action) + QT_END_NAMESPACE #include "moc_qwebengineview.cpp" diff --git a/src/webenginewidgets/api/qwebengineview.h b/src/webenginewidgets/api/qwebengineview.h index 04c8ece74..f99b65f52 100644 --- a/src/webenginewidgets/api/qwebengineview.h +++ b/src/webenginewidgets/api/qwebengineview.h @@ -101,6 +101,11 @@ public: QSize sizeHint() const override; QWebEngineSettings *settings() const; +#if QT_CONFIG(menu) + QMenu *createStandardContextMenu(); +#endif + const QWebEngineContextMenuData &contextMenuData() const; + public Q_SLOTS: void stop(); void back(); diff --git a/src/webenginewidgets/api/qwebengineview_p.h b/src/webenginewidgets/api/qwebengineview_p.h index a3c619cea..a8fa7f45f 100644 --- a/src/webenginewidgets/api/qwebengineview_p.h +++ b/src/webenginewidgets/api/qwebengineview_p.h @@ -52,7 +52,8 @@ // #include <QtWebEngineWidgets/qwebengineview.h> - +#include "qwebenginecontextmenudata.h" +#include "render_view_context_menu_qt.h" #include <QtWidgets/qaccessiblewidget.h> namespace QtWebEngineCore { @@ -72,12 +73,14 @@ public: void pageChanged(QWebEnginePage *oldPage, QWebEnginePage *newPage); void widgetChanged(QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget *oldWidget, QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget *newWidget); + void contextMenuRequested(const QtWebEngineCore::WebEngineContextMenuData &data); QWebEngineViewPrivate(); QWebEnginePage *page; bool m_dragEntered; mutable bool m_ownsPage; + QWebEngineContextMenuData m_contextData; }; #ifndef QT_NO_ACCESSIBILITY @@ -98,6 +101,23 @@ private: }; #endif // QT_NO_ACCESSIBILITY +class QContextMenuBuilder : public QtWebEngineCore::RenderViewContextMenuQt +{ +public: + QContextMenuBuilder(const QtWebEngineCore::WebEngineContextMenuData &data, QWebEngineView *view, + QMenu *menu); + +private: + virtual bool hasInspector() override; + virtual bool isFullScreenMode() override; + + virtual void addMenuItem(ContextMenuItem entry) override; + virtual bool isMenuItemEnabled(ContextMenuItem entry) override; + + QWebEngineView *m_view; + QMenu *m_menu; +}; + QT_END_NAMESPACE #endif // QWEBENGINEVIEW_P_H |