From 0f944cdc55fad8a4f68e6a3e353338ea9f6f8e89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Riku=20Palom=C3=A4ki?= Date: Wed, 8 Jan 2020 12:32:05 +0000 Subject: [PATCH] Fix routing of OSR input events inside iframes (fixes issue #2789) Mouse events need to be routed to the correct view and CefRenderWidgetHostViewOSR::TransformPointToCoordSpaceForView needs to be properly implemented for RenderWidgetHostInputEventRouter::DispatchTouchscreenGestureEvent to transform event position in the target widget. --- .../osr/render_widget_host_view_osr.cc | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/libcef/browser/osr/render_widget_host_view_osr.cc b/libcef/browser/osr/render_widget_host_view_osr.cc index 39c27f919..5f01b6d38 100644 --- a/libcef/browser/osr/render_widget_host_view_osr.cc +++ b/libcef/browser/osr/render_widget_host_view_osr.cc @@ -851,7 +851,8 @@ bool CefRenderWidgetHostViewOSR::TransformPointToCoordSpaceForView( return true; } - return false; + return target_view->TransformPointToLocalCoordSpace( + point, GetCurrentSurfaceId(), transformed_point); } void CefRenderWidgetHostViewOSR::DidNavigate() { @@ -1021,9 +1022,17 @@ void CefRenderWidgetHostViewOSR::SendMouseEvent( } if (render_widget_host_ && render_widget_host_->GetView()) { - // Direct routing requires that mouse events go directly to the View. - render_widget_host_->GetView()->ProcessMouseEvent( - event, ui::LatencyInfo(ui::SourceEventType::OTHER)); + if (ShouldRouteEvents()) { + // RouteMouseEvent wants non-const pointer to WebMouseEvent, but it only + // forwards it to RenderWidgetTargeter::FindTargetAndDispatch as a const + // reference, so const_cast here is safe. + render_widget_host_->delegate()->GetInputEventRouter()->RouteMouseEvent( + this, const_cast(&event), + ui::LatencyInfo(ui::SourceEventType::OTHER)); + } else { + render_widget_host_->GetView()->ProcessMouseEvent( + event, ui::LatencyInfo(ui::SourceEventType::OTHER)); + } } } @@ -1092,9 +1101,16 @@ void CefRenderWidgetHostViewOSR::SendMouseWheelEvent( } if (render_widget_host_ && render_widget_host_->GetView()) { - // Direct routing requires that mouse events go directly to the View. - render_widget_host_->GetView()->ProcessMouseWheelEvent( - mouse_wheel_event, ui::LatencyInfo(ui::SourceEventType::WHEEL)); + if (ShouldRouteEvents()) { + render_widget_host_->delegate() + ->GetInputEventRouter() + ->RouteMouseWheelEvent( + this, const_cast(&mouse_wheel_event), + ui::LatencyInfo(ui::SourceEventType::WHEEL)); + } else { + render_widget_host_->GetView()->ProcessMouseWheelEvent( + mouse_wheel_event, ui::LatencyInfo(ui::SourceEventType::WHEEL)); + } } }