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"