diff options
author | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2016-02-12 11:22:41 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2016-03-30 12:35:46 +0000 |
commit | 6454b6b2d0f2fbb8d140fa2555af7867964748ce (patch) | |
tree | e2d209aa02aca0bbc93fd58379524acc69e8b544 /src/webenginewidgets/api/qwebenginepage.cpp | |
parent | 3e30c0a33e301bb993efc7a046a34c8cbc68ca58 (diff) |
Add API for context menu data
For QWebEnginePage users to be able to make custom context menu or
extend the default context menu, they need information about the
context.
This patch adds a QWebEngineContextMenuData class that contains
contextual information when a context menu is being requested.
This is also means we can finally generate a custom context-menu in
the demobrowser the same way we did in QtWebKit.
Task-number: QTBUG-51079
Change-Id: I695b8cbf648bdc7f119b0ed51ab685cf2f8de8e4
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@theqtcompany.com>
Diffstat (limited to 'src/webenginewidgets/api/qwebenginepage.cpp')
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.cpp | 119 |
1 files changed, 67 insertions, 52 deletions
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 7f7cba431..cb0359195 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -896,6 +896,7 @@ QAction *QWebEnginePage::action(WebAction action) const void QWebEnginePage::triggerAction(WebAction action, bool) { Q_D(QWebEnginePage); + const QtWebEngineCore::WebEngineContextMenuData &menuData = *d->contextData.d; switch (action) { case Back: d->adapter->navigateToOffset(-1); @@ -937,122 +938,122 @@ void QWebEnginePage::triggerAction(WebAction action, bool) d->adapter->unselect(); break; case OpenLinkInThisWindow: - if (d->m_menuData.linkUrl.isValid()) - setUrl(d->m_menuData.linkUrl); + if (menuData.linkUrl.isValid()) + setUrl(menuData.linkUrl); break; case OpenLinkInNewWindow: - if (d->m_menuData.linkUrl.isValid()) { + if (menuData.linkUrl.isValid()) { QWebEnginePage *newPage = createWindow(WebBrowserWindow); if (newPage) - newPage->setUrl(d->m_menuData.linkUrl); + newPage->setUrl(menuData.linkUrl); } break; case OpenLinkInNewTab: - if (d->m_menuData.linkUrl.isValid()) { + if (menuData.linkUrl.isValid()) { QWebEnginePage *newPage = createWindow(WebBrowserTab); if (newPage) - newPage->setUrl(d->m_menuData.linkUrl); + newPage->setUrl(menuData.linkUrl); } break; case OpenLinkInNewBackgroundTab: - if (d->m_menuData.linkUrl.isValid()) { + if (menuData.linkUrl.isValid()) { QWebEnginePage *newPage = createWindow(WebBrowserBackgroundTab); if (newPage) - newPage->setUrl(d->m_menuData.linkUrl); + newPage->setUrl(menuData.linkUrl); } break; case CopyLinkToClipboard: - if (d->m_menuData.linkUrl.isValid()) { - QString urlString = d->m_menuData.linkUrl.toString(QUrl::FullyEncoded); - QString title = d->m_menuData.linkText.toHtmlEscaped(); + if (menuData.linkUrl.isValid()) { + QString urlString = menuData.linkUrl.toString(QUrl::FullyEncoded); + QString title = menuData.linkText.toHtmlEscaped(); QMimeData *data = new QMimeData(); data->setText(urlString); QString html = QStringLiteral("<a href=\"") + urlString + QStringLiteral("\">") + title + QStringLiteral("</a>"); data->setHtml(html); - data->setUrls(QList<QUrl>() << d->m_menuData.linkUrl); + data->setUrls(QList<QUrl>() << menuData.linkUrl); qApp->clipboard()->setMimeData(data); } break; case DownloadLinkToDisk: - if (d->m_menuData.linkUrl.isValid()) - d->adapter->download(d->m_menuData.linkUrl, d->m_menuData.suggestedFileName); + if (menuData.linkUrl.isValid()) + d->adapter->download(menuData.linkUrl, menuData.suggestedFileName); break; case CopyImageToClipboard: - if (d->m_menuData.hasImageContent && - (d->m_menuData.mediaType == WebEngineContextMenuData::MediaTypeImage || - d->m_menuData.mediaType == WebEngineContextMenuData::MediaTypeCanvas)) + if (menuData.hasImageContent && + (menuData.mediaType == WebEngineContextMenuData::MediaTypeImage || + menuData.mediaType == WebEngineContextMenuData::MediaTypeCanvas)) { - d->adapter->copyImageAt(d->m_menuData.pos); + d->adapter->copyImageAt(menuData.pos); } break; case CopyImageUrlToClipboard: - if (d->m_menuData.mediaUrl.isValid() && d->m_menuData.mediaType == WebEngineContextMenuData::MediaTypeImage) { - QString urlString = d->m_menuData.mediaUrl.toString(QUrl::FullyEncoded); - QString title = d->m_menuData.linkText; + if (menuData.mediaUrl.isValid() && menuData.mediaType == WebEngineContextMenuData::MediaTypeImage) { + QString urlString = menuData.mediaUrl.toString(QUrl::FullyEncoded); + QString title = menuData.linkText; if (!title.isEmpty()) title = QStringLiteral(" alt=\"%1\"").arg(title.toHtmlEscaped()); QMimeData *data = new QMimeData(); data->setText(urlString); QString html = QStringLiteral("<img src=\"") + urlString + QStringLiteral("\"") + title + QStringLiteral("></img>"); data->setHtml(html); - data->setUrls(QList<QUrl>() << d->m_menuData.mediaUrl); + data->setUrls(QList<QUrl>() << menuData.mediaUrl); qApp->clipboard()->setMimeData(data); } break; case DownloadImageToDisk: case DownloadMediaToDisk: - if (d->m_menuData.mediaUrl.isValid()) - d->adapter->download(d->m_menuData.mediaUrl, d->m_menuData.suggestedFileName); + if (menuData.mediaUrl.isValid()) + d->adapter->download(menuData.mediaUrl, menuData.suggestedFileName); break; case CopyMediaUrlToClipboard: - if (d->m_menuData.mediaUrl.isValid() && - (d->m_menuData.mediaType == WebEngineContextMenuData::MediaTypeAudio || - d->m_menuData.mediaType == WebEngineContextMenuData::MediaTypeVideo)) + if (menuData.mediaUrl.isValid() && + (menuData.mediaType == WebEngineContextMenuData::MediaTypeAudio || + menuData.mediaType == WebEngineContextMenuData::MediaTypeVideo)) { - QString urlString = d->m_menuData.mediaUrl.toString(QUrl::FullyEncoded); + QString urlString = menuData.mediaUrl.toString(QUrl::FullyEncoded); QMimeData *data = new QMimeData(); data->setText(urlString); - if (d->m_menuData.mediaType == WebEngineContextMenuData::MediaTypeAudio) + if (menuData.mediaType == WebEngineContextMenuData::MediaTypeAudio) data->setHtml(QStringLiteral("<audio src=\"") + urlString + QStringLiteral("\"></audio>")); else data->setHtml(QStringLiteral("<video src=\"") + urlString + QStringLiteral("\"></video>")); - data->setUrls(QList<QUrl>() << d->m_menuData.mediaUrl); + data->setUrls(QList<QUrl>() << menuData.mediaUrl); qApp->clipboard()->setMimeData(data); } break; case ToggleMediaControls: - if (d->m_menuData.mediaUrl.isValid() && d->m_menuData.mediaFlags & WebEngineContextMenuData::MediaCanToggleControls) { - bool enable = !(d->m_menuData.mediaFlags & WebEngineContextMenuData::MediaControls); - d->adapter->executeMediaPlayerActionAt(d->m_menuData.pos, WebContentsAdapter::MediaPlayerControls, enable); + if (menuData.mediaUrl.isValid() && menuData.mediaFlags & WebEngineContextMenuData::MediaCanToggleControls) { + bool enable = !(menuData.mediaFlags & WebEngineContextMenuData::MediaControls); + d->adapter->executeMediaPlayerActionAt(menuData.pos, WebContentsAdapter::MediaPlayerControls, enable); } break; case ToggleMediaLoop: - if (d->m_menuData.mediaUrl.isValid() && - (d->m_menuData.mediaType == WebEngineContextMenuData::MediaTypeAudio || - d->m_menuData.mediaType == WebEngineContextMenuData::MediaTypeVideo)) + if (menuData.mediaUrl.isValid() && + (menuData.mediaType == WebEngineContextMenuData::MediaTypeAudio || + menuData.mediaType == WebEngineContextMenuData::MediaTypeVideo)) { - bool enable = !(d->m_menuData.mediaFlags & WebEngineContextMenuData::MediaLoop); - d->adapter->executeMediaPlayerActionAt(d->m_menuData.pos, WebContentsAdapter::MediaPlayerLoop, enable); + bool enable = !(menuData.mediaFlags & WebEngineContextMenuData::MediaLoop); + d->adapter->executeMediaPlayerActionAt(menuData.pos, WebContentsAdapter::MediaPlayerLoop, enable); } break; case ToggleMediaPlayPause: - if (d->m_menuData.mediaUrl.isValid() && - (d->m_menuData.mediaType == WebEngineContextMenuData::MediaTypeAudio || - d->m_menuData.mediaType == WebEngineContextMenuData::MediaTypeVideo)) + if (menuData.mediaUrl.isValid() && + (menuData.mediaType == WebEngineContextMenuData::MediaTypeAudio || + menuData.mediaType == WebEngineContextMenuData::MediaTypeVideo)) { - bool enable = (d->m_menuData.mediaFlags & WebEngineContextMenuData::MediaPaused); - d->adapter->executeMediaPlayerActionAt(d->m_menuData.pos, WebContentsAdapter::MediaPlayerPlay, enable); + bool enable = (menuData.mediaFlags & WebEngineContextMenuData::MediaPaused); + d->adapter->executeMediaPlayerActionAt(menuData.pos, WebContentsAdapter::MediaPlayerPlay, enable); } break; case ToggleMediaMute: - if (d->m_menuData.mediaUrl.isValid() && d->m_menuData.mediaFlags & WebEngineContextMenuData::MediaHasAudio) { + if (menuData.mediaUrl.isValid() && menuData.mediaFlags & WebEngineContextMenuData::MediaHasAudio) { // Make sure to negate the value, so that toggling actually works. - bool enable = !(d->m_menuData.mediaFlags & WebEngineContextMenuData::MediaMuted); - d->adapter->executeMediaPlayerActionAt(d->m_menuData.pos, WebContentsAdapter::MediaPlayerMute, enable); + bool enable = !(menuData.mediaFlags & WebEngineContextMenuData::MediaMuted); + d->adapter->executeMediaPlayerActionAt(menuData.pos, WebContentsAdapter::MediaPlayerMute, enable); } break; case InspectElement: - d->adapter->inspectElementAt(d->m_menuData.pos); + d->adapter->inspectElementAt(menuData.pos); break; case ExitFullScreen: d->adapter->exitFullScreen(); @@ -1114,13 +1115,13 @@ bool QWebEnginePagePrivate::contextMenuRequested(const WebEngineContextMenuData if (!view || !view->d_func()->m_pendingContextMenuEvent) return false; - m_menuData = WebEngineContextMenuData(); + contextData.reset(); QContextMenuEvent event(QContextMenuEvent::Mouse, data.pos, view->mapToGlobal(data.pos)); switch (view->contextMenuPolicy()) { case Qt::PreventContextMenu: return false; case Qt::DefaultContextMenu: - m_menuData = data; + contextData = data; view->contextMenuEvent(&event); break; case Qt::CustomContextMenu: @@ -1258,7 +1259,7 @@ QMenu *QWebEnginePage::createStandardContextMenu() Q_D(QWebEnginePage); QMenu *menu = new QMenu(d->view); QAction *action = 0; - WebEngineContextMenuData contextMenuData(d->m_menuData); + const WebEngineContextMenuData &contextMenuData = *d->contextData.d; #if !defined(QT_NO_SPELLCHECK) if (contextMenuData.isEditable && !contextMenuData.spellCheckerSuggestions.isEmpty()) { @@ -1319,9 +1320,9 @@ QMenu *QWebEnginePage::createStandardContextMenu() menu->addAction(QWebEnginePage::action(CopyMediaUrlToClipboard)); menu->addAction(QWebEnginePage::action(ToggleMediaPlayPause)); menu->addAction(QWebEnginePage::action(ToggleMediaLoop)); - if (d->m_menuData.mediaFlags & WebEngineContextMenuData::MediaHasAudio) + if (contextMenuData.mediaFlags & WebEngineContextMenuData::MediaHasAudio) menu->addAction(QWebEnginePage::action(ToggleMediaMute)); - if (d->m_menuData.mediaFlags & WebEngineContextMenuData::MediaCanToggleControls) + if (contextMenuData.mediaFlags & WebEngineContextMenuData::MediaCanToggleControls) menu->addAction(QWebEnginePage::action(ToggleMediaControls)); break; default: @@ -1672,6 +1673,20 @@ void QWebEnginePage::printToPdf(const QPageLayout &pageLayout, const QWebEngineC d->m_callbacks.registerCallback(requestId, resultCallback); } +/*! + \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; +} + QT_END_NAMESPACE #include "moc_qwebenginepage.cpp" |