From a906bdd2e3843b3afaf09c7eb49c2ef56c434ed7 Mon Sep 17 00:00:00 2001 From: Marshall Greenblatt Date: Fri, 30 Jun 2017 16:30:30 -0400 Subject: [PATCH] Fix OSR PDF mouse events after keyboard input (issue #2078) --- .../osr/render_widget_host_view_osr.cc | 33 ++++++++++++++----- .../browser/osr/render_widget_host_view_osr.h | 2 ++ patch/patch.cfg | 3 ++ ...views_widget_180_1481_1565_1677_1749.patch | 18 +++++++--- 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/libcef/browser/osr/render_widget_host_view_osr.cc b/libcef/browser/osr/render_widget_host_view_osr.cc index 40e86be4d..0cfac6d96 100644 --- a/libcef/browser/osr/render_widget_host_view_osr.cc +++ b/libcef/browser/osr/render_widget_host_view_osr.cc @@ -935,6 +935,12 @@ void CefRenderWidgetHostViewOSR::SetNeedsBeginFrames(bool enabled) { } } +void CefRenderWidgetHostViewOSR::ProcessKeyboardEvent( + const content::NativeWebKeyboardEvent& event, + const ui::LatencyInfo& latency) { + render_widget_host_->ForwardKeyboardEventWithLatencyInfo(event, latency); +} + void CefRenderWidgetHostViewOSR::ProcessMouseEvent( const blink::WebMouseEvent& event, const ui::LatencyInfo& latency) { @@ -1159,9 +1165,15 @@ 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, ui::LatencyInfo(event.GetType() == blink::WebInputEvent::kChar || + event.GetType() == + blink::WebInputEvent::kRawKeyDown + ? ui::SourceEventType::KEY_PRESS + : ui::SourceEventType::OTHER)); + } } void CefRenderWidgetHostViewOSR::SendMouseEvent( @@ -1422,12 +1434,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); } } @@ -1558,6 +1571,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 e1ab48ff7..a7ff243e5 100644 --- a/libcef/browser/osr/render_widget_host_view_osr.h +++ b/libcef/browser/osr/render_widget_host_view_osr.h @@ -178,6 +178,8 @@ class CefRenderWidgetHostViewOSR : public content::RenderWidgetHostViewBase, void SetNeedsBeginFrames(bool enabled) override; + void ProcessKeyboardEvent(const content::NativeWebKeyboardEvent& event, + const ui::LatencyInfo& latency) 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 9f7ad3aee..3552d8f1f 100644 --- a/patch/patch.cfg +++ b/patch/patch.cfg @@ -69,6 +69,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 7b08cae86..f792a0758 100644 --- a/patch/patches/views_widget_180_1481_1565_1677_1749.patch +++ b/patch/patches/views_widget_180_1481_1565_1677_1749.patch @@ -18,7 +18,7 @@ index 98460d7..ffbfa04f 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 fd1e999..c4dad6d 100644 +index fd1e999..0e794a9 100644 --- content/browser/renderer_host/render_widget_host_view_base.h +++ content/browser/renderer_host/render_widget_host_view_base.h @@ -72,6 +72,7 @@ class BrowserAccessibilityDelegate; @@ -29,7 +29,17 @@ index fd1e999..c4dad6d 100644 class SyntheticGestureTarget; class TextInputManager; class TouchSelectionControllerClientManager; -@@ -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; @@ -38,7 +48,7 @@ index fd1e999..c4dad6d 100644 // This only needs to be overridden by RenderWidgetHostViewBase subclasses // that handle content embedded within other RenderWidgetHostViews. -@@ -359,6 +362,12 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView, +@@ -359,6 +365,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; @@ -51,7 +61,7 @@ index fd1e999..c4dad6d 100644 // Sets the cursor to the one associated with the specified cursor_type virtual void UpdateCursor(const WebCursor& cursor) = 0; -@@ -473,6 +482,10 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView, +@@ -473,6 +485,10 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView, const bool wheel_scroll_latching_enabled_;