From cc6a4199225f034075751580fd5fd816cbfee6ea Mon Sep 17 00:00:00 2001
From: Valentin Fokin <fokinv@inf.u-szeged.hu>
Date: Wed, 18 Oct 2017 12:48:04 +0200
Subject: [PATCH] Fix Qt::NoContextMenu policy handling in QWebEngineView

Task-number: QTBUG-62345
Change-Id: I4846e15f007c6792ad02fc49179a6e30deafa4c7
Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu>
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
---
 src/webenginewidgets/api/qwebengineview.cpp   | 10 ++-
 .../qwebengineview/tst_qwebengineview.cpp     | 63 +++++++++++++++++++
 2 files changed, 71 insertions(+), 2 deletions(-)

diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp
index 0037f7e50..9b3f62217 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 a7f8adaf5..f46d9f455 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"
-- 
GitLab