diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h index d4b2974fc8ff56e9570ceacef183296476572e4b..9b454832e010390688de58291e8044db3e264406 100644 --- a/src/core/web_contents_adapter_client.h +++ b/src/core/web_contents_adapter_client.h @@ -90,6 +90,7 @@ public: uint mediaFlags; QPoint pos; QUrl linkUrl; + QUrl unfilteredLinkUrl; QUrl mediaUrl; QString linkText; QString selectedText; @@ -156,6 +157,14 @@ public: return d->linkUrl; } + void setUnfilteredLinkUrl(const QUrl &url) { + d->unfilteredLinkUrl = url; + } + + QUrl unfilteredLinkUrl() const { + return d->unfilteredLinkUrl; + } + void setLinkText(const QString &text) { d->linkText = text; } diff --git a/src/core/web_contents_view_qt.cpp b/src/core/web_contents_view_qt.cpp index 844544887c1980c6cc044ae3d96a88276468b25a..e627fa06deb0a69286e48c2a2d98a6bbbf4af633 100644 --- a/src/core/web_contents_view_qt.cpp +++ b/src/core/web_contents_view_qt.cpp @@ -164,6 +164,7 @@ static inline WebEngineContextMenuData fromParams(const content::ContextMenuPara ret.setPosition(QPoint(params.x, params.y)); ret.setLinkUrl(toQt(params.link_url)); ret.setLinkText(toQt(params.link_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); diff --git a/src/webengine/api/qquickwebenginecontextmenurequest.cpp b/src/webengine/api/qquickwebenginecontextmenurequest.cpp index df57442a11dd73a844573cd33f6972bbb2157fd0..c53e28d937908c806d054287713a566b8b99880e 100644 --- a/src/webengine/api/qquickwebenginecontextmenurequest.cpp +++ b/src/webengine/api/qquickwebenginecontextmenurequest.cpp @@ -159,11 +159,12 @@ QString QQuickWebEngineContextMenuRequest::linkText() const \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->linkUrl(); + return m_data->unfilteredLinkUrl(); } /*! diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index ab6a9c79a87ec096e2d1d08cdac7604bb293aa2f..68a290df9d973e75f79ffe6174907012f4f2fbab 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -265,10 +265,12 @@ bool QQuickWebEngineViewPrivate::contextMenuRequested(const WebEngineContextMenu ui()->addMenuItem(item, QQuickWebEngineView::tr("Unselect")); } - if (!data.linkText().isEmpty() && data.linkUrl().isValid()) { + if (!data.linkText().isEmpty() && !data.unfilteredLinkUrl().isEmpty()) { item = new MenuItemHandler(menu); QObject::connect(item, &MenuItemHandler::triggered, [q] { q->triggerWebAction(QQuickWebEngineView::CopyLinkToClipboard); }); ui()->addMenuItem(item, QQuickWebEngineView::tr("Copy Link URL")); + } + if (!data.linkText().isEmpty() && data.linkUrl().isValid()) { item = new MenuItemHandler(menu); QObject::connect(item, &MenuItemHandler::triggered, [q] { q->triggerWebAction(QQuickWebEngineView::DownloadLinkToDisk); }); ui()->addMenuItem(item, QQuickWebEngineView::tr("Save Link")); @@ -1609,14 +1611,14 @@ void QQuickWebEngineView::triggerWebAction(WebAction action) } break; case CopyLinkToClipboard: - if (d->m_contextMenuData.linkUrl().isValid()) { - QString urlString = d->m_contextMenuData.linkUrl().toString(QUrl::FullyEncoded); + if (!d->m_contextMenuData.unfilteredLinkUrl().isEmpty()) { + QString urlString = d->m_contextMenuData.unfilteredLinkUrl().toString(QUrl::FullyEncoded); QString title = d->m_contextMenuData.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_contextMenuData.linkUrl()); + data->setUrls(QList<QUrl>() << d->m_contextMenuData.unfilteredLinkUrl()); qApp->clipboard()->setMimeData(data); } break; diff --git a/src/webenginewidgets/api/qwebenginecontextmenudata.cpp b/src/webenginewidgets/api/qwebenginecontextmenudata.cpp index 5d68ed0ec4651ac0e1f8121ebdea28de465e4341..63e11175bc8a6c1f47961ef4deb3660cda0a61f2 100644 --- a/src/webenginewidgets/api/qwebenginecontextmenudata.cpp +++ b/src/webenginewidgets/api/qwebenginecontextmenudata.cpp @@ -148,10 +148,11 @@ QString QWebEngineContextMenuData::linkText() const /*! 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->linkUrl() : QUrl(); + return d ? d->unfilteredLinkUrl() : QUrl(); } /*! diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 03e5ac3f55363f5224bf25a4081ec5a298637df8..90574d60a6fcc343a4b77caa3c43fc55d7f64f60 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -1271,14 +1271,14 @@ void QWebEnginePage::triggerAction(WebAction action, bool) } break; case CopyLinkToClipboard: - if (menuData.linkUrl().isValid()) { - QString urlString = menuData.linkUrl().toString(QUrl::FullyEncoded); + if (!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.linkUrl()); + data->setUrls(QList<QUrl>() << menuData.unfilteredLinkUrl()); qApp->clipboard()->setMimeData(data); } break; @@ -1683,7 +1683,7 @@ QMenu *QWebEnginePage::createStandardContextMenu() menu->addAction(QWebEnginePage::action(Unselect)); } - if (!contextMenuData.linkText().isEmpty() && contextMenuData.linkUrl().isValid()) { + if (!contextMenuData.linkText().isEmpty() && !contextMenuData.unfilteredLinkUrl().isEmpty()) { menu->addAction(QWebEnginePage::action(CopyLinkToClipboard)); } if (contextMenuData.mediaUrl().isValid()) {