diff --git a/libcef/browser/osr/render_widget_host_view_osr.cc b/libcef/browser/osr/render_widget_host_view_osr.cc index 04de703ec..7db0aebbb 100644 --- a/libcef/browser/osr/render_widget_host_view_osr.cc +++ b/libcef/browser/osr/render_widget_host_view_osr.cc @@ -951,6 +951,11 @@ void CefRenderWidgetHostViewOSR::SetNeedsBeginFrames(bool enabled) { } } +void CefRenderWidgetHostViewOSR::ProcessKeyboardEvent( + const content::NativeWebKeyboardEvent& event) { + render_widget_host_->ForwardKeyboardEvent(event); +} + void CefRenderWidgetHostViewOSR::ProcessMouseEvent( const blink::WebMouseEvent& event, const ui::LatencyInfo& latency) { @@ -1175,9 +1180,10 @@ void CefRenderWidgetHostViewOSR::Invalidate( void CefRenderWidgetHostViewOSR::SendKeyEvent( const content::NativeWebKeyboardEvent& event) { TRACE_EVENT0("libcef", "CefRenderWidgetHostViewOSR::SendKeyEvent"); - if (!render_widget_host_) - return; - render_widget_host_->ForwardKeyboardEvent(event); + if (render_widget_host_ && render_widget_host_->GetView()) { + // Direct routing requires that events go directly to the View. + render_widget_host_->GetView()->ProcessKeyboardEvent(event); + } } void CefRenderWidgetHostViewOSR::SendMouseEvent( @@ -1438,12 +1444,13 @@ void CefRenderWidgetHostViewOSR::SetDeviceScaleFactor() { // Notify the guest hosts if any. for (auto guest_host_view : guest_host_views_) { - if (guest_host_view->render_widget_host() && - guest_host_view->render_widget_host()->delegate()) { - guest_host_view->render_widget_host() - ->delegate() - ->UpdateDeviceScaleFactor(new_scale_factor); - } + content::RenderWidgetHostImpl* rwhi = guest_host_view->render_widget_host(); + if (!rwhi) + continue; + if (rwhi->delegate()) + rwhi->delegate()->UpdateDeviceScaleFactor(new_scale_factor); + if (rwhi->GetView()) + rwhi->GetView()->set_current_device_scale_factor(new_scale_factor); } } @@ -1574,6 +1581,8 @@ void CefRenderWidgetHostViewOSR::RegisterGuestViewFrameSwappedCallback( base::MakeUnique(base::Bind( &CefRenderWidgetHostViewOSR::OnGuestViewFrameSwapped, weak_ptr_factory_.GetWeakPtr(), base::Unretained(guest_host_view)))); + guest_host_view->set_current_device_scale_factor( + current_device_scale_factor_); } void CefRenderWidgetHostViewOSR::OnGuestViewFrameSwapped( diff --git a/libcef/browser/osr/render_widget_host_view_osr.h b/libcef/browser/osr/render_widget_host_view_osr.h index 7d92c8295..06e35faf6 100644 --- a/libcef/browser/osr/render_widget_host_view_osr.h +++ b/libcef/browser/osr/render_widget_host_view_osr.h @@ -177,6 +177,8 @@ class CefRenderWidgetHostViewOSR : public content::RenderWidgetHostViewBase, void SetNeedsBeginFrames(bool enabled) override; + void ProcessKeyboardEvent(const content::NativeWebKeyboardEvent& event) + override; void ProcessMouseEvent(const blink::WebMouseEvent& event, const ui::LatencyInfo& latency) override; void ProcessMouseWheelEvent(const blink::WebMouseWheelEvent& event, diff --git a/patch/patch.cfg b/patch/patch.cfg index c661c56b2..0fb7b818b 100644 --- a/patch/patch.cfg +++ b/patch/patch.cfg @@ -72,6 +72,9 @@ patches = [ # # Support creation of captionless windows with resizable borders. # https://bitbucket.org/chromiumembedded/cef/issues/1749 + # + # Support configuration of RWHVGuest device scale factor. + # https://bitbucket.org/chromiumembedded/cef/issues/2078 'name': 'views_widget_180_1481_1565_1677_1749', }, { diff --git a/patch/patches/views_widget_180_1481_1565_1677_1749.patch b/patch/patches/views_widget_180_1481_1565_1677_1749.patch index 8ed6c529f..44e116bc4 100644 --- a/patch/patches/views_widget_180_1481_1565_1677_1749.patch +++ b/patch/patches/views_widget_180_1481_1565_1677_1749.patch @@ -26,7 +26,7 @@ index 8c862b6..d9394c7 100644 return renderer_frame_number_; } diff --git content/browser/renderer_host/render_widget_host_view_base.h content/browser/renderer_host/render_widget_host_view_base.h -index 3f0cdab..581b984 100644 +index 3f0cdab..b0128a1 100644 --- content/browser/renderer_host/render_widget_host_view_base.h +++ content/browser/renderer_host/render_widget_host_view_base.h @@ -73,6 +73,7 @@ class BrowserAccessibilityDelegate; @@ -37,7 +37,17 @@ index 3f0cdab..581b984 100644 class SyntheticGestureTarget; class TextInputManager; class WebCursor; -@@ -119,6 +120,8 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView, +@@ -88,6 +89,9 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView, + float current_device_scale_factor() const { + return current_device_scale_factor_; + } ++ void set_current_device_scale_factor(float scale_factor) { ++ current_device_scale_factor_ = scale_factor; ++ } + + // Returns the focused RenderWidgetHost inside this |view|'s RWH. + RenderWidgetHostImpl* GetFocusedWidget() const; +@@ -119,6 +123,8 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView, void EndFrameSubscription() override; void FocusedNodeTouched(const gfx::Point& location_dips_screen, bool editable) override; @@ -46,7 +56,7 @@ index 3f0cdab..581b984 100644 // This only needs to be overridden by RenderWidgetHostViewBase subclasses // that handle content embedded within other RenderWidgetHostViews. -@@ -353,6 +356,12 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView, +@@ -353,6 +359,12 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView, // helps to position the full screen widget on the correct monitor. virtual void InitAsFullscreen(RenderWidgetHostView* reference_host_view) = 0; @@ -59,7 +69,7 @@ index 3f0cdab..581b984 100644 // Sets the cursor to the one associated with the specified cursor_type virtual void UpdateCursor(const WebCursor& cursor) = 0; -@@ -454,6 +463,10 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView, +@@ -454,6 +466,10 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView, // destroyed before the RWHV is destroyed. TextInputManager* text_input_manager_;