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()) {