diff options
Diffstat (limited to 'src/webenginewidgets/api')
-rw-r--r-- | src/webenginewidgets/api/qwebenginecontextmenudata.cpp | 87 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginecontextmenudata.h | 36 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.cpp | 298 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.h | 2 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage_p.h | 17 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginesettings.cpp | 2 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginesettings.h | 1 |
7 files changed, 341 insertions, 102 deletions
diff --git a/src/webenginewidgets/api/qwebenginecontextmenudata.cpp b/src/webenginewidgets/api/qwebenginecontextmenudata.cpp index 63e11175b..82c17fe3b 100644 --- a/src/webenginewidgets/api/qwebenginecontextmenudata.cpp +++ b/src/webenginewidgets/api/qwebenginecontextmenudata.cpp @@ -43,6 +43,7 @@ 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) @@ -51,6 +52,31 @@ ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypeCanvas, Q ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypeFile, QWebEngineContextMenuData::MediaTypeFile) ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypePlugin, QWebEngineContextMenuData::MediaTypePlugin) +// Match MediaFlag enum +ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaNone, QWebEngineContextMenuData::MediaNone) +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::CanDoNone, QWebEngineContextMenuData::CanDoNone) +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 @@ -78,6 +104,46 @@ ASSERT_ENUMS_MATCH(QtWebEngineCore::WebEngineContextMenuData::MediaTypePlugin, Q */ /*! + \enum QWebEngineContextMenuData::EditFlag + \readonly + \since 5.11 + + The available edit operations in the current context. + + \value CanDoNone Nothing can be done. + \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 MediaNone 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) @@ -224,4 +290,25 @@ QWebEngineContextMenuData &QWebEngineContextMenuData::operator=(const QWebEngine 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 +{ + if (d) + return static_cast<QWebEngineContextMenuData::MediaFlags>(d->mediaFlags()); + return QWebEngineContextMenuData::MediaNone; +} + +/*! + Returns the available edit operations in the current context or \c CanDoNone if no actions are available. +*/ +QWebEngineContextMenuData::EditFlags QWebEngineContextMenuData::editFlags() const +{ + if (d) + return static_cast<QWebEngineContextMenuData::EditFlags>(d->editFlags()); + return QWebEngineContextMenuData::CanDoNone; +} + QT_END_NAMESPACE diff --git a/src/webenginewidgets/api/qwebenginecontextmenudata.h b/src/webenginewidgets/api/qwebenginecontextmenudata.h index 97cfe9f65..8c2e9c5e5 100644 --- a/src/webenginewidgets/api/qwebenginecontextmenudata.h +++ b/src/webenginewidgets/api/qwebenginecontextmenudata.h @@ -67,6 +67,38 @@ public: MediaTypeFile, MediaTypePlugin }; + + // Must match QWebEngineCore::WebEngineContextMenuData::MediaFlags: + enum MediaFlag { + MediaNone = 0x0, + 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) + + // Must match QWebEngineCore::WebEngineContextMenuData::EditFlags: + enum EditFlag { + CanDoNone = 0x0, + CanUndo = 0x1, + CanRedo = 0x2, + CanCut = 0x4, + CanCopy = 0x8, + CanPaste = 0x10, + CanDelete = 0x20, + CanSelectAll = 0x40, + CanTranslate = 0x80, + CanEditRichly = 0x100, + }; + Q_DECLARE_FLAGS(EditFlags, EditFlag) + bool isValid() const; QPoint position() const; @@ -78,12 +110,16 @@ public: 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; + Q_FLAGS(MediaFlags) + Q_FLAGS(EditFlags) friend class QWebEnginePagePrivate; friend class QWebEnginePage; diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index a81c749f6..88ad7e447 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -1047,11 +1047,11 @@ QAction *QWebEnginePage::action(WebAction action) const switch (action) { case Back: - text = tr("Back"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::Back); icon = style->standardIcon(QStyle::SP_ArrowBack); break; case Forward: - text = tr("Forward"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::Forward); icon = style->standardIcon(QStyle::SP_ArrowForward); break; case Stop: @@ -1059,7 +1059,7 @@ QAction *QWebEnginePage::action(WebAction action) const icon = style->standardIcon(QStyle::SP_BrowserStop); break; case Reload: - text = tr("Reload"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::Reload); icon = style->standardIcon(QStyle::SP_BrowserReload); break; case ReloadAndBypassCache: @@ -1067,61 +1067,61 @@ QAction *QWebEnginePage::action(WebAction action) const icon = style->standardIcon(QStyle::SP_BrowserReload); break; case Cut: - text = tr("Cut"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::Cut); break; case Copy: - text = tr("Copy"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::Copy); break; case Paste: - text = tr("Paste"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::Paste); break; case Undo: - text = tr("Undo"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::Undo); break; case Redo: - text = tr("Redo"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::Redo); break; case SelectAll: - text = tr("Select All"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::SelectAll); break; case PasteAndMatchStyle: - text = tr("Paste and Match Style"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::PasteAndMatchStyle); break; case OpenLinkInThisWindow: - text = tr("Open Link in This Window"); + text = tr("Open link in this window"); break; case OpenLinkInNewWindow: - text = tr("Open Link in New Window"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::OpenLinkInNewWindow); break; case OpenLinkInNewTab: - text = tr("Open Link in New Tab"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::OpenLinkInNewTab); break; case OpenLinkInNewBackgroundTab: - text = tr("Open Link in New Background Tab"); + text = tr("Open link in new background tab"); break; case CopyLinkToClipboard: - text = tr("Copy Link URL"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::CopyLinkToClipboard); break; case DownloadLinkToDisk: - text = tr("Save Link"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::DownloadLinkToDisk); break; case CopyImageToClipboard: - text = tr("Copy Image"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::CopyImageToClipboard); break; case CopyImageUrlToClipboard: - text = tr("Copy Image URL"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::CopyImageUrlToClipboard); break; case DownloadImageToDisk: - text = tr("Save Image"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::DownloadImageToDisk); break; case CopyMediaUrlToClipboard: - text = tr("Copy Media URL"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::CopyMediaUrlToClipboard); break; case ToggleMediaControls: - text = tr("Toggle Media Controls"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::ToggleMediaControls); break; case ToggleMediaLoop: - text = tr("Toggle Looping"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::ToggleMediaLoop); break; case ToggleMediaPlayPause: text = tr("Toggle Play/Pause"); @@ -1130,13 +1130,13 @@ QAction *QWebEnginePage::action(WebAction action) const text = tr("Toggle Mute"); break; case DownloadMediaToDisk: - text = tr("Save Media"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::DownloadMediaToDisk); break; case InspectElement: - text = tr("Inspect Element"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::InspectElement); break; case ExitFullScreen: - text = tr("Exit Full Screen Mode"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::ExitFullScreen); break; case RequestClose: text = tr("Close Page"); @@ -1145,10 +1145,10 @@ QAction *QWebEnginePage::action(WebAction action) const text = tr("Unselect"); break; case SavePage: - text = tr("Save &Page"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::SavePage); break; case ViewSource: - text = tr("&View Page Source"); + text = RenderViewContextMenuQt::getMenuItemName(RenderViewContextMenuQt::ContextMenuItem::ViewSource); break; case ToggleBold: text = tr("&Bold"); @@ -1661,84 +1661,11 @@ QMenu *QWebEnginePage::createStandardContextMenu() return nullptr; QMenu *menu = new QMenu(d->view); - QAction *action = 0; const WebEngineContextMenuData &contextMenuData = *d->contextData.d; - if (contextMenuData.isEditable() && !contextMenuData.spellCheckerSuggestions().isEmpty()) { - QPointer<QWebEnginePage> thisRef(this); - for (int i=0; i < contextMenuData.spellCheckerSuggestions().count() && i < 4; i++) { - QAction *action = new QAction(menu); - QString replacement = contextMenuData.spellCheckerSuggestions().at(i); - QObject::connect(action, &QAction::triggered, [thisRef, replacement] { if (thisRef) thisRef->replaceMisspelledWord(replacement); }); - action->setText(replacement); - menu->addAction(action); - } - menu->addSeparator(); - } - - if (contextMenuData.linkUrl().isValid()) { - action = QWebEnginePage::action(OpenLinkInThisWindow); - action->setText(tr("Follow Link")); - menu->addAction(action); - menu->addAction(QWebEnginePage::action(DownloadLinkToDisk)); - } - if (contextMenuData.selectedText().isEmpty()) { - action = new QAction(QIcon::fromTheme(QStringLiteral("go-previous")), tr("&Back"), menu); - connect(action, &QAction::triggered, d->view, &QWebEngineView::back); - action->setEnabled(d->adapter->canGoBack()); - menu->addAction(action); - - action = new QAction(QIcon::fromTheme(QStringLiteral("go-next")), tr("&Forward"), menu); - connect(action, &QAction::triggered, d->view, &QWebEngineView::forward); - action->setEnabled(d->adapter->canGoForward()); - menu->addAction(action); - - action = new QAction(QIcon::fromTheme(QStringLiteral("view-refresh")), tr("&Reload"), menu); - connect(action, &QAction::triggered, d->view, &QWebEngineView::reload); - menu->addAction(action); - - menu->addAction(QWebEnginePage::action(ViewSource)); - } else { - menu->addAction(QWebEnginePage::action(Copy)); - menu->addAction(QWebEnginePage::action(Unselect)); - } - - if (!contextMenuData.linkText().isEmpty() && !contextMenuData.unfilteredLinkUrl().isEmpty()) { - menu->addAction(QWebEnginePage::action(CopyLinkToClipboard)); - } - if (contextMenuData.mediaUrl().isValid()) { - switch (contextMenuData.mediaType()) { - case WebEngineContextMenuData::MediaTypeImage: - menu->addAction(QWebEnginePage::action(DownloadImageToDisk)); - menu->addAction(QWebEnginePage::action(CopyImageUrlToClipboard)); - menu->addAction(QWebEnginePage::action(CopyImageToClipboard)); - break; - case WebEngineContextMenuData::MediaTypeCanvas: - Q_UNREACHABLE(); // mediaUrl is invalid for canvases - break; - case WebEngineContextMenuData::MediaTypeAudio: - case WebEngineContextMenuData::MediaTypeVideo: - menu->addAction(QWebEnginePage::action(DownloadMediaToDisk)); - menu->addAction(QWebEnginePage::action(CopyMediaUrlToClipboard)); - menu->addAction(QWebEnginePage::action(ToggleMediaPlayPause)); - menu->addAction(QWebEnginePage::action(ToggleMediaLoop)); - if (contextMenuData.mediaFlags() & WebEngineContextMenuData::MediaHasAudio) - menu->addAction(QWebEnginePage::action(ToggleMediaMute)); - if (contextMenuData.mediaFlags() & WebEngineContextMenuData::MediaCanToggleControls) - menu->addAction(QWebEnginePage::action(ToggleMediaControls)); - break; - default: - break; - } - } else if (contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeCanvas) { - menu->addAction(QWebEnginePage::action(CopyImageToClipboard)); - } + QContextMenuBuilder contextMenuBuilder(contextMenuData, this, menu); - if (d->adapter->hasInspector()) - menu->addAction(QWebEnginePage::action(InspectElement)); - - if (d->isFullScreenMode()) - menu->addAction(QWebEnginePage::action(ExitFullScreen)); + contextMenuBuilder.initMenu(); menu->setAttribute(Qt::WA_DeleteOnClose, true); @@ -2314,6 +2241,173 @@ const QWebEngineContextMenuData &QWebEnginePage::contextMenuData() const return d->contextData; } +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 = new QAction(QIcon::fromTheme(QStringLiteral("go-previous")), QWebEnginePage::tr("&Back"), m_menu); + QObject::connect(action, &QAction::triggered, thisRef->d_ptr->view, &QWebEngineView::back); + break; + case ContextMenuItem::Forward: + action = new QAction(QIcon::fromTheme(QStringLiteral("go-next")), QWebEnginePage::tr("&Forward"), m_menu); + QObject::connect(action, &QAction::triggered, thisRef->d_ptr->view, &QWebEngineView::forward); + break; + case ContextMenuItem::Reload: + action = new QAction(QIcon::fromTheme(QStringLiteral("view-refresh")), QWebEnginePage::tr("&Reload"), m_menu); + QObject::connect(action, &QAction::triggered, thisRef->d_ptr->view, &QWebEngineView::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: + 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(); +} + QT_END_NAMESPACE #include "moc_qwebenginepage.cpp" diff --git a/src/webenginewidgets/api/qwebenginepage.h b/src/webenginewidgets/api/qwebenginepage.h index 531eef6e9..7ce72258b 100644 --- a/src/webenginewidgets/api/qwebenginepage.h +++ b/src/webenginewidgets/api/qwebenginepage.h @@ -57,6 +57,7 @@ QT_BEGIN_NAMESPACE class QMenu; class QPrinter; +class QContextMenuBuilder; class QWebChannel; class QWebEngineContextMenuData; class QWebEngineFullScreenRequest; @@ -374,6 +375,7 @@ private: Q_PRIVATE_SLOT(d_func(), void _q_webActionTriggered(bool checked)) #endif + friend class QContextMenuBuilder; friend class QWebEngineFullScreenRequest; friend class QWebEngineView; friend class QWebEngineViewPrivate; diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h index 270849aee..301028e39 100644 --- a/src/webenginewidgets/api/qwebenginepage_p.h +++ b/src/webenginewidgets/api/qwebenginepage_p.h @@ -56,6 +56,7 @@ #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> @@ -186,6 +187,22 @@ public: #endif }; +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/qwebenginesettings.cpp b/src/webenginewidgets/api/qwebenginesettings.cpp index b829c5799..32f9b75cd 100644 --- a/src/webenginewidgets/api/qwebenginesettings.cpp +++ b/src/webenginewidgets/api/qwebenginesettings.cpp @@ -105,6 +105,8 @@ static WebEngineSettings::Attribute toWebEngineAttribute(QWebEngineSettings::Web return WebEngineSettings::PlaybackRequiresUserGesture; case QWebEngineSettings::WebRTCPublicInterfacesOnly: return WebEngineSettings::WebRTCPublicInterfacesOnly; + case QWebEngineSettings::JavascriptCanPaste: + return WebEngineSettings::JavascriptCanPaste; default: return WebEngineSettings::UnsupportedInCoreSettings; diff --git a/src/webenginewidgets/api/qwebenginesettings.h b/src/webenginewidgets/api/qwebenginesettings.h index 81b6c2937..1815396b6 100644 --- a/src/webenginewidgets/api/qwebenginesettings.h +++ b/src/webenginewidgets/api/qwebenginesettings.h @@ -94,6 +94,7 @@ public: ShowScrollBars, PlaybackRequiresUserGesture, WebRTCPublicInterfacesOnly, + JavascriptCanPaste, }; enum FontSize { |