summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJüri Valdmann <juri.valdmann@qt.io>2018-03-13 16:26:21 +0100
committerJüri Valdmann <juri.valdmann@qt.io>2018-05-30 12:50:59 +0000
commitc2e341a705b5d0aaf38e42d52e7c0283a3ec7312 (patch)
tree631479d99f85d4623d0eec240ecfba11cecba70f /src
parentea28cff7524bf0409b43c8ba3ede8fe2f7022ae4 (diff)
Fix segfault in QWebEnginePage::triggerAction
Calling triggerAction for a context-menu-specific action (like DownloadLinkToDisk), when no context menu exists, will crash. Change-Id: Ife647b7a7d8ab1a0d9dcb7d3566be130516e6e63 Reviewed-by: Kai Koehne <kai.koehne@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/webenginewidgets/api/qwebenginepage.cpp101
1 files changed, 51 insertions, 50 deletions
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index c9c307f51..10c9e586c 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -1248,7 +1248,7 @@ void QWebEnginePage::triggerAction(WebAction action, bool)
{
Q_D(QWebEnginePage);
d->ensureInitialized();
- const QtWebEngineCore::WebEngineContextMenuData &menuData = *d->contextData.d;
+ const QtWebEngineCore::WebEngineContextMenuData *menuData = d->contextData.d;
switch (action) {
case Back:
d->adapter->navigateToOffset(-1);
@@ -1290,125 +1290,126 @@ void QWebEnginePage::triggerAction(WebAction action, bool)
d->adapter->unselect();
break;
case OpenLinkInThisWindow:
- if (menuData.linkUrl().isValid())
- setUrl(menuData.linkUrl());
+ if (menuData && menuData->linkUrl().isValid())
+ setUrl(menuData->linkUrl());
break;
case OpenLinkInNewWindow:
- if (menuData.linkUrl().isValid()) {
+ if (menuData && menuData->linkUrl().isValid()) {
QWebEnginePage *newPage = createWindow(WebBrowserWindow);
if (newPage)
- newPage->setUrl(menuData.linkUrl());
+ newPage->setUrl(menuData->linkUrl());
}
break;
case OpenLinkInNewTab:
- if (menuData.linkUrl().isValid()) {
+ if (menuData && menuData->linkUrl().isValid()) {
QWebEnginePage *newPage = createWindow(WebBrowserTab);
if (newPage)
- newPage->setUrl(menuData.linkUrl());
+ newPage->setUrl(menuData->linkUrl());
}
break;
case OpenLinkInNewBackgroundTab:
- if (menuData.linkUrl().isValid()) {
+ if (menuData && menuData->linkUrl().isValid()) {
QWebEnginePage *newPage = createWindow(WebBrowserBackgroundTab);
if (newPage)
- newPage->setUrl(menuData.linkUrl());
+ newPage->setUrl(menuData->linkUrl());
}
break;
case CopyLinkToClipboard:
- if (!menuData.unfilteredLinkUrl().isEmpty()) {
- QString urlString = menuData.unfilteredLinkUrl().toString(QUrl::FullyEncoded);
- QString title = menuData.linkText().toHtmlEscaped();
+ if (menuData && !menuData->unfilteredLinkUrl().isEmpty()) {
+ QString urlString = menuData->unfilteredLinkUrl().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>() << menuData.unfilteredLinkUrl());
+ data->setUrls(QList<QUrl>() << menuData->unfilteredLinkUrl());
qApp->clipboard()->setMimeData(data);
}
break;
case DownloadLinkToDisk:
- if (menuData.linkUrl().isValid())
- d->adapter->download(menuData.linkUrl(), menuData.suggestedFileName(),
- menuData.referrerUrl(), menuData.referrerPolicy());
+ if (menuData && menuData->linkUrl().isValid())
+ d->adapter->download(menuData->linkUrl(), menuData->suggestedFileName(),
+ menuData->referrerUrl(), menuData->referrerPolicy());
break;
case CopyImageToClipboard:
- if (menuData.hasImageContent() &&
- (menuData.mediaType() == WebEngineContextMenuData::MediaTypeImage ||
- menuData.mediaType() == WebEngineContextMenuData::MediaTypeCanvas))
+ if (menuData && menuData->hasImageContent() &&
+ (menuData->mediaType() == WebEngineContextMenuData::MediaTypeImage ||
+ menuData->mediaType() == WebEngineContextMenuData::MediaTypeCanvas))
{
- d->adapter->copyImageAt(menuData.position());
+ d->adapter->copyImageAt(menuData->position());
}
break;
case CopyImageUrlToClipboard:
- if (menuData.mediaUrl().isValid() && menuData.mediaType() == WebEngineContextMenuData::MediaTypeImage) {
- QString urlString = menuData.mediaUrl().toString(QUrl::FullyEncoded);
- QString title = menuData.linkText();
+ if (menuData && 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>() << menuData.mediaUrl());
+ data->setUrls(QList<QUrl>() << menuData->mediaUrl());
qApp->clipboard()->setMimeData(data);
}
break;
case DownloadImageToDisk:
case DownloadMediaToDisk:
- if (menuData.mediaUrl().isValid())
- d->adapter->download(menuData.mediaUrl(), menuData.suggestedFileName(),
- menuData.referrerUrl(), menuData.referrerPolicy());
+ if (menuData && menuData->mediaUrl().isValid())
+ d->adapter->download(menuData->mediaUrl(), menuData->suggestedFileName(),
+ menuData->referrerUrl(), menuData->referrerPolicy());
break;
case CopyMediaUrlToClipboard:
- if (menuData.mediaUrl().isValid() &&
- (menuData.mediaType() == WebEngineContextMenuData::MediaTypeAudio ||
- menuData.mediaType() == WebEngineContextMenuData::MediaTypeVideo))
+ if (menuData && menuData->mediaUrl().isValid() &&
+ (menuData->mediaType() == WebEngineContextMenuData::MediaTypeAudio ||
+ menuData->mediaType() == WebEngineContextMenuData::MediaTypeVideo))
{
- QString urlString = menuData.mediaUrl().toString(QUrl::FullyEncoded);
+ QString urlString = menuData->mediaUrl().toString(QUrl::FullyEncoded);
QMimeData *data = new QMimeData();
data->setText(urlString);
- if (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>() << menuData.mediaUrl());
+ data->setUrls(QList<QUrl>() << menuData->mediaUrl());
qApp->clipboard()->setMimeData(data);
}
break;
case ToggleMediaControls:
- if (menuData.mediaUrl().isValid() && menuData.mediaFlags() & WebEngineContextMenuData::MediaCanToggleControls) {
- bool enable = !(menuData.mediaFlags() & WebEngineContextMenuData::MediaControls);
- d->adapter->executeMediaPlayerActionAt(menuData.position(), WebContentsAdapter::MediaPlayerControls, enable);
+ if (menuData && menuData->mediaUrl().isValid() && menuData->mediaFlags() & WebEngineContextMenuData::MediaCanToggleControls) {
+ bool enable = !(menuData->mediaFlags() & WebEngineContextMenuData::MediaControls);
+ d->adapter->executeMediaPlayerActionAt(menuData->position(), WebContentsAdapter::MediaPlayerControls, enable);
}
break;
case ToggleMediaLoop:
- if (menuData.mediaUrl().isValid() &&
- (menuData.mediaType() == WebEngineContextMenuData::MediaTypeAudio ||
- menuData.mediaType() == WebEngineContextMenuData::MediaTypeVideo))
+ 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);
+ bool enable = !(menuData->mediaFlags() & WebEngineContextMenuData::MediaLoop);
+ d->adapter->executeMediaPlayerActionAt(menuData->position(), WebContentsAdapter::MediaPlayerLoop, enable);
}
break;
case ToggleMediaPlayPause:
- if (menuData.mediaUrl().isValid() &&
- (menuData.mediaType() == WebEngineContextMenuData::MediaTypeAudio ||
- menuData.mediaType() == WebEngineContextMenuData::MediaTypeVideo))
+ 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);
+ bool enable = (menuData->mediaFlags() & WebEngineContextMenuData::MediaPaused);
+ d->adapter->executeMediaPlayerActionAt(menuData->position(), WebContentsAdapter::MediaPlayerPlay, enable);
}
break;
case ToggleMediaMute:
- if (menuData.mediaUrl().isValid() && menuData.mediaFlags() & WebEngineContextMenuData::MediaHasAudio) {
+ if (menuData && menuData->mediaUrl().isValid() && menuData->mediaFlags() & WebEngineContextMenuData::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 = !(menuData->mediaFlags() & WebEngineContextMenuData::MediaMuted);
+ d->adapter->executeMediaPlayerActionAt(menuData->position(), WebContentsAdapter::MediaPlayerMute, enable);
}
break;
case InspectElement:
- d->adapter->inspectElementAt(menuData.position());
+ if (menuData)
+ d->adapter->inspectElementAt(menuData->position());
break;
case ExitFullScreen:
// See under ViewSource, anything that can trigger a delete of the current view is dangerous to call directly here.