Fix PDF rendering with OSR (issue #1689)
This commit is contained in:
parent
c9e81c082f
commit
5ec98243a9
|
@ -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::Closure>(
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<CefBrowserHostImpl> browser_impl() const { return browser_impl_; }
|
||||
void set_browser_impl(CefRefPtr<CefBrowserHostImpl> 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;
|
||||
|
||||
|
|
|
@ -139,10 +139,13 @@ content::RenderWidgetHostViewBase* CefWebContentsViewOSR::CreateViewForWidget(
|
|||
embedder_host_view);
|
||||
embedder_host_view->AddGuestHostView(platform_widget);
|
||||
|
||||
return content::RenderWidgetHostViewGuest::Create(
|
||||
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,
|
||||
|
|
Loading…
Reference in New Issue