diff --git a/libcef/browser/osr/render_widget_host_view_osr.cc b/libcef/browser/osr/render_widget_host_view_osr.cc index 9f5414e75..6ed77198d 100644 --- a/libcef/browser/osr/render_widget_host_view_osr.cc +++ b/libcef/browser/osr/render_widget_host_view_osr.cc @@ -23,6 +23,7 @@ #include "components/display_compositor/gl_helper.h" #include "content/browser/bad_message.h" #include "content/browser/compositor/image_transport_factory.h" +#include "content/browser/frame_host/render_widget_host_view_guest.h" #include "content/browser/renderer_host/dip_util.h" #include "content/browser/renderer_host/render_widget_host_delegate.h" #include "content/browser/renderer_host/render_widget_host_impl.h" @@ -472,6 +473,7 @@ CefRenderWidgetHostViewOSR::CefRenderWidgetHostViewOSR( #endif weak_ptr_factory_(this) { DCHECK(render_widget_host_); + DCHECK(!render_widget_host_->GetView()); render_widget_host_->SetView(this); // CefBrowserHostImpl might not be created at this time for popups. @@ -1154,13 +1156,7 @@ void CefRenderWidgetHostViewOSR::Invalidate( return; } - const gfx::Rect& bounds_in_pixels = gfx::Rect(GetPhysicalBackingSize()); - - if (software_output_device_) { - software_output_device_->OnPaint(bounds_in_pixels); - } else if (copy_frame_generator_.get()) { - copy_frame_generator_->GenerateCopyFrame(true, bounds_in_pixels); - } + InvalidateInternal(gfx::Rect(GetPhysicalBackingSize())); } void CefRenderWidgetHostViewOSR::SendKeyEvent( @@ -1314,6 +1310,14 @@ void CefRenderWidgetHostViewOSR::RemoveGuestHostView( guest_host_views_.erase(guest_host); } +void CefRenderWidgetHostViewOSR::RegisterGuestViewFrameSwappedCallback( + content::RenderWidgetHostViewGuest* guest_host_view) { + guest_host_view->RegisterFrameSwappedCallback(base::MakeUnique( + base::Bind(&CefRenderWidgetHostViewOSR::OnGuestViewFrameSwapped, + weak_ptr_factory_.GetWeakPtr(), + base::Unretained(guest_host_view)))); +} + #if !defined(OS_MACOSX) ui::Compositor* CefRenderWidgetHostViewOSR::GetCompositor() const { @@ -1495,3 +1499,20 @@ void CefRenderWidgetHostViewOSR::OnScrollOffsetChanged() { } is_scroll_offset_changed_pending_ = false; } + +void CefRenderWidgetHostViewOSR::OnGuestViewFrameSwapped( + content::RenderWidgetHostViewGuest* guest_host_view) { + InvalidateInternal( + gfx::ConvertRectToPixel(scale_factor_, guest_host_view->GetViewBounds())); + + RegisterGuestViewFrameSwappedCallback(guest_host_view); +} + +void CefRenderWidgetHostViewOSR::InvalidateInternal( + const gfx::Rect& bounds_in_pixels) { + if (software_output_device_) { + software_output_device_->OnPaint(bounds_in_pixels); + } else if (copy_frame_generator_.get()) { + copy_frame_generator_->GenerateCopyFrame(true, bounds_in_pixels); + } +} diff --git a/libcef/browser/osr/render_widget_host_view_osr.h b/libcef/browser/osr/render_widget_host_view_osr.h index c72f60aa8..43f6881f8 100644 --- a/libcef/browser/osr/render_widget_host_view_osr.h +++ b/libcef/browser/osr/render_widget_host_view_osr.h @@ -34,6 +34,7 @@ namespace content { class RenderWidgetHost; class RenderWidgetHostImpl; +class RenderWidgetHostViewGuest; class BackingStore; } @@ -249,6 +250,11 @@ class CefRenderWidgetHostViewOSR void AddGuestHostView(CefRenderWidgetHostViewOSR* guest_host); void RemoveGuestHostView(CefRenderWidgetHostViewOSR* guest_host); + // Register a callback that will be executed when |guest_host_view| receives + // OnSwapCompositorFrame. The callback triggers repaint of the embedder view. + void RegisterGuestViewFrameSwappedCallback( + content::RenderWidgetHostViewGuest* guest_host_view); + CefRefPtr browser_impl() const { return browser_impl_; } void set_browser_impl(CefRefPtr browser) { browser_impl_ = browser; @@ -282,6 +288,11 @@ class CefRenderWidgetHostViewOSR void OnScrollOffsetChanged(); + void OnGuestViewFrameSwapped( + content::RenderWidgetHostViewGuest* guest_host_view); + + void InvalidateInternal(const gfx::Rect& bounds_in_pixels); + #if defined(OS_MACOSX) friend class MacHelper; diff --git a/libcef/browser/osr/web_contents_view_osr.cc b/libcef/browser/osr/web_contents_view_osr.cc index 944a95919..c39a29c51 100644 --- a/libcef/browser/osr/web_contents_view_osr.cc +++ b/libcef/browser/osr/web_contents_view_osr.cc @@ -139,10 +139,13 @@ content::RenderWidgetHostViewBase* CefWebContentsViewOSR::CreateViewForWidget( embedder_host_view); embedder_host_view->AddGuestHostView(platform_widget); - return content::RenderWidgetHostViewGuest::Create( - render_widget_host, - guest_, - platform_widget->GetWeakPtr()); + content::RenderWidgetHostViewGuest* guest_host_view = + content::RenderWidgetHostViewGuest::Create( + render_widget_host, + guest_, + platform_widget->GetWeakPtr()); + embedder_host_view->RegisterGuestViewFrameSwappedCallback(guest_host_view); + return guest_host_view; } view_ = new CefRenderWidgetHostViewOSR(transparent_, render_widget_host,