diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp
index 0037f7e5001c7febfbbf155f202330b7f947116e..9b3f62217f99def2c20d6dd1de4d585c7de4a12d 100644
--- a/src/webenginewidgets/api/qwebengineview.cpp
+++ b/src/webenginewidgets/api/qwebengineview.cpp
@@ -315,9 +315,15 @@ void QWebEngineView::setZoomFactor(qreal factor)
  */
 bool QWebEngineView::event(QEvent *ev)
 {
-    // We swallow spontaneous contextMenu events and synthethize those back later on when we get the
-    // HandleContextMenu callback from chromium
     if (ev->type() == QEvent::ContextMenu) {
+        if (contextMenuPolicy() == Qt::NoContextMenu) {
+            // We forward the contextMenu event to the parent widget
+            ev->ignore();
+            return false;
+        }
+
+        // We swallow spontaneous contextMenu events and synthethize those back later on when we get the
+        // HandleContextMenu callback from chromium
         ev->accept();
         return true;
     }
diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
index a7f8adaf5596690c89c099e440466018ecb98a30..f46d9f4553104f610445a40ef0eb9aa81b3c9b52 100644
--- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
+++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
@@ -37,6 +37,7 @@
 #include <QCompleter>
 #include <QLineEdit>
 #include <QHBoxLayout>
+#include <QMenu>
 #include <QQuickItem>
 #include <QQuickWidget>
 #include <QtWebEngineCore/qwebenginehttprequest.h>
@@ -174,6 +175,9 @@ private Q_SLOTS:
 #ifndef QT_NO_CLIPBOARD
     void globalMouseSelection();
 #endif
+    void noContextMenu();
+    void contextMenu_data();
+    void contextMenu();
 };
 
 // This will be called before the first test function is executed.
@@ -2354,5 +2358,64 @@ void tst_QWebEngineView::globalMouseSelection()
 }
 #endif
 
+void tst_QWebEngineView::noContextMenu()
+{
+    QWidget wrapper;
+    wrapper.setContextMenuPolicy(Qt::CustomContextMenu);
+
+    connect(&wrapper, &QWidget::customContextMenuRequested, [&wrapper](const QPoint &pt) {
+        QMenu* menu = new QMenu(&wrapper);
+        menu->addAction("Action1");
+        menu->addAction("Action2");
+        menu->popup(pt);
+    });
+
+    QWebEngineView view(&wrapper);
+    view.setContextMenuPolicy(Qt::NoContextMenu);
+    wrapper.show();
+
+    QVERIFY(view.findChildren<QMenu *>().isEmpty());
+    QVERIFY(wrapper.findChildren<QMenu *>().isEmpty());
+    QTest::mouseMove(wrapper.windowHandle(), QPoint(10,10));
+    QTest::mouseClick(wrapper.windowHandle(), Qt::RightButton);
+
+    QTRY_COMPARE(wrapper.findChildren<QMenu *>().count(), 1);
+    QVERIFY(view.findChildren<QMenu *>().isEmpty());
+}
+
+void tst_QWebEngineView::contextMenu_data()
+{
+    QTest::addColumn<int>("childrenCount");
+    QTest::addColumn<Qt::ContextMenuPolicy>("contextMenuPolicy");
+    QTest::newRow("defaultContextMenu") << 1 << Qt::DefaultContextMenu;
+    QTest::newRow("customContextMenu") << 1 << Qt::CustomContextMenu;
+    QTest::newRow("preventContextMenu") << 0 << Qt::PreventContextMenu;
+}
+
+void tst_QWebEngineView::contextMenu()
+{
+    QFETCH(int, childrenCount);
+    QFETCH(Qt::ContextMenuPolicy, contextMenuPolicy);
+
+    QWebEngineView view;
+
+    if (contextMenuPolicy == Qt::CustomContextMenu) {
+        connect(&view, &QWebEngineView::customContextMenuRequested, [&view](const QPoint &pt) {
+            QMenu* menu = new QMenu(&view);
+            menu->addAction("Action1");
+            menu->addAction("Action2");
+            menu->popup(pt);
+        });
+    }
+
+    view.setContextMenuPolicy(contextMenuPolicy);
+    view.show();
+
+    QVERIFY(view.findChildren<QMenu *>().isEmpty());
+    QTest::mouseMove(view.windowHandle(), QPoint(10,10));
+    QTest::mouseClick(view.windowHandle(), Qt::RightButton);
+    QTRY_COMPARE(view.findChildren<QMenu *>().count(), childrenCount);
+}
+
 QTEST_MAIN(tst_QWebEngineView)
 #include "tst_qwebengineview.moc"