diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp
index ab9fb66fb1c3e4bbe8980f3ec91d2b0bba1190eb..96cddfb4b447d7624374663fbf63bd915b534c51 100644
--- a/src/core/render_widget_host_view_qt.cpp
+++ b/src/core/render_widget_host_view_qt.cpp
@@ -905,6 +905,9 @@ bool RenderWidgetHostViewQt::forwardEvent(QEvent *event)
     case QEvent::TouchCancel:
         handleTouchEvent(static_cast<QTouchEvent*>(event));
         break;
+    case QEvent::NativeGesture:
+        handleGestureEvent(static_cast<QNativeGestureEvent *>(event));
+        break;
     case QEvent::HoverEnter:
     case QEvent::HoverLeave:
     case QEvent::HoverMove:
@@ -1295,8 +1298,24 @@ void RenderWidgetHostViewQt::clearPreviousTouchMotionState()
     m_touchMotionStarted = false;
 }
 
+void RenderWidgetHostViewQt::handleGestureEvent(QNativeGestureEvent *ev)
+{
+    const Qt::NativeGestureType type = ev->gestureType();
+    // These are the only supported gestures by Chromium so far.
+    if (type == Qt::ZoomNativeGesture || type == Qt::SmartZoomNativeGesture) {
+        m_host->ForwardGestureEvent(WebEventFactory::toWebGestureEvent(
+                                        ev,
+                                        static_cast<double>(dpiScale())));
+    }
+}
+
 void RenderWidgetHostViewQt::handleTouchEvent(QTouchEvent *ev)
 {
+    // On macOS instead of handling touch events, we use the OS provided QNativeGestureEvents.
+#ifdef Q_OS_MACOS
+    return;
+#endif
+
     // Chromium expects the touch event timestamps to be comparable to base::TimeTicks::Now().
     // Most importantly we also have to preserve the relative time distance between events.
     // Calculate a delta between event timestamps and Now() on the first received event, and
diff --git a/src/core/render_widget_host_view_qt.h b/src/core/render_widget_host_view_qt.h
index 304fa0e1aefb693b060de5e77f791edd2d14be9a..09e027497d3ea4ce8da5b56309ae2d5368d387d0 100644
--- a/src/core/render_widget_host_view_qt.h
+++ b/src/core/render_widget_host_view_qt.h
@@ -189,6 +189,7 @@ public:
     void handleKeyEvent(QKeyEvent*);
     void handleWheelEvent(QWheelEvent*);
     void handleTouchEvent(QTouchEvent*);
+    void handleGestureEvent(QNativeGestureEvent *);
     void handleHoverEvent(QHoverEvent*);
     void handleFocusEvent(QFocusEvent*);
     void handleInputMethodEvent(QInputMethodEvent*);
diff --git a/src/core/web_event_factory.cpp b/src/core/web_event_factory.cpp
index 2cd15aa58f1c71cfde1d59bcd8127fb1f788b8d7..a7df934e41e2df604d7ac7a8d84f50dadbadde06 100644
--- a/src/core/web_event_factory.cpp
+++ b/src/core/web_event_factory.cpp
@@ -1212,6 +1212,43 @@ WebMouseEvent WebEventFactory::toWebMouseEvent(QHoverEvent *ev, double dpiScale)
     return webKitEvent;
 }
 
+WebGestureEvent WebEventFactory::toWebGestureEvent(QNativeGestureEvent *ev, double dpiScale)
+{
+    WebGestureEvent webKitEvent;
+    webKitEvent.timeStampSeconds = currentTimeForEvent(ev);
+    webKitEvent.modifiers = modifiersForEvent(ev);
+
+    webKitEvent.x = static_cast<int>(ev->localPos().x() / dpiScale);
+    webKitEvent.y = static_cast<int>(ev->localPos().y() / dpiScale);
+
+    webKitEvent.globalX = static_cast<int>(ev->screenPos().x() / dpiScale);
+    webKitEvent.globalY = static_cast<int>(ev->screenPos().y() / dpiScale);
+
+    webKitEvent.sourceDevice = blink::WebGestureDeviceTouchpad;
+
+    Qt::NativeGestureType gestureType = ev->gestureType();
+    switch (gestureType) {
+    case Qt::ZoomNativeGesture:
+        webKitEvent.type = WebInputEvent::GesturePinchUpdate;
+        webKitEvent.data.pinchUpdate.scale = static_cast<float>(ev->value() + 1.0);
+        break;
+    case Qt::SmartZoomNativeGesture:
+        webKitEvent.type = WebInputEvent::GestureDoubleTap;
+        webKitEvent.data.tap.tapCount = 1;
+        break;
+    case Qt::BeginNativeGesture:
+    case Qt::EndNativeGesture:
+    case Qt::RotateNativeGesture:
+    case Qt::PanNativeGesture:
+    case Qt::SwipeNativeGesture:
+        // Not implemented by Chromium for now.
+        webKitEvent.type = blink::WebInputEvent::Undefined;
+        break;
+    }
+
+    return webKitEvent;
+}
+
 blink::WebMouseWheelEvent WebEventFactory::toWebWheelEvent(QWheelEvent *ev, double dpiScale)
 {
     WebMouseWheelEvent webEvent;
diff --git a/src/core/web_event_factory.h b/src/core/web_event_factory.h
index c9871a4b97d55a15a5268e8c3676cad43a94d582..d82113db36de9c6ae02e7072fd7c305f7f09fb59 100644
--- a/src/core/web_event_factory.h
+++ b/src/core/web_event_factory.h
@@ -42,6 +42,7 @@
 
 #include "content/public/browser/native_web_keyboard_event.h"
 #include "third_party/WebKit/public/platform/WebInputEvent.h"
+#include "third_party/WebKit/public/platform/WebGestureEvent.h"
 
 #include <QtGlobal>
 
@@ -50,6 +51,7 @@ class QHoverEvent;
 class QKeyEvent;
 class QMouseEvent;
 class QWheelEvent;
+class QNativeGestureEvent;
 QT_END_NAMESPACE
 
 class WebEventFactory {
@@ -57,6 +59,7 @@ class WebEventFactory {
 public:
     static blink::WebMouseEvent toWebMouseEvent(QMouseEvent*, double dpiScale);
     static blink::WebMouseEvent toWebMouseEvent(QHoverEvent*, double dpiScale);
+    static blink::WebGestureEvent toWebGestureEvent(QNativeGestureEvent *, double dpiScale);
     static blink::WebMouseWheelEvent toWebWheelEvent(QWheelEvent*, double dpiScale);
     static content::NativeWebKeyboardEvent toWebKeyboardEvent(QKeyEvent*);
 };
diff --git a/src/webengine/render_widget_host_view_qt_delegate_quick.cpp b/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
index 4e4fc406fde7266620520ff011c8beb44db972b9..b3348b43e4ceef57ee873669ab02bdd72e940b5e 100644
--- a/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
+++ b/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
@@ -247,6 +247,9 @@ bool RenderWidgetHostViewQtDelegateQuick::event(QEvent *event)
         }
     }
 
+    if (event->type() == QEvent::NativeGesture)
+        return m_client->forwardEvent(event);
+
     return QQuickItem::event(event);
 }